目录
8.00 No_OS接口
uC/Modbus-S可以配置为工作在单线程环境(无RTOS)。
No_OS部分同样使用uC/Modbus提供的RTOS接口层。该层在7.00节中进行了详细讲解。
图8-1是不使用RTOS时接收模型的流程图。
图8-1 uC/Modbus Rx轮询模型
F8-1(1) |
uC/Modbus使用一个队列结构表示通道已接收到数据包。应用必须调用MB_OS_RxTask()轮询队列状态,如果队列包含至少一个元素,那么此函数将调用MB_RxTask(),它将简单地解析数据包并制定一个将被适当转发的响应。调用轮询函数的频率有应用程序决定。 |
|||||||||||||||||||||
F8-1(2) |
假设来自UART的字节是由中断驱动的。接收到字节被存放到一个接收缓存中,直到数据接收完成。如果通道配置为Modbus ASCII,数据包结尾是一个换行符(即,0x0A)。如果通道配置为Modbus RTU,如果3.5字节周期(参考Modbus RTU规范)内未收到任何数据则表示数据结束。 |
|||||||||||||||||||||
F8-1(3) |
假设是Modbus ASCII,通过调用MB_OS_RxSignal()并指定一个指向已接收数据通道的指针来发出数据包结束信号。 |
|||||||||||||||||||||
F8-1(4) |
如果您的产品需要支持Modbus RTU模式,就需要提供一个定时器来中断CPU以便跟踪数据包的结束。基本上,当通道上接收一个字节的时候,该通道的RTU计数器将根据该通道的波特率重置为一个值(见表7-1)。 表7-1,基于通道波特率的RTU超时。
例如,如果一个通道配置为19200的波特率,在1800us中未接收到任何字节视为数据包结束(RTU模式)。如果RTU计时器被设置为每毫秒中断一次,那么大约需要两次这样的中断,然后才能断定收到了一个数据包。我们决定假设一个数据包至少是在接收5.0字节的时间之后接收完成,而不是3.5字节的时间后。此外,由于计时器相对接收字节的异步特性,我们决定计算至少两个RTU中断,以得出收到数据包的结论。 如果增加RTU计时器中断率,对于超时可以有更好的粒度。但是,这也增加了您放置在CPU上的开销。 |
|||||||||||||||||||||
F8-1(5) |
当RTU定时器中断发生,每个RTU模式通道的超时计数器开始向下计数。当计数器为0时,向“Modbus Rx Task”发送一个信号。告诉“Modbus Rx Task”哪一个通道收到了数据需要处理。信号也可以调用MB_OS_RxSignal()执行。 |