串口通信怎么设置modbus协议(Linux串口接收优化针对modbus协议)
在Linux下编写Modbus协议的串口接收驱动时,之前看过几种其他实现方式,但都不理想。以下提出一种实现方式,经工程应用后发现比较简单可靠,并且稳定。
Modbus协议串口接收实现方式的主要思路是:
(1) 当前串口有接收数据,开始计时;
(2) 如果一定时间内,串口又有接收数据,则重新开始计时;
(3) 如果一定时间后,串口没有接收数据,则认为上一帧接收完毕。
通过查阅资料得知,Linux有API函数能够随时查询串口上当前可读取的字节数,所以对处理串口接收及帧间隔的逻辑进行简化,流程图如图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接收处理代码
该方法已经在工程实践中验证过,简单可靠,并且稳定。
如需要源代码及测试例程,可联系我获取。
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com