linux串口接收数据不完整拆包情况解决方案
【随笔|linux串口接收数据不完整拆包情况解决方案】去年在使用linux串口的时候,出现大于8个字节数据接收时自动拆成每个包8个字节的情况,当时处理方案是判断串口的首位字符判断接收完成。后来在使用qt做串口时收到启发,如果刚接收到串口有数据的信号量时,立即触发槽函数,就会出现数据不完整情况,原因是程序一检测到缓存区有数据便触发信号量,此时立刻读缓存区,数据还没有接收完,就会出现拆包情况。
解决方案很简单,在select()后面加上一点延时即可。
void uart_recv(int fd)
{
char data[1024];
int len=0, ret = 0;
fd_set fs_read;
struct timeval tv_timeout;
FD_ZERO(&fs_read);
FD_SET(fd, &fs_read);
tv_timeout.tv_sec= 6000;
//(10*20/115200+2);
tv_timeout.tv_usec = 0;
while (1)
{
ret = select(fd+1, &fs_read, NULL, NULL, &tv_timeout);
usleep(10000);
printf("ret = %d\n", ret);
if (FD_ISSET(fd, &fs_read)) {
memset(data,0,sizeof(data));
len = read(fd, data, sizeof(data));
printf("len: %d(bytes) recv: %s\n", len, data);
} else {
perror("select");
}
}
}
推荐阅读
- Linux|109 个实用 shell 脚本
- linux笔记|linux 常用命令汇总(面向面试)
- 计算机网络|计算机网络——DHCP协议详解
- Linux|Linux--网络基础
- 网络|一文彻底搞懂前端监控
- linux|apt update和apt upgrade命令 - 有什么区别()
- 网络夺命连环问系列|网络夺命连环问5--HTTP怎么传输大文件()
- 网络|网络编程释疑(TCP连接拔掉网线后会发生什么)
- linux|2022年云原生趋势
- 网络|简单聊聊压缩网络