1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <sys/types.h>
5 #include <sys/stat.h>
6 #include <fcntl.h> //文件控制定义
7 #include <termios.h>//终端控制定义
8 #include <errno.h>
9
10 char *comport;
11 int bRate = 0;
12
13 int serial_fd = 0;
14
15 //打开串口并初始化设置
16 int init_serial(void)
17 {
18 serial_fd = open(comport, O_RDWR | O_NOCTTY | O_NDELAY);
19 if (serial_fd < 0) {
20 perror("open");
21 return -1;
22 }
23 else
24 printf("open %s success! \n", comport);
25
26 //串口主要设置结构体termios <termios.h>
27 struct termios options;
28
29 /**1. tcgetattr函数用于获取与终端相关的参数。
30 *参数fd为终端的文件描述符,返回的结果保存在termios结构体中
31 */
32 tcgetattr(serial_fd, &options);
33 /**2. 修改所获得的参数*/
34 options.c_cflag |= (CLOCAL | CREAD);//设置控制模式状态,本地连接,接收使能
35 options.c_cflag &= ~CSIZE;//字符长度,设置数据位之前一定要屏掉这个位
36 options.c_cflag &= ~CRTSCTS;//无硬件流控
37 options.c_cflag |= CS8;//8位数据长度
38 options.c_cflag &= ~CSTOPB;//1位停止位
39 options.c_iflag |= IGNPAR;//无奇偶检验位
40 options.c_oflag = 0; //输出模式
41 options.c_lflag = 0; //不激活终端模式
42
43 switch(bRate)
44 {
45 case 9600:cfsetospeed(&options, B9600);break;//设置波特率
46 case 115200:cfsetospeed(&options, B115200);break;//设置波特率
47 }
48
49 /**3. 设置新属性,TCSANOW:所有改变立即生效*/
50 tcflush(serial_fd, TCIFLUSH);//溢出数据可以接收,但不读
51 tcsetattr(serial_fd, TCSANOW, &options);
52
53 return 0;
54 }
55
56 void uart_recv(int fd)
57 {
58 char data[1024];
59 int len=0, ret = 0;
60 fd_set fs_read;
61 struct timeval tv_timeout;
62
63 FD_ZERO(&fs_read);
64 FD_SET(fd, &fs_read);
65 tv_timeout.tv_sec = 6000;//(10*20/115200+2);
66 tv_timeout.tv_usec = 0;
67
68 while (1)
69 {
70 ret = select(fd+1, &fs_read, NULL, NULL, &tv_timeout);
71 //printf("ret = %d\n", ret);
72 if (FD_ISSET(fd, &fs_read)) {
73 len = read(fd, data, sizeof(data));
74 printf("len: %d(bytes) recv: %s\n", len, data);
75 } else {
76 perror("select");
77 }
78 }
79 }
80
81 int main(int argc, char **argv)
82 {
83 comport = (char *)malloc(1024);
84 memset(comport, '\0', sizeof(comport));
85 if (argc == 1)
86 {
87 comport = "/dev/ttyS6";
88 bRate = 9600;
89 }
90 else if (argc == 3)
91 {
92 switch(atoi(argv[1]))
93 {
94 case 0:comport = "/dev/ttyS0";break;
95 case 1:comport = "/dev/ttyS1";break;
96 case 2:comport = "/dev/ttyS2";break;
97 case 3:comport = "/dev/ttyS3";break;
98 case 4:comport = "/dev/ttyS4";break;
99 case 5:comport = "/dev/ttyS5";break;
100 case 6:comport = "/dev/ttyS6";break;
101 default: printf("argv[0](com port id) should be 0 to 6 !\n");exit(0);
102 }
103 switch(atoi(argv[2]))
104 {
105 case 9600: bRate = 9600; break;
106 case 115200: bRate = 115200; break;
107 default: printf("argv[1](bRate) should be 9600 or 115200 !\n");exit(0);
108 }
109 }
110 else{
111 printf("parameter count error!\n");
112 return 0;
113 }
114
115 init_serial();
116 printf("current BaudRate is %d\n", bRate);
117 //uart_send(serial_fd, buf, sizeof(buf));
118 uart_recv(serial_fd);
119 free(comport);
120 close(serial_fd);
121 return 0;
122 }