zoukankan      html  css  js  c++  java
  • 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! 
    ", 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
    ", ret);
     72         if (FD_ISSET(fd, &fs_read)) {
     73             len = read(fd, data, sizeof(data));
     74             printf("len: %d(bytes) recv: %s
    ", 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, '', 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 !
    ");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 !
    ");exit(0);
    108         }
    109     }
    110     else{
    111         printf("parameter count error!
    ");
    112         return 0;
    113     }
    114 
    115     init_serial();
    116     printf("current BaudRate is %d
    ", 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 }
  • 相关阅读:
    vue 前端处理监听关键字搜索
    小程序引入背景图片
    解决vue低版本安卓手机兼容性问题
    js和jq实现全选反选
    SVN使用教程
    CSS如何修改tr边框属性
    在小程序中使用md5
    jquery ajax在 IE8/IE9 中无效
    vue 选择图片(限定大小)上传到服务器
    当获取图片失败时候,显示默认图片
  • 原文地址:https://www.cnblogs.com/fwst/p/4022677.html
Copyright © 2011-2022 走看看