seiral_func.hpp
Go to the documentation of this file.
1 
12 /*****************************************************************************
13 ** Ifdefs
14 *****************************************************************************/
15 
16 #ifndef DUMPBOT_SERIAL_FUNC_HPP_
17 #define DUMPBOT_SERIAL_FUNC_HPP_
18 /*****************************************************************************
19 ** Includes
20 *****************************************************************************/
21 #include <iostream>
22 #include<stdio.h> /*标准输入输出定义*/
23 #include<stdlib.h> /*标准函数库定义*/
24 #include<unistd.h> /*Unix 标准函数定义*/
25 #include<sys/types.h>
26 #include<sys/stat.h>
27 #include<fcntl.h> /*文件控制定义*/
28 #include<termios.h> /*PPSIX 终端控制定义*/
29 #include<errno.h> /*错误号定义*/
30 #include<string.h>
31 
32 #include <fstream>
33 #include <iostream>
34 #include <sstream>
35 #include <time.h>
36 //宏定义
37 #define FALSE -1
38 #define TRUE 0
40 using namespace std;
48 public:
49  void UART0_Close(int fd){
50  close(fd);
51  }
52  int UART0_Set(int fd,int speed,int flow_ctrl,int databits,int stopbits,int parity){
53 
54  int i;
55  int status;
56  int speed_arr[] = { B115200, B19200, B9600, B4800, B2400, B1200, B300};
57  int name_arr[] = {115200, 19200, 9600, 4800, 2400, 1200, 300};
58 
59  struct termios options;
60 
61  /*tcgetattr(fd,&options)得到与fd指向对象的相关参数,并将它们保存于options,该函数还可以测试配置是否正确,该串口是否可用等。若调用成功,函数返回值为0,若调用失败,函数返回值为1.
62  */
63  if ( tcgetattr( fd,&options) != 0){
64  perror("SetupSerial 1");
65  return(FALSE);
66  }
67 
68  //设置串口输入波特率和输出波特率
69  for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++){
70  if (speed == name_arr[i]){
71  cfsetispeed(&options, speed_arr[i]);
72  cfsetospeed(&options, speed_arr[i]);
73  }
74  }
75 
76  //修改控制模式,保证程序不会占用串口
77  options.c_cflag |= CLOCAL;
78  //修改控制模式,使得能够从串口中读取输入数据
79  options.c_cflag |= CREAD;
80 
81  //设置数据流控制
82  switch(flow_ctrl){
83  case 0 ://不使用流控制
84  options.c_cflag &= ~CRTSCTS;
85  break;
86  case 1 ://使用硬件流控制
87  options.c_cflag |= CRTSCTS;
88  break;
89  case 2 ://使用软件流控制
90  options.c_cflag |= IXON | IXOFF | IXANY;
91  break;
92  }
93  //设置数据位
94  //屏蔽其他标志位
95  options.c_cflag &= ~CSIZE;
96  switch (databits){
97  case 5 :
98  options.c_cflag |= CS5;
99  break;
100  case 6 :
101  options.c_cflag |= CS6;
102  break;
103  case 7 :
104  options.c_cflag |= CS7;
105  break;
106  case 8 :
107  options.c_cflag |= CS8;
108  break;
109  default:
110  fprintf(stderr,"Unsupported data size\n");
111  return (FALSE);
112  }
113 
114  //设置校验位
115  switch (parity){
116  case 'n':
117  case 'N': //无奇偶校验位。
118  options.c_cflag &= ~PARENB;
119  options.c_iflag &= ~INPCK;
120  break;
121  case 'o':
122  case 'O'://设置为奇校验
123  options.c_cflag |= (PARODD | PARENB);
124  options.c_iflag |= INPCK;
125  break;
126  case 'e':
127  case 'E'://设置为偶校验
128  options.c_cflag |= PARENB;
129  options.c_cflag &= ~PARODD;
130  options.c_iflag |= INPCK;
131  break;
132  case 's':
133  case 'S': //设置为空格
134  options.c_cflag &= ~PARENB;
135  options.c_cflag &= ~CSTOPB;
136  break;
137  default :
138  fprintf(stderr,"Unsupported parity\n");
139  return (FALSE);
140  }
141 
142  // 设置停止位
143  switch (stopbits){
144  case 1:
145  options.c_cflag &= ~CSTOPB; break;
146  case 2:
147  options.c_cflag |= CSTOPB; break;
148  default:
149  fprintf(stderr,"Unsupported stop bits\n");
150  return (FALSE);
151  }
152 
153  //修改输出模式,原始数据输出
154  options.c_oflag &= ~OPOST;
155 
156  options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);//我加的
157  //options.c_lflag &= ~(ISIG | ICANON);
158 
159  //设置等待时间和最小接收字符
160  options.c_cc[VTIME] = 1; /* 读取一个字符等待1*(1/10)s */
161  options.c_cc[VMIN] = 1; /* 读取字符的最少个数为1 */
162 
163  //如果发生数据溢出,接收数据,但是不再读取 刷新收到的数据但是不读
164  tcflush(fd,TCIFLUSH);
165 
166  //激活配置 (将修改后的termios数据设置到串口中)
167  if (tcsetattr(fd,TCSANOW,&options) != 0)
168  {
169  perror("com set error!\n");
170  return (FALSE);
171  }
172  return (TRUE);
173 }
174 
175  /*******************************************************************
176  * 名称: UART0_Init()
177  * 功能: 串口初始化
178  * 入口参数: fd : 文件描述符
179  * speed : 串口速度
180  * flow_ctrl 数据流控制
181  * databits 数据位 取值为 7 或者8
182  * stopbits 停止位 取值为 1 或者2
183  * parity 效验类型 取值为N,E,O,,S
184  *
185  * 出口参数: 正确返回为1,错误返回为0
186  *******************************************************************/
187  int UART0_Init(int fd, int speed,int flow_ctrl,int databits,int stopbits,int parity){
188  int err;
189  //设置串口数据帧格式
190  if (UART0_Set(fd,speed,flow_ctrl,databits,stopbits,'N') == FALSE){
191  return FALSE;
192  }
193  else{
194  return TRUE;
195  }
196  }
197 
198  /*******************************************************************
199  * 名称: UART0_Recv
200  * 功能: 接收串口数据
201  * 入口参数: fd :文件描述符
202  * rcv_buf :接收串口中数据存入rcv_buf缓冲区中
203  * data_len :一帧数据的长度
204  * 出口参数: 正确返回为1,错误返回为0
205  *******************************************************************/
206  int UART0_Recv(int fd, char *rcv_buf,int data_len){
207  int len,fs_sel;
208  fd_set fs_read;
209 
210  struct timeval time;
211 
212  FD_ZERO(&fs_read);
213  FD_SET(fd,&fs_read);
214 
215  time.tv_sec = 10;
216  time.tv_usec = 0;
217 
218  //使用select实现串口的多路通信
219  fs_sel = select(fd+1,&fs_read,NULL,NULL,&time);
220  if(fs_sel){
221  len = read(fd,rcv_buf,data_len);
222  // printf("I am right!(version1.2) len = %d fs_sel = %d\n",len,fs_sel);
223  return len;
224  }
225  else{
226  printf("Sorry,I am wrong!");
227  return FALSE;
228  }
229  }
230 
231  /********************************************************************
232  * 名称: UART0_Send
233  * 功能: 发送数据
234  * 入口参数: fd :文件描述符
235  * send_buf :存放串口发送数据
236  * data_len :一帧数据的个数
237  * 出口参数: 正确返回为1,错误返回为0
238  *******************************************************************/
239  int UART0_Send(int fd, char *send_buf,int data_len){
240  int len = 0;
241 
242  len = write(fd,send_buf,data_len);
243  if (len == data_len ){
244  return len;
245  }
246  else{
247  tcflush(fd,TCOFLUSH);
248  return FALSE;
249  }
250 
251  }
252 };
253 
254 } // namespace dumpbot_serial_func
255 
256 #endif /* DUNPBOT_SERIAL_FUNC_HPP */
int UART0_Recv(int fd, char *rcv_buf, int data_len)
int UART0_Set(int fd, int speed, int flow_ctrl, int databits, int stopbits, int parity)
Definition: seiral_func.hpp:52
#define TRUE
Definition: seiral_func.hpp:38
int UART0_Init(int fd, int speed, int flow_ctrl, int databits, int stopbits, int parity)
#define FALSE
Definition: seiral_func.hpp:37
int UART0_Send(int fd, char *send_buf, int data_len)


cht10_node
Author(s): Carl <1271087623@qq.comd>
autogenerated on Mon Jun 10 2019 12:48:57