当前位置:   article > 正文

linux c 串口编程_串口 select timeout tv_usec

串口 select timeout tv_usec
  1. arch/arm/include/asm/termbits.h  
  2. struct termios {  
  3.     tcflag_t c_iflag;       /* input mode flags */  
  4.     tcflag_t c_oflag;       /* output mode flags */  
  5.     tcflag_t c_cflag;       /* control mode flags */  
  6.     tcflag_t c_lflag;       /* local mode flags */  
  7.     cc_t c_line;            /* line discipline */  
  8.     cc_t c_cc[NCCS];        /* control characters */  
  9. };  
  10. 串口的设置主要是设置struct termios结构体的各成员  
  11. /** 
  12. *s3c6410 serial_test 
  13. *测试的时候应用程序在后台运行./serial_test & 
  14. */  
  15. #include <stdio.h>  
  16. #include <stdlib.h>  
  17. #include <unistd.h>  
  18. #include <sys/types.h>  
  19. #include <sys/stat.h>  
  20. #include <fcntl.h> //文件控制定义  
  21. #include <termios.h>//终端控制定义  
  22. #include <errno.h>  
  23.  
  24. #define DEVICE "/dev/s3c2410_serial0"  
  25.   
  26. int serial_fd = 0;  
  27.   
  28. //打开串口并初始化设置  
  29. init_serial(void)  
  30. {  
  31.     serial_fd = open(DEVICE, O_RDWR | O_NOCTTY | O_NDELAY);  
  32.     if (serial_fd < 0) {  
  33.         perror("open");  
  34.         return -1;  
  35.     }  
  36.       
  37.     //串口主要设置结构体termios <termios.h>  
  38.     struct termios options;  
  39.       
  40.     /**1. tcgetattr函数用于获取与终端相关的参数。 
  41.     *参数fd为终端的文件描述符,返回的结果保存在termios结构体中 
  42.     */  
  43.     tcgetattr(serial_fd, &options);  
  44.     /**2. 修改所获得的参数*/  
  45.     options.c_cflag |= (CLOCAL | CREAD);//设置控制模式状态,本地连接,接收使能  
  46.     options.c_cflag &= ~CSIZE;//字符长度,设置数据位之前一定要屏掉这个位  
  47.     options.c_cflag &= ~CRTSCTS;//无硬件流控  
  48.     options.c_cflag |= CS8;//8位数据长度  
  49.     options.c_cflag &= ~CSTOPB;//1位停止位  
  50.     options.c_iflag |= IGNPAR;//无奇偶检验位  
  51.     options.c_oflag = 0; //输出模式  
  52.     options.c_lflag = 0; //不激活终端模式  
  53.     cfsetospeed(&options, B115200);//设置波特率  
  54.       
  55.     /**3. 设置新属性,TCSANOW:所有改变立即生效*/  
  56.     tcflush(serial_fd, TCIFLUSH);//溢出数据可以接收,但不读  
  57.     tcsetattr(serial_fd, TCSANOW, &options);  
  58.       
  59.     return 0;  
  60. }  
  61.   
  62. /** 
  63. *串口发送数据 
  64. *@fd:串口描述符 
  65. *@data:待发送数据 
  66. *@datalen:数据长度 
  67. */  
  68. int uart_send(int fd, char *data, int datalen)  
  69. {  
  70.     int len = 0;  
  71.     len = write(fd, data, datalen);//实际写入的长度  
  72.     if(len == datalen) {  
  73.         return len;  
  74.     } else {  
  75.         tcflush(fd, TCOFLUSH);//TCOFLUSH刷新写入的数据但不传送  
  76.         return -1;  
  77.     }  
  78.       
  79.     return 0;  
  80. }  
  81.   
  82. /** 
  83. *串口接收数据 
  84. *要求启动后,在pc端发送ascii文件 
  85. */  
  86. int uart_recv(int fd, char *data, int datalen)  
  87. {  
  88.     int len=0, ret = 0;  
  89.     fd_set fs_read;  
  90.     struct timeval tv_timeout;  
  91.       
  92.     FD_ZERO(&fs_read);  
  93.     FD_SET(fd, &fs_read);  
  94.     tv_timeout.tv_sec  = (10*20/115200+2);  
  95.     tv_timeout.tv_usec = 0;  
  96.       
  97.     ret = select(fd+1, &fs_read, NULL, NULL, &tv_timeout);  
  98.     printf("ret = %d\n", ret);  
  99.     //如果返回0,代表在描述符状态改变前已超过timeout时间,错误返回-1  
  100.       
  101.   
  102.           
  103.     if (FD_ISSET(fd, &fs_read)) {  
  104.         len = read(fd, data, datalen);  
  105.         printf("len = %d\n", len);  
  106.         return len;  
  107.     } else {  
  108.         perror("select");  
  109.         return -1;  
  110.     }  
  111.       
  112.     return 0;  
  113. }  
  114.   
  115. int main(int argc, char **argv)  
  116. {  
  117.     init_serial();  
  118.   
  119.     char buf[]="hello world";  
  120.     char buf1[10];  
  121.     uart_send(serial_fd, buf, 10);  
  122.     printf("\n");  
  123.   
  124.     uart_recv(serial_fd, buf1, 10);  
  125.       
  126.       
  127.     printf("uart receive %s\n", buf1);  
  128.     close(serial_fd);  
  129.     return 0;  

  1. }  

以上内容转载自:http://blog.csdn.net/shui1025701856/article/details/7571686

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/225175
推荐阅读
相关标签
  

闽ICP备14008679号