这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 软件与操作系统 » 在RTT中libmodbus支持的数据位是怎样去配置的

共8条 1/1 1 跳转至

在RTT中libmodbus支持的数据位是怎样去配置的

菜鸟
2022-03-16 11:13:59     打赏

一、结论
大家都很忙,所以先说结论。
libmodbus 中支持的数据位为 5,6,7,8(图1)。 但是,如果使用STM32 并且配置了奇偶校验,那么正确的数据长度配置应该是9。
有人说这是ST的bug,其实,ST的参考手册中已经明确说明它就是要这样配置的。如下图2。
图一


图二


二、简介
这也是之前的一个项目上发现的,如图。 使用的是STM32F4, 用到了偶校验。 当时经过测试发现,无校验+8Bit 是没有问题的,于是重点检查了奇偶校验和8/9bit的问题。
下图中的 USART1->CR1 |= 0x1000,是手动设置数据位为9bit。临时解决方法,不要学我这样!


三、手把手教学时刻
libmodbus的代码我之前是看过的,质量值得信赖。基于这种信任,本次就不想从头看代码了(懒)。
我们这次的目的是定位和解决数据位的问题,以下是我的解决方法供大家参考,其实我更想表达的是解决这类问题的思路。
RTT的STM32底层外设初始化在stm32f4xx_hal_msp.c中(注意是最底层的初始化,像时钟打开IO配置等操作,具体参数配置不在这里)。
串口的相关驱动在 drv_usart.c 中。 知道这2点就够了,因为总要找到一个入口。这里我选择使用 stm32f4xx_hal_msp.c。
进入debug模式,并且在USARTx处设置一个断点。将程序执行到该处。

单步执行,直到进入 libmodbus的代码,这期间你会路过RTT的设备驱动,继续单步。直到如下:


这时我们已经进入到了 libmodbus 的代码区域,顺便也知道了。
继续单步,直到找到我们想要的,来张动图。


如上图,我们已经找到了数据位相关的代码。
添加代码这里确实没有 9bit的选项,需要我们给TA加上。并在相关头文件中加上 CS9 的定义。




不要忘记,RTT 有设备驱动管理,TA有一个 rt_device_control( ) 的相关接口,可以用于进行设备参数的修改配置,这里我们是串口设备。所以对应修改一下rt_serial_control( ) 函数。 如下2处都要添加:



这里的配置最终调用 serial->ops->configure(serial, &config) 写入到MCU 寄存器中。
四、其它细节
上述提到我们新添加了 CS9 的定义,注意这里的定义使用了8进制。
我这里主要修改了如下2处,
增加 CS9 定义为 10
CSIZE 修改为 70 (原来是60)

)
宏定义 CSIZE 是 CSx 的有效位总和, 用来mask它在 c_cflag 中的数据。例如:


因为 c_cflag 是一个标志位集合, 所以新添加的 CS9 要选择好bit。 10 没有使用,所以这里选择了 10。


五、验证至此,该bug已初步修复完成。我进行了简单的验证。


M位 (USART1->CR1 |= 0x1000), 已经被正确配置。


待工程全部验证无误后,会 PR 到 RTT。





关键词: libmodbus    

菜鸟
2022-03-16 11:46:47     打赏
2楼

专家
2022-03-16 12:00:15     打赏
3楼

参考和学习


工程师
2022-03-16 12:14:23     打赏
4楼

学习


工程师
2022-03-16 23:44:19     打赏
5楼

学习一下


工程师
2022-05-15 23:58:31     打赏
6楼

感谢分享


专家
2022-08-01 21:10:25     打赏
7楼

感谢分享


专家
2022-08-01 21:13:25     打赏
8楼

谢谢分享


共8条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]