src/serial.cc
Go to the documentation of this file.
1 
20 #include <stdio.h>
21 #include <fcntl.h>
22 #include <sys/time.h>
23 #include <unistd.h>
24 
25 #include "serial.h"
26 #include <string.h>
27 #include <errno.h>
28 
30  if (tty_fd_slot != -1) {
33  }
34 }
36  tty_fd_slot = -1;
37  strcpy(device_name,"");
38 }
39 
40 
41 /******************************************************************************
42  ***
43  *** Name: open_serial
44  ***
45  *** Purpose: oeffnet ein serielles Device
46  ***
47  *** Parameters: devicename (z.B. "/dev/ttyS4") und flags (z.B. CS8|B9600 )
48  ***
49  *** Returns: filedescriptor, bzw. -1 im Fehlerfall
50  ***
51  ******************************************************************************
52  */
53 
54 int SerialDevice::open_serial (const char *p_tty_name)
55 {
56  struct termio tty_set;
57  int tty_fd = -1;
58 
59  if ( (tty_fd = open(p_tty_name, O_RDWR |O_NOCTTY)) < 0 )//NONBLOCK
60  {
61  printf("ERROR: Couldn't open port %s!\n", p_tty_name);
62  perror(NULL);
63  return (-1);
64  }
65 
66  if (ioctl(tty_fd, TCGETA, &tty_set ) == -1 )
67  {
68  printf("ERROR: ioctl() failed to read settings!\n");
69  perror(NULL);
70  return (-1);
71  }
72 
73  tty_set.c_cflag = (B115200 | CS8 | CLOCAL | CREAD);
74  tty_set.c_iflag = IXOFF;
75  tty_set.c_lflag = 0;
76  tty_set.c_oflag = 0;
77  tty_set.c_cc[VTIME] = 20;
78  tty_set.c_cc[VMIN] = 0;
79 
80  if (ioctl(tty_fd, TCSETAW, &tty_set ) == -1 )
81  {
82  printf("ERROR: ioctl() failed to set settings!\n");
83  perror(NULL);
84  return (-1);
85  }
86 
87  tty_fd_slot = tty_fd;
88  strcpy(device_name,p_tty_name);
89  return (tty_fd);
90 }
91 
92 /******************************************************************************
93  ***
94  *** Name: change_baud_serial
95  ***
96  *** Purpose: stellt die Geschwindigkeit der seriellen Schnittstelle um
97  ***
98  *** Parameters: filedescriptor und neue Geschwindigkeit (z.B. B38400)
99  ***
100  *** Returns: STATUS_OK, bzw. STATUS_ERROR im Fehlerfall
101  ***
102  ******************************************************************************
103  */
104 
105 long SerialDevice::change_baud_serial (int tty_fd, speed_t speed)
106  {
107  struct termio tty_set;
108 
109  if (ioctl(tty_fd, TCGETA, &tty_set ) == -1 )
110  {
111  printf("ERROR: ioctl() failed to read settings!\n");
112  perror(NULL);
113  return (STATUS_ERROR);
114  }
115 
116  tty_set.c_cflag &= ~CBAUD;
117  tty_set.c_cflag |= speed;
118 
119  if (ioctl(tty_fd, TCSETAW, &tty_set ) == -1 )
120  {
121  printf("ERROR: ioctl() failed to set settings!\n");
122  perror(NULL);
123  return (STATUS_ERROR);
124  }
125 
126  return (STATUS_OK);
127  }
128 
129 /******************************************************************************
130  ***
131  *** Name: write_serial
132  ***
133  *** Purpose: Schickt Daten an die serielle Schnittstelle
134  ***
135  *** Parameters: filedescriptor, Pointer auf Speicher, Zahl der zu versendenden bytes
136  ***
137  *** Returns: STATUS_OK, bzw. STATUS_ERROR im Fehlerfall
138  ***
139  ******************************************************************************
140  */
141 
142 long SerialDevice::write_serial(int tty_fd, unsigned char *p_buffer, long nb_byte)
143  {
144  int bytes_out;
145 
146  if (( bytes_out = write(tty_fd, p_buffer, nb_byte)) < nb_byte)
147  {
148  printf("ERROR: write() failed!\n");
149  perror(NULL);
150  return (STATUS_ERROR);
151  };
152 
153  return (STATUS_OK);
154  }
155 
156 /******************************************************************************
157  ***
158  *** Name: read_serial
159  ***
160  *** Purpose: Liest Daten von der seriellen Schnittstelle. Liegen gerade
161  *** keine Daten an, wird eine 20tel Sekunde darauf gewartet!
162  ***
163  *** Parameters: filedescriptor, Pointer auf Speicherbereich, maximale
164  *** Zahl der zu lesenden bytes
165  ***
166  *** Returns: Zahl der gelesenen bytes
167  ***
168  ******************************************************************************
169  */
170 
171 long SerialDevice::read_serial(int tty_fd, unsigned char *p_buffer, long nb_bytes_max)
172  {
173  struct timeval tz;
174  fd_set fds;
175  int tries = 0;
176  int qu_new = 0;
177  int bytes_read = 0;
178  int ready = STATUS_ERROR;
179 
180  /* read max nb_bytes_max bytes */
181 
182  while (tries < 2 && !ready)
183  {
184  tz.tv_sec = 1;
185  tz.tv_usec = 0;
186 
187  FD_ZERO(&fds);
188  FD_SET(tty_fd, &fds);
189  if (select(FD_SETSIZE, &fds, 0, 0, &tz) > 0)
190  {
191  qu_new = read(tty_fd, &p_buffer[bytes_read], (nb_bytes_max - bytes_read));
192  if (qu_new > 0)
193  bytes_read += qu_new;
194  else
195  tries++;
196  ready = (bytes_read == nb_bytes_max);
197  }
198  else
199  tries++;
200  }
201 
202  return(bytes_read);
203  }
204 
205 /******************************************************************************
206  ***
207  *** Name: close_serial
208  ***
209  *** Purpose: schliesst das serielle device
210  ***
211  *** Parameter: filedescriptor
212  ***
213  ******************************************************************************
214  */
215 
216 void SerialDevice::close_serial (int tty_fd)
217  {
218  close(tty_fd);
219  }
220 
221 /******************************************************************************
222  ***
223  *** Name: wait_for_serial
224  ***
225  *** Purpose: Wartet maximal eine vorgegebene Zeit auf das Eintreffen von
226  *** Daten an der seriellen Schnittstelle
227  ***
228  *** Parameters: filedescriptor, maximale Wartezeit
229  ***
230  *** Returns: STATUS_OK wenn Daten anliegen, bzw. STATUS_ERROR wenn nicht
231  ***
232  ******************************************************************************
233  */
234 
235 long SerialDevice::wait_for_serial(int tty_fd, long max_time_secs)
236  {
237  struct timeval tz;
238  fd_set fds;
239 
240  while (max_time_secs--)
241  {
242  tz.tv_sec = 1;
243  tz.tv_usec = 0;
244 
245  FD_ZERO (&fds);
246  FD_SET(tty_fd, &fds);
247 
248  if (select(FD_SETSIZE, &fds, 0, 0, &tz) > 0)
249  return (STATUS_OK);
250  }
251 
252  return (STATUS_ERROR);
253  }
254 
255 
256 /******************************************************************************
257  ***
258  *** Name: empty_serial
259  ***
260  *** Purpose: Loescht den Eingangspuffer der seriellen Schnittstelle
261  ***
262  *** Caveats: Noch nicht getestet... (see manpage zu termios)
263  ***
264  *** Parameters: filedescriptor
265  ***
266  *** Returns: STATUS_OK, bzw. STATUS_ERROR im Fehlerfall
267  ***
268  ******************************************************************************
269  */
270 
271 long SerialDevice::empty_serial(int tty_fd)
272  {
273  if (-1 == tcflush (tty_fd, TCIFLUSH))
274  return (STATUS_ERROR);
275  else
276  return (STATUS_OK);
277  }
278 
279 
280 
281 
282 
283 
284 
285 
286 
287 
288 
289 
290 
291 
292 
293 
294 
long write_serial(int tty_fd, unsigned char *p_buffer, long nb_byte)
#define STATUS_OK
char device_name[255]
long change_baud_serial(int tty_fd, speed_t speed)
long wait_for_serial(int tty_fd, long max_time_secs)
#define STATUS_ERROR
int open_serial(const char *p_tty_name)
long read_serial(int tty_fd, unsigned char *p_buffer, long nb_bytes_max)


asr_flock_of_birds
Author(s): Bernhardt Andre, Engelmann Stephan, Giesler Björn, Heller Florian, Jäkel Rainer, Nguyen Trung, Pardowitz Michael, Weckesser Peter, Yi Xie, Zöllner Raoul
autogenerated on Mon Jun 10 2019 12:44:40