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

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

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

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

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

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

串口通信怎么设置modbus协议(Linux串口接收优化针对modbus协议)(1)

图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接收处理代码

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

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

,