MODBUS RTU time_out实现
MODBUS RTU协议规定,一个MODBUS的帧结束是3.5倍字符的时间。
在实现上包括2种实现方式
1 uart芯片本身就提供 time_out功能
如 带有FIFO功能的芯片,为了保证在收到FIFO内容且没有达到FIFO中断的长度,设置了time_out中断。软件只需设置该中断,该中断发生时,就意味着MODBUS RTU协议的帧结束。需要注意的是,在FIFO中断时,不要把FIFO内容完全读完,保留1个字节在FIFO中,否则可能不会发生time_out中断。
如下面的芯片SC16IS762
2 芯片不提供FIFO功能,也不提供time_out功能,比如很多单片机
这时需要设置一个根据波特率的超时时间的表格和一个time_out的变量,每收到一个字符,time_out= 超时时间;而在定时中断里面 time_out--,如果 time_out减至0,则MODBUS RTU协议的帧结束。
或者直接设置一个定时器,中断时间= 定时器当前时间+ 超时时间,一旦中断发生则MODBUS RTU协议的帧结束。
int time_out
串口接收中断
time_out= 超时表 [ 波特率]
定时器中断
if( time_out )
{
if (time_out==1 ) 帧结束 处理
else time_out--
}
}