Linux串口特殊字符处理问题

一、问题描述

       在嵌入式linux系统中通过串口收发数据,特殊字符如0x03,0x00等导致接收数据截断等现象。

二、原因分析

       1、在对串口进行配置的时候 struct termios 结构体参数设置问题,特殊字符在串口驱动内部做了处理,导致应用层接收不到数据

       2、或则是在应用层接收数据后,数据拷贝出现的问题,如果使用C++语言,通过赋值拷贝遇到结束符(0x00)结束拷贝,导致数据截断

三、解决方法

1、修改文件描述符fd相关的结构体struct termios配置,如:c_iflag,c_oflag,如下:

	options.c_iflag &= ~(BRKINT | ICRNL | ISTRIP | IXON);
    options.c_lflag  &= ~(ICANON | ECHO | ECHOE | ISIG);  /*Input*/
    options.c_oflag  &= ~OPOST;   /*Output*/
    tcflush( g_uartfd[uart_num], TCIFLUSH );
    options.c_cc[VTIME] = 128;
    options.c_cc[VMIN] = 1;

2、在数据传递到应用层后,数据如果是hex码的,最好通过深度拷贝方式,传递需要拷贝数据的长度,如:std::string assign(buf, length)

 

Note:详细的串口结构体参数说明请参考linux kernel Maunal page

 

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux中,可以通过串口设备节点来控制串口的发送和接收。要同时发送数据,需要先打开串口设备节点,然后将要发送的数据写入串口设备节点中。如果需要控制两个串口同时发送数据,需要打开两个串口设备节点,并将要发送的数据分别写入两个串口设备节点中。 在Linux中,可以使用如下的命令打开串口设备节点: ``` sudo chmod 666 /dev/ttyUSB0 ``` 其中,/dev/ttyUSB0是需要打开的串口设备节点。使用chmod命令将串口设备节点的权限设置为可读可写。 接下来,可以使用open()函数打开串口设备节点: ```c++ int fd; fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY); if (fd < 0) { perror("Open ttyUSB0 error"); return -1; } ``` 这里使用了O_RDWR | O_NOCTTY | O_NDELAY标志打开串口设备节点,其中: • O_RDWR:可读可写 • O_NOCTTY:表示该程序不会成为端口的控制终端,即不会产生CTRL-C等特殊字符来干扰串口数据传输 • O_NDELAY:表示本程序不关心DCD信号线状态,当串口接收数据时,本程序不会阻塞 打开串口设备节点后,可以使用write()函数将要发送的数据写入串口设备节点: ```c++ int len; len = write(fd, buf, size); if (len != size) { perror("Write ttyUSB0 error"); return -1; } ``` 其中,fd是打开的串口设备节点,buf是要发送的数据缓存,size是要发送的数据长度。如果发送成功,write()函数将返回实际发送的数据长度,如果发送失败,将返回-1。 以上是同时控制一个串口发送数据的基本方法,如果要同时控制两个串口发送数据,则需要打开两个串口设备节点,并分别写入相应的数据。总的来说,Linux中控制串口发送数据过程比较简单,只需要打开串口设备节点,并使用write()函数将数据写进去即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值