serial_comm.cpp
Go to the documentation of this file.
2 
3 #define MILVUS_EXCEPT(except, msg, ...) \
4 { \
5  char buf[1000]; \
6  snprintf(buf, 1000, msg " (in milvus::SerialComm::%s)" , ##__VA_ARGS__, __FUNCTION__); \
7  throw except(buf); \
8 }
9 
11 {
12 }
13 
15 {
16 }
17 
18 int milvus::SerialComm::open_port(std::string port_name, int baudrate, std::string mode_s)
19 {
20  int baudr,
21  status;
22 
23  const char *mode = mode_s.c_str();
24 
25  switch(baudrate)
26  {
27  case 50 : baudr = B50;
28  break;
29  case 75 : baudr = B75;
30  break;
31  case 110 : baudr = B110;
32  break;
33  case 134 : baudr = B134;
34  break;
35  case 150 : baudr = B150;
36  break;
37  case 200 : baudr = B200;
38  break;
39  case 300 : baudr = B300;
40  break;
41  case 600 : baudr = B600;
42  break;
43  case 1200 : baudr = B1200;
44  break;
45  case 1800 : baudr = B1800;
46  break;
47  case 2400 : baudr = B2400;
48  break;
49  case 4800 : baudr = B4800;
50  break;
51  case 9600 : baudr = B9600;
52  break;
53  case 19200 : baudr = B19200;
54  break;
55  case 38400 : baudr = B38400;
56  break;
57  case 57600 : baudr = B57600;
58  break;
59  case 115200 : baudr = B115200;
60  break;
61  case 230400 : baudr = B230400;
62  break;
63  case 460800 : baudr = B460800;
64  break;
65  case 500000 : baudr = B500000;
66  break;
67  case 576000 : baudr = B576000;
68  break;
69  case 921600 : baudr = B921600;
70  break;
71  case 1000000 : baudr = B1000000;
72  break;
73  case 1152000 : baudr = B1152000;
74  break;
75  case 1500000 : baudr = B1500000;
76  break;
77  case 2000000 : baudr = B2000000;
78  break;
79  case 2500000 : baudr = B2500000;
80  break;
81  case 3000000 : baudr = B3000000;
82  break;
83  case 3500000 : baudr = B3500000;
84  break;
85  case 4000000 : baudr = B4000000;
86  break;
87  default : printf("invalid baudrate\n");
88  return(1);
89  break;
90  }
91 
92  int cbits=CS8,
93  cpar=IGNPAR,
94  bstop=0;
95 
96  if(strlen(mode) < 3)
97  {
98  printf("invalid mode:%d \"%s\"\n",(int)strlen(mode), mode);
99  return(1);
100  }
101 
102  switch(mode[0])
103  {
104  case '8': cbits = CS8;
105  break;
106  case '7': cbits = CS7;
107  break;
108  case '6': cbits = CS6;
109  break;
110  case '5': cbits = CS5;
111  break;
112  default : printf("invalid number of data-bits '%c'\n", mode[0]);
113  return(1);
114  break;
115  }
116 
117  switch(mode[1])
118  {
119  case 'N':
120  case 'n': cpar = IGNPAR;
121  break;
122  case 'E':
123  case 'e': cpar = PARENB;
124  break;
125  case 'O':
126  case 'o': cpar = (PARENB | PARODD);
127  break;
128  default : printf("invalid parity '%c'\n", mode[1]);
129  return(1);
130  break;
131  }
132 
133  switch(mode[2])
134  {
135  case '1': bstop = 0;
136  break;
137  case '2': bstop = CSTOPB;
138  break;
139  default : printf("invalid number of stop bits '%c'\n", mode[2]);
140  return(1);
141  break;
142  }
143 
144 
145  fd_ = open(port_name.c_str(), O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK);
146  if(fd_==-1)
147  {
148  perror("unable to open comport ");
149  return(1);
150  }
151  else
152  {
153  fcntl(fd_, F_SETFL, 0);
154  }
155 
156  error = tcgetattr(fd_, &old_port_settings);
157  if(error==-1)
158  {
159  close(fd_);
160  perror("unable to read portsettings ");
161  return(1);
162  }
163  memset(&new_port_settings, 0, sizeof(new_port_settings));
164 
165  new_port_settings.c_cflag = cbits | cpar | bstop | CLOCAL | CREAD;
166  new_port_settings.c_iflag = IGNPAR;
167  new_port_settings.c_oflag = 0;
168  new_port_settings.c_lflag = 0;
169  new_port_settings.c_cc[VMIN] = 0;
170  new_port_settings.c_cc[VTIME] = 0;
171 
172  cfsetispeed(&new_port_settings, baudr);
173  cfsetospeed(&new_port_settings, baudr);
174 
175  error = tcsetattr(fd_, TCSANOW, &new_port_settings);
176  if(error==-1)
177  {
178  close(fd_);
179  perror("unable to adjust portsettings ");
180  return(1);
181  }
182 
183  if(ioctl(fd_, TIOCMGET, &status) == -1)
184  {
185  perror("unable to get portstatus");
186  return(1);
187  }
188 
189  status |= TIOCM_DTR;
190  status |= TIOCM_RTS;
191 
192  if(ioctl(fd_, TIOCMSET, &status) == -1)
193  {
194  perror("unable to set portstatus");
195  return(1);
196  }
197 
198 
199  return(0);
200 }
201 
203 {
204  int status;
205 
206  if(ioctl(fd_, TIOCMGET, &status) == -1)
207  {
208  perror("unable to get portstatus");
209  }
210 
211  status &= ~TIOCM_DTR; /* turn off DTR */
212  status &= ~TIOCM_RTS; /* turn off RTS */
213 
214  if(ioctl(fd_, TIOCMSET, &status) == -1)
215  {
216  perror("unable to set portstatus");
217  }
218 
219  close(fd_);
220 }
221 
222 int milvus::SerialComm::poll_comport(unsigned char *buf, int size)
223 {
224  int n;
225  n = read(fd_, buf, size);
226  return(n);
227 }
228 
230 {
231 
232 }
233 
234 int milvus::SerialComm::send_buf(unsigned char *buf, int size)
235 {
236  return(write(fd_, buf, size));
237 }
238 
239 void milvus::SerialComm::cputs(const char *)
240 {
241 
242 }
243 
245 {
246 
247 }
248 
250 {
251 
252 }
253 
255 {
256 
257 }
258 
260 {
261 
262 }
263 
265 {
266 
267 }
268 
270 {
271 
272 }
273 
275 {
276 
277 }
278 
int send_byte(unsigned char)
~SerialComm()
Destructor.
Definition: serial_comm.cpp:14
int poll_comport(unsigned char *, int)
int send_buf(unsigned char *, int)
int fd_
File descriptor.
Definition: serial_comm.h:43
struct termios new_port_settings old_port_settings
Definition: serial_comm.h:47
int open_port(std::string port_name, int baudrate, std::string mode_s)
Definition: serial_comm.cpp:18
SerialComm()
Constructor.
Definition: serial_comm.cpp:10
void cputs(const char *)


mrp2_hardware
Author(s): Akif Hacinecipoglu
autogenerated on Mon Feb 28 2022 22:53:03