首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

linux下的串口编程—线程接收

linux下的串口编程—线程接收

前言:
    在稍微大点的项目中,且是并发的,基本上都要使用线程来接收数据。

一,源码
    (1) 头文件
                                                点击(此处)折叠或打开               
       
                       
                           
  •                                 /*
                           
  •                                  * upper,上位机                       
  •                                  * {                       
  •                                  */                       
  •                        
  •                                 /* 串口的初始化 */                       
  •                                 extern     int32_t        com_init_upper(void *param);                       
  •                        
  •                                 /* 串口的发送 */                       
  •                                 extern    int32_t        com_send_upper(uint8_t *send_buffer,int32_t buffer_len);                       
  •                        
  •                                 /* 串口参数设置                       
  •                                  * 波特率,停止位,校验位,流控制,异步同步等                       
  •                                  */                       
  •                                 extern    int32_t        com_set_upper(void *param);                       
  •                        
  •                                 /* 串口设置参数生效 */                       
  •                                 extern    int32_t        com_set_effect_upper(void *param);                       
  •                        
  •                                 /* 串口关闭*/                       
  •                                 extern    int32_t        com_close_upper(void *param);                       
  •                        
  •                                 /* 串口接收线程关闭 */                       
  •                                 extern    int32_t        com_recv_thread_close(void *param);                       
  •                                 /*                       
  •                                  * upper,上位机                       
  •                                  * }                       
  •                                  */               
       

   
    (2) *.c 文件
                                                点击(此处)折叠或打开               
       
       
                           
  •                                 /*
                           
  •                                  * upper,上位机                       
  •                                  * {                       
  •                                  */                       
  •                        
  •                                 #define    UPPER_DEVICE_COM            "/dev/ttySAC3"                       
  •                                 /* 串口数据接收线程(是上位机(pc)与 Real210开发板通信) */                       
  •                                 static    pthread_t    com_recv_threadid    = 0;                       
  •                        
  •                                 static    int32_t        upper_device_comfd = 0;        /* 与上位机通信的串口的描述符(PC机) */                       
  •                        
  •                        
  •                                 /* 串口的基本配置 */                       
  •                                 static     int32_t        _com_set_upper()                       
  •                                 {                       
  •                                     int32_t    ret = 0;                       
  •                        
  •                                 //    ret = __com_set(upper_device_comfd,B115200);                       
  •                                     int32_t fd = upper_device_comfd;                       
  •                                     struct termios opt;                       
  •                                 //    struct timeval start;                       
  •                        
  •                                     tcgetattr(fd, &opt);                       
  •                                     cfsetispeed(&opt, B115200);                       
  •                                     cfsetospeed(&opt, B115200);                       
  •                                 //    cfsetispeed(&opt, baud_rate);                       
  •                                 //    cfsetospeed(&opt, baud_rate);                       
  •                        
  •                                     // 8n1                       
  •                                     opt.c_cflag &= ~CSIZE;                       
  •                                     opt.c_cflag &= ~CSTOPB;                       
  •                                     opt.c_cflag &= ~PARENB;         // 无奇偶校验                       
  •                                     opt.c_cflag |= CS8;                       
  •                        
  •                                     opt.c_cflag &= ~CRTSCTS;        // 没有使用硬件流控制                       
  •                        
  •                                 //    opt.c_cflag &= ~INPCK;                       
  •                                     opt.c_cflag |= (CLOCAL | CREAD);                // Enable the receiver and set local mode                       
  •                        
  •                                 //    opt.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);    // 原始数据                       
  •                                     opt.c_lflag |= (ICANON | ECHO | ECHOE);    // 经典数据                       
  •                        
  •                                     opt.c_oflag &= ~OPOST;                       
  •                                     opt.c_oflag &= ~(ONLCR | OCRNL);             // 添加的                       
  •                        
  •                                     opt.c_iflag &= ~(ICRNL | INLCR);                       
  •                                     opt.c_iflag &= ~(IXON | IXOFF | IXANY);         // 没有软件流控制                       
  •                        
  •                                     tcflush(fd, TCIOFLUSH);                       
  •                        
  •                                     opt.c_cc[VTIME] = 1;    // 以 十分之一秒(1/10 s) 为单位                       
  •                                     opt.c_cc[VMIN] = 0;                       
  •                        
  •                        
  •                        
  •                                     if(tcsetattr(fd, TCSANOW, &opt) != 0 )                       
  •                                     {                       
  •                                            perror("tcsetattr error");                       
  •                                            return -COM_CONFIG_ERROR;                       
  •                                     }                       
  •                        
  •                                     return OPER_OK;                       
  •                                 }                       

继承事业,薪火相传
返回列表