linux 串口接收

  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 }

 

posted @ 2014-10-13 17:32  凤舞十天  阅读(1868)  评论(0编辑  收藏  举报