win7 读取串口数据_Linux串口接收优化——针对modbus协议

在Linux下编写Modbus协议的串口接收驱动时,之前看过几种其他实现方式,但都不理想。以下提出一种实现方式,经工程应用后发现比较简单可靠,并且稳定。

Modbus协议串口接收实现方式的主要思路是:

(1) 当前串口有接收数据,开始计时;

(2) 如果一定时间内,串口又有接收数据,则重新开始计时;

(3) 如果一定时间后,串口没有接收数据,则认为上一帧接收完毕。

通过查阅资料得知,Linux有API函数能够随时查询串口上当前可读取的字节数,所以对处理串口接收及帧间隔的逻辑进行简化,流程图如图1所示。

25d1132b490295dc8704ef6331cdea10.png

图1 Linux下modbus接收处理逻辑

对应的程序代码如图2所示。

#elif (COM_READ_STYLE_SELECT == COM_READ_STYLE_WAIT)    int nread1, nread2;    ioctl(com_fd_using, FIONREAD, &nread1);//获取串口当前可读取的字节数    if(nread1 > 0)//如果字节数大于0    {        usleep(RECV_FRAME_TIME_INTERVAL * 1000);//延时一定时间,取决于帧间隔        ioctl(com_fd_using, FIONREAD, &nread2);//再次获取串口当前可读取的字节数        if(nread2 == nread1)//如果两次字节数一样,说明系统底层已接收完一个完整数据帧        {            nread1 = nread2 > datalength ? datalength : nread2;//取可用字节数和要读取字节数中的较小者            nread2 = read(com_fd_using, data, nread1);//从系统底层读取串口接收数据            return nread2;//返回实际读取的字节数        }        else        {            return 0;//如果两次字节数不一样,说明系统底层还未接收完一个完整数据帧,则返回0        }    }    else    {        return 0;//如果没有可读取数据,则返回0    }#endif

图2 Linux下modbus接收处理代码

该方法已经在工程实践中验证过,简单可靠,并且稳定。

如需要源代码及测试例程,可联系我获取。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值