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");
        }
    }
}
  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值