一、问题描述
在嵌入式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