##// END OF EJS Templates
fixed bug on Parity hndling under linux!
jeandet@pc-de-jeandet3.lab-lpp.local -
r25:ffb9425c0576 alexis
parent child
Show More
@@ -1,37 +1,43
1 1 // SOPSUYSI_RS232.h
2
2 #ifndef RS232_H
3 #define RS232_H
3 4 #define debug
4 5
5 6 #include "rs232config.h"
6 7
7 8 #ifdef HAVE_WINDOWS_H
8 9 #include <windows.h>
9 10 #define badPortValue INVALID_HANDLE_VALUE
10 11 typedef HANDLE rs232port_t;
11 12 typedef DWORD rs232speed_t;
12 13 typedef enum {rs232OneStop=ONESTOPBIT,rs232One5Stop=ONE5STOPBITS,rs232TwoStop=TWOSTOPBITS}rs232stop;
13 14 typedef enum {rs232parityNo=NOPARITY,rs232parityOdd=ODDPARITY,rs232parityEven=EVENPARITY}rs232parity;
14 15 #else
15 16 #ifdef HAVE_TERMIOS_H
16 17 #include <termios.h>
17 18 #define badPortValue -1
18 19 typedef int rs232port_t;
19 20 typedef speed_t rs232speed_t;
20 21 typedef enum {rs232OneStop=1,rs232One5Stop=2,rs232TwoStop=2}rs232stop;
21 typedef enum {rs232parityNo=(~PARENB),rs232parityOdd=(PARENB|PARODD),rs232parityEven=(PARENB|~PARODD)}rs232parity;
22 typedef enum {rs232parityNo,rs232parityOdd,rs232parityEven}rs232parity;
22 23 #endif
23 24 #endif
24 25 #ifdef __cplusplus
25 26 #define rs232extern extern "C"
26 27 #else
27 28 #define rs232extern extern
28 29 #endif
29 30 rs232extern rs232port_t rs232open(char* psPortName);
30 31 rs232extern int rs232close(rs232port_t fd);
31 32 rs232extern int rs232setup(rs232port_t fd, int ChSize, int BaudeRate, rs232parity Parity, rs232stop NbStop);
32 33 rs232extern int rs232write(rs232port_t fd,char *psWrite, int WriteBufferSize);
33 34 rs232extern int rs232read(rs232port_t fd,char *psRead, int ReadBufferSize);
34 35 rs232extern int rs232setparity(rs232port_t fd, rs232parity Parity);
35 36 rs232extern int rs232setnbstop(rs232port_t fd, rs232stop NbStop);
36 37 rs232extern int rs232setcsize(rs232port_t fd, int ChSize);
37 38 rs232extern int rs232setbaudrate(rs232port_t fd, int baudrate);
39
40 #endif
41
42
43
@@ -1,343 +1,343
1 1 #include <stdio.h>
2 2 #include <unistd.h>
3 3 #include <fcntl.h>
4 4 #include <string.h>
5 5 #include <errno.h>
6 6 #include "rs232config.h"
7 7 #ifdef HAVE_TERMIOS_H
8 8 #include <termios.h>
9 9 #endif
10 10 #include "RS232.h"
11 11
12 12 #ifdef HAVE_WINDOWS_H
13 13 #else
14 14 #ifdef HAVE_TERMIOS_H
15 15 rs232speed_t rs232cfspeed(unsigned int BaudeRate);
16 16
17 17 rs232port_t rs232open(char* psPortName)
18 18 {
19 19 rs232port_t fd;
20 20 fd = open(psPortName, O_RDWR | O_NOCTTY | O_NDELAY);
21 21 fcntl(fd, F_SETFL, 0);
22 22 //fd = open(psPortName, O_RDWR | O_NOCTTY);
23 23 #ifdef debug
24 24 if(fd==-1)printf("can't open Port\n");
25 25 #endif
26 26 return fd;
27 27 }
28 28
29 29 int rs232close(rs232port_t fd)
30 30 {
31 31 if ((int)fd == -1)
32 32 {
33 33 return -1;
34 34 }
35 35 else
36 36 {
37 37 close(fd);
38 38 return 0;
39 39 }
40 40 }
41 41
42 42
43 43 int rs232setup(rs232port_t fd, int ChSize, int BaudeRate, rs232parity Parity, rs232stop NbStop)
44 44 {
45 45 if ((int)fd == -1)
46 46 {
47 47 return -1;
48 48 }
49 49 else
50 50 {
51 51 struct termios terminos;
52 52 tcgetattr(fd, &terminos);
53 53 cfsetispeed(&terminos, rs232cfspeed(BaudeRate));
54 54 cfsetospeed(&terminos, rs232cfspeed(BaudeRate));
55 55 terminos.c_cflag |= (CLOCAL | CREAD);
56 56 rs232cfparity(fd, &terminos, Parity);
57 57 rs232cfnbstop(fd, &terminos, NbStop);
58 58 rs232cfcsize(fd, &terminos, ChSize);
59 59 terminos.c_cc[VMIN]=0;
60 60 terminos.c_cc[VTIME]=1;
61 61 tcflush(fd, TCIFLUSH);
62 62 #ifdef debug
63 63 if(tcsetattr(fd, TCSANOW, &terminos)!=0)printf("bad setup\n");
64 64 #else
65 65 tcsetattr(fd, TCSANOW, &terminos);
66 66 #endif
67 67 return 0;
68 68 }
69 69 }
70 70
71 71 int rs232setbaudrate(rs232port_t fd, int baudrate)
72 72 {
73 73 if ((int)fd == -1)
74 74 {
75 75 return fd;
76 76 }
77 77 else
78 78 {
79 79 struct termios terminos;
80 80 tcgetattr(fd, &terminos);
81 81 cfsetispeed(&terminos, rs232cfspeed(baudrate));
82 82 cfsetospeed(&terminos, rs232cfspeed(baudrate));
83 83 tcsetattr(fd, TCSANOW, &terminos);
84 84 return 0;
85 85 }
86 86 }
87 87
88 88 int rs232setparity(rs232port_t fd, rs232parity Parity)
89 89 {
90 90 if ((int)fd == -1)
91 91 {
92 92 return fd;
93 93 }
94 94 else
95 95 {
96 96 struct termios terminos;
97 97 tcgetattr(fd, &terminos);
98 98 switch(Parity)
99 99 {
100 100 case rs232parityNo:
101 terminos.c_cflag &= Parity;
101 terminos.c_cflag &= ~PARENB;
102 102 break;
103 103 case rs232parityOdd:
104 terminos.c_cflag &= ~PARENB;
105 terminos.c_cflag |= Parity;
104 terminos.c_cflag |= PARENB;
105 terminos.c_cflag |= PARODD;
106 106 break;
107 107 case rs232parityEven:
108 terminos.c_cflag &= ~PARENB;
109 terminos.c_cflag |= Parity;
108 terminos.c_cflag |= PARENB;
109 terminos.c_cflag &= ~PARODD;
110 110 break;
111 111 default:
112 112 terminos.c_cflag &= ~PARENB;
113 113 break;
114 114 }
115 115 tcsetattr(fd, TCSANOW, &terminos);
116 116 return 0;
117 117 }
118 118 }
119 119
120 120 int rs232setnbstop(rs232port_t fd, rs232stop NbStop)
121 121 {
122 122 if ((int)fd == -1)
123 123 {
124 124 return fd;
125 125 }
126 126 else
127 127 {
128 128 struct termios terminos;
129 129 tcgetattr(fd, &terminos);
130 130 switch(NbStop)
131 131 {
132 132 case 2:
133 133 terminos.c_cflag |= CSTOPB;
134 134 break;
135 135 default:
136 136 terminos.c_cflag &= ~CSTOPB;
137 137 break;
138 138 }
139 139 tcsetattr(fd, TCSANOW, &terminos);
140 140 return 0;
141 141 }
142 142 }
143 143
144 144
145 145 int rs232setcsize(rs232port_t fd, int ChSize)
146 146 {
147 147 if ((int)fd == -1)
148 148 {
149 149 return fd;
150 150 }
151 151 else
152 152 {
153 153 struct termios terminos;
154 154 tcgetattr(fd, &terminos);
155 155 switch(ChSize)
156 156 {
157 157 case 5:
158 158 terminos.c_cflag |= CS5;
159 159 break;
160 160 case 6:
161 161 terminos.c_cflag |= CS6;
162 162 break;
163 163 case 7:
164 164 terminos.c_cflag |= CS7;
165 165 break;
166 166 default:
167 167 terminos.c_cflag |= CS8;
168 168 break;
169 169 }
170 170 tcsetattr(fd, TCSANOW, &terminos);
171 171 return 0;
172 172 }
173 173 }
174 174
175 175 rs232speed_t rs232cfspeed(unsigned int BaudeRate)
176 176 {
177 177 if(BaudeRate<25)
178 178 return B0;
179 179
180 180 if(BaudeRate<67)
181 181 return B50;
182 182
183 183 if(BaudeRate<93)
184 184 return B75;
185 185
186 186 if(BaudeRate<123)
187 187 return B110;
188 188
189 189 if(BaudeRate<142)
190 190 return B134;
191 191
192 192 if(BaudeRate<175)
193 193 return B150;
194 194
195 195 if(BaudeRate<250)
196 196 return B200;
197 197
198 198 if(BaudeRate<450)
199 199 return B300;
200 200
201 201 if(BaudeRate<900)
202 202 return B600;
203 203
204 204 if(BaudeRate<1500)
205 205 return B1200;
206 206
207 207 if(BaudeRate<2100)
208 208 return B1800;
209 209
210 210 if(BaudeRate<3600)
211 211 return B2400;
212 212
213 213 if(BaudeRate<7200)
214 214 return B4800;
215 215
216 216 if(BaudeRate<1400)
217 217 return B9600;
218 218
219 219 if(BaudeRate<28800)
220 220 return B19200;
221 221
222 222 if(BaudeRate<48000)
223 223 return B38400;
224 224
225 225 if(BaudeRate<86400)
226 226 return B57600;
227 227
228 228 if(BaudeRate<172800)
229 229 return B115200;
230 230 else
231 231 return B230400;
232 232 }
233 233
234 234
235 235 int rs232cfparity(int fd, struct termios *terminos, rs232parity Parity)
236 236 {
237 237 if ((int)fd == -1)
238 238 {
239 239 return fd;
240 240 }
241 241 else
242 242 {
243 243 switch(Parity)
244 244 {
245 245 case rs232parityNo:
246 246 terminos->c_cflag &= Parity;
247 247 break;
248 248 case rs232parityOdd:
249 249 terminos->c_cflag &= ~PARENB;
250 250 terminos->c_cflag |= Parity;
251 251 break;
252 252 case rs232parityEven:
253 253 terminos->c_cflag &= ~PARENB;
254 254 terminos->c_cflag |= Parity;
255 255 break;
256 256 default:
257 257 terminos->c_cflag &= ~PARENB;
258 258 break;
259 259 }
260 260 return 0;
261 261 }
262 262 }
263 263
264 264 int rs232cfnbstop(int fd, struct termios *terminos, rs232stop NbStop)
265 265 {
266 266 if ((int)fd == -1)
267 267 {
268 268 return fd;
269 269 }
270 270 else
271 271 {
272 272 switch(NbStop)
273 273 {
274 274 case 2:
275 275 terminos->c_cflag |= CSTOPB;
276 276 break;
277 277 default:
278 278 terminos->c_cflag &= ~CSTOPB;
279 279 break;
280 280 }
281 281 return 0;
282 282 }
283 283 }
284 284
285 285
286 286 int rs232cfcsize(int fd, struct termios *terminos, int ChSize)
287 287 {
288 288 if ((int)fd == -1)
289 289 {
290 290 return fd;
291 291 }
292 292 else
293 293 {
294 294 switch(ChSize)
295 295 {
296 296 case 5:
297 297 terminos->c_cflag |= CS5;
298 298 break;
299 299 case 6:
300 300 terminos->c_cflag |= CS6;
301 301 break;
302 302 case 7:
303 303 terminos->c_cflag |= CS7;
304 304 break;
305 305 default:
306 306 terminos->c_cflag |= CS8;
307 307 break;
308 308 }
309 309 return 0;
310 310 }
311 311 }
312 312
313 313
314 314 int rs232write(rs232port_t fd,char *psWrite, int WriteBufferSize)
315 315 {
316 316 if ((int)fd == -1)
317 317 {
318 318 return -1;
319 319 }
320 320 else
321 321 {
322 322 return write(fd, psWrite, WriteBufferSize);
323 323 }
324 324 }
325 325
326 326
327 327 int rs232read(rs232port_t fd,char *psReadHex, int ReadBufferSize)
328 328 {
329 329
330 330 if ((int)fd == -1)
331 331 {
332 332 return -1;
333 333 }
334 334 else
335 335 {
336 336 return read(fd, psReadHex, ReadBufferSize);
337 337 }
338 338
339 339 }
340 340
341 341 #endif
342 342 #endif //#ifdef HAVE_TERMIOS_H
343 343
1 NO CONTENT: file was removed
General Comments 0
You need to be logged in to leave comments. Login now