uC/Modbus 用户手册——第八节 No_OS接口

目录

8.00 No_OS接口


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超时。

波特率

RTU超时(3.5字节时间)

RTU超时(计数频率1KHz)

9600

3646uS

5

19200

1823uS

3

38400

911uS

2

76800

456uS

2

115200

204uS

2

256000

137uS

2

例如,如果一个通道配置为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()执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值