10
10
#include "common/sys.h"
11
11
#include "common/device.h"
12
12
#include "common/pproc.h"
13
-
14
- #include <errno.h>
15
- #include <dirent.h>
13
+ #include "common/fs_stream.h"
14
+ #include "common/fs_serial.h"
16
15
17
16
#if USE_TERM_IO
18
17
#include <sys/time.h>
19
18
#include <termios.h>
20
19
#include <unistd.h>
21
- #endif
22
-
23
- typedef int FileHand ;
24
-
25
- #include "common/fs_stream.h"
26
- #include "common/fs_serial.h"
20
+ #include <sys/select.h>
21
+ #include <errno.h>
27
22
28
- /*
29
- */
30
- int serial_open (dev_file_t * f ) {
31
- #if USE_TERM_IO
32
- // /////////////////////////////////////////////////////////////////////////////////////////
33
- // Unix
23
+ int serial_open (dev_file_t * f ) {
34
24
sprintf (f -> name , "/dev/ttyS%d" , f -> port );
35
25
36
26
f -> handle = open (f -> name , O_RDWR | O_NOCTTY );
37
- if (f -> handle < 0 )
38
- err_file ((f -> last_error = errno ));
39
-
40
- tcgetattr (f -> handle , & f -> oldtio ); /* save current port settings */
27
+ if (f -> handle < 0 ) {
28
+ err_file ((f -> last_error = errno ));
29
+ }
30
+ // save current port settings
31
+ tcgetattr (f -> handle , & f -> oldtio );
41
32
bzero (& f -> newtio , sizeof (f -> newtio ));
42
33
f -> newtio .c_cflag = f -> devspeed | CRTSCTS | CS8 | CLOCAL | CREAD ;
43
34
f -> newtio .c_iflag = IGNPAR ;
44
35
f -> newtio .c_oflag = 0 ;
45
36
46
- /*
47
- * set input mode (non-canonical, no echo,...)
48
- */
37
+ // set input mode (non-canonical, no echo,...)
49
38
f -> newtio .c_lflag = 0 ;
50
- f -> newtio .c_cc [VTIME ] = 0 ; /* inter-character timer unused */
51
- f -> newtio .c_cc [VMIN ] = 1 ; /* blocking read until 1 char received */
39
+ f -> newtio .c_cc [VTIME ] = 0 ; // inter-character timer unused
40
+ f -> newtio .c_cc [VMIN ] = 1 ; // blocking read until 1 char received
52
41
tcflush (f -> handle , TCIFLUSH );
53
42
tcsetattr (f -> handle , TCSANOW , & f -> newtio );
54
43
return (f -> handle >= 0 );
44
+ }
55
45
56
- #elif defined(_Win32 ) || defined(__CYGWIN__ )
57
- // /////////////////////////////////////////////////////////////////////////////////////////
58
- // Win32
46
+ int serial_close (dev_file_t * f ) {
47
+ tcsetattr (f -> handle , TCSANOW , & f -> oldtio );
48
+ close (f -> handle );
49
+ f -> handle = -1 ;
50
+ return 1 ;
51
+ }
52
+
53
+ int serial_write (dev_file_t * f , byte * data , dword size ) {
54
+ return stream_write (f , data , size );
55
+ }
56
+
57
+ int serial_read (dev_file_t * f , byte * data , dword size ) {
58
+ return stream_read (f , data , size );
59
+ }
60
+
61
+ // Returns the number of the available data on serial port
62
+ dword serial_length (dev_file_t * f ) {
63
+ fd_set readfs ;
64
+ struct timeval tv ;
65
+
66
+ FD_ZERO (& readfs );
67
+ FD_SET (f -> handle , & readfs );
68
+
69
+ tv .tv_usec = 250 ; // milliseconds
70
+ tv .tv_sec = 0 ; // seconds
71
+
72
+ select (f -> handle + 1 , & readfs , NULL , NULL , & tv );
73
+ if (FD_ISSET (f -> handle , & readfs )) {
74
+ return 1 ;
75
+ }
76
+ return 0 ;
77
+ }
78
+
79
+ #elif defined(_Win32 )
80
+ typedef int FileHand ;
81
+
82
+ int serial_open (dev_file_t * f ) {
59
83
DCB dcb ;
60
84
HANDLE hCom ;
61
85
DWORD dwer ;
62
86
63
87
sprintf (f -> name , "COM%d" , f -> port );
64
88
65
89
hCom = CreateFile (f -> name , GENERIC_READ | GENERIC_WRITE ,
66
- 0 , NULL , OPEN_EXISTING , 0 , NULL );
90
+ 0 , NULL , OPEN_EXISTING , 0 , NULL );
67
91
68
92
if (hCom == INVALID_HANDLE_VALUE ) {
69
93
dwer = GetLastError ();
70
- if (dwer != 5 )
71
- rt_raise ("SERIALFS: CreateFile() failed (%d)" , dwer );
72
- else
73
- rt_raise ("SERIALFS: ACCESS DENIED" );
94
+ if (dwer != 5 ) {
95
+ rt_raise ("SERIALFS: CreateFile() failed (%d)" , dwer );
96
+ } else {
97
+ rt_raise ("SERIALFS: ACCESS DENIED" );
98
+ }
74
99
return 0 ;
75
100
}
76
101
@@ -91,96 +116,60 @@ int serial_open(dev_file_t * f) {
91
116
92
117
f -> handle = (FileHand ) hCom ;
93
118
return 1 ;
94
- #else
95
- // /////////////////////////////////////////////////////////////////////////////////////////
96
- // ERROR
97
- err_unsup ();
98
- return 0 ; // failed
99
- #endif
100
119
}
101
120
102
- /*
103
- */
104
- int serial_close (dev_file_t * f ) {
105
- #if USE_TERM_IO
106
- tcsetattr (f -> handle , TCSANOW , & f -> oldtio );
107
- close (f -> handle );
108
- f -> handle = -1 ;
109
- return 1 ;
110
-
111
- #elif defined(_Win32 ) || defined(__CYGWIN__ ) || defined(__MINGW32__ )
121
+ int serial_close (dev_file_t * f ) {
112
122
CloseHandle ((HANDLE ) f -> handle );
113
123
f -> handle = -1 ;
114
124
return 1 ;
115
-
116
- #else
117
- return 0 ;
118
- #endif
119
125
}
120
126
121
- /*
122
- */
123
- int serial_write (dev_file_t * f , byte * data , dword size ) {
124
- #if defined(_UnixOS )
125
- return stream_write (f , data , size );
126
- #elif defined(_Win32 )
127
+ int serial_write (dev_file_t * f , byte * data , dword size ) {
127
128
DWORD bytes ;
128
-
129
129
f -> last_error = !WriteFile ((HANDLE ) f -> handle , data , size , & bytes , NULL );
130
130
return bytes ;
131
- #else
132
- return 0 ;
133
- #endif
134
131
}
135
132
136
- /*
137
- */
138
- int serial_read (dev_file_t * f , byte * data , dword size ) {
139
- #if defined(_UnixOS )
140
- return stream_read (f , data , size );
141
- #elif defined(_Win32 )
133
+ int serial_read (dev_file_t * f , byte * data , dword size ) {
142
134
DWORD bytes ;
143
-
144
135
f -> last_error = !ReadFile ((HANDLE ) f -> handle , data , size , & bytes , NULL );
145
136
return bytes ;
146
- #else
147
- return 0 ;
148
- #endif
149
137
}
150
138
151
- /*
152
- * Returns the number of the available data on serial port
153
- */
154
- dword serial_length (dev_file_t * f ) {
155
- #if defined(_UnixOS ) && !defined(SERIAL_UNSUP )
156
- fd_set readfs ;
157
- struct timeval tv ;
139
+ dword serial_length (dev_file_t * f ) {
140
+ COMSTAT cs ;
141
+ DWORD de = CE_BREAK ;
142
+ ClearCommError ((HANDLE ) f -> handle , & de , & cs );
143
+ return cs .cbInQue ;
144
+ }
158
145
159
- FD_ZERO (& readfs );
160
- FD_SET (f -> handle , & readfs );
146
+ #else
161
147
162
- tv .tv_usec = 250 ; /* milliseconds */
163
- tv .tv_sec = 0 ; /* seconds */
148
+ int serial_open (dev_file_t * f ) {
149
+ err_unsup ();
150
+ }
164
151
165
- select ( f -> handle + 1 , & readfs , NULL , NULL , & tv );
166
- if ( FD_ISSET ( f -> handle , & readfs ))
167
- return 1 ;
152
+ int serial_close ( dev_file_t * f ) {
153
+ return 0 ;
154
+ }
168
155
156
+ int serial_write (dev_file_t * f , byte * data , dword size ) {
169
157
return 0 ;
170
- #elif defined(_Win32 )
171
- COMSTAT cs ;
172
- DWORD de = CE_BREAK ;
158
+ }
173
159
174
- ClearCommError ((HANDLE ) f -> handle , & de , & cs );
175
- return cs .cbInQue ;
176
- #else
160
+ int serial_read (dev_file_t * f , byte * data , dword size ) {
161
+ return 0 ;
162
+ }
163
+
164
+ dword serial_length (dev_file_t * f ) {
177
165
return 0 ;
178
- #endif
179
166
}
180
167
168
+ #endif
169
+
181
170
/*
182
- * Returns true (EOF) if the connection is broken
171
+ * Returns true (EOF) if the connection is broken
183
172
*/
184
- dword serial_eof (dev_file_t * f ) {
173
+ dword serial_eof (dev_file_t * f ) {
185
174
return f -> last_error ;
186
175
}
0 commit comments