freemodbus 3.5T定时器作用

freemodbus 是通过定时器判断启动接收准备完成和一帧数据接收结束的:

1.freemodbus启动时,接收状态机状态eRcvState 是STATE_RX_INIT状态并启动定时器,表明处于准备接收阶段。当处于准备接收阶段时,就有数据接收,进入接收状态机后由于还没有产生定时器溢出中断,所以无法将eRcvState的状态从STATE_RX_INIT改为STATE_RX_IDLE,所以这时eRcvState状态一直为STATE_RX_INIT状态,直到这帧数据的结束,之后进入STATE_RX_IDLE空闲状态,等待接收下一帧数据;当处于准备接收阶段时,没有数据接收则定时器溢出产生中断,在中断服务函数中会将eRcvState 状态从STATE_RX_INIT设置成STATE_RX_IDLE,并推送事件EV_READY,表示准备好。

2.当处于接收状态机状态eRcvState处于STATE_RX_IDLE状态时,中断接收触发接收状态机将eRcvState设置成STATE_RX_RCV表明接收状态,每接收完一个字节的数据都将定时器清零重新计数,当接收完最后一个字节时,重新启动定时器之后没有接收到数据,定时器没有重新计数从而计数溢出产生中断,在中断服务函数中推送接收完成一帧数据事件EV_FRAME_RECEIVED事件,之后将eRcvState设置成STATE_RX_IDLE。在eMBPoll函数中轮训到EV_FRAME_RECEIVED事件,则从uvRTUBuf接收缓存中取出一帧数据进行CRC16校验,校验通过则进行相应的处理,最后应答主机。

不同波特率定时时间计算:

1.freemodbus一帧的结束是通过串口3.5位传输的时间来判断的,当串口的波特率大于19200时超时时间是固定为1750us,当串口通信的波特率小于等于19200时,就有一个计算公式,用来计算超时时间。

2.串口可以设置成以下模式

起始位1bit + 数据位8bit + 停止位1bit 
起始位1bit + 数据位8bit + 停止位2bit 
起始位1bit + 数据位8bit + 校验位1bit + 停止位1bit
起始位1bit + 数据位8bit + 校验位1bit + 停止位2bit
位数10 11 12 ,取中间值11

3.5位时间的计算:1位传输时间是 1/audRate(s),1字节就是 11* 1/audRate(s) ,定时器溢出时间3.5*11* 1/audRate(s),转成整数运算7*11* 1/audRate*2(s)

定时配置是50us计一次字数,假设为X,则得出计算公式50*X(us) = 7*11* 1/audRate*2(s),推出X = 7*220000UL/BaudRate *2

freemodbus 两路继电器项目视频讲解,原理图的讲解、freemodbus在stm8s上的移植讲解、一帧数据的接收讲解、命令的响应,以及控制继电器的流程等

视频连接https://edu.csdn.net/course/detail/9180

购买视频可以获得原理图和源码

猜你喜欢

转载自blog.csdn.net/weixin_42867108/article/details/82227635