Toggle navigation
首页
问答
文章
话题
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Modbus
FreeModbus的从机调试说明(含测试程序)
发布于 2018-06-06 17:58:00 浏览:9362
订阅该版
* 本帖最后由 shauew 于 2018-12-18 10:02 编辑 * 最近在调试**armink**大佬的FreeModbus时遇到些问题,在论坛中发帖求助,得到**armink**大佬的支持,并建议写篇文章分析,于是就有了这篇文章。 **1. console与modbus的冲突问题** 我使用的板子仅有一个串口,平时是用来做rt_kprintf输出的,但ModbusRTU模式也会用到串口,同时配置使用会导致冲突的问题,于是这里需要先屏蔽console(**使用的RTT版本为3.0.3**)。 首先在**bsp/drivers/board.h**中进行屏蔽。代码如下: ```//
Console on USART: <0=> no console <1=>USART 1 <2=>USART 2 <3=> USART 3 //
Default: 1 #define STM32_CONSOLE_USART 0 void rt_hw_board_init(void); #if STM32_CONSOLE_USART == 0 #define CONSOLE_DEVICE "no" #elif STM32_CONSOLE_USART == 1 #define CONSOLE_DEVICE "uart1" #elif STM32_CONSOLE_USART == 2 #define CONSOLE_DEVICE "uart2" #elif STM32_CONSOLE_USART == 3 #define CONSOLE_DEVICE "uart3" #elif STM32_CONSOLE_USART == 4 #define CONSOLE_DEVICE "uart4" #elif STM32_CONSOLE_USART == 5 #define CONSOLE_DEVICE "uart5" #elif STM32_CONSOLE_USART == 6 #define CONSOLE_DEVICE "lpuart1" #endif #define FINSH_DEVICE_NAME CONSOLE_DEVICE``` 将**STM32_CONSOLE_USART**配置为0,可以屏蔽console,但需要注意的是,这样屏蔽并不完全,还需要在**rtconfig.h**中进行屏蔽。代码如下: ```#define RT_USING_DEVICE /* RT_USING_INTERRUPT_INFO is not set */ #define RT_USING_CONSOLE #define RT_CONSOLEBUF_SIZE 128 #define RT_CONSOLE_DEVICE_NAME "no"``` 这里的**RT_CONSOLE_DEVICE_NAME**需要与**board.h**中 配置一致,如"no/uart1/uart2"等。很多时候我们会配置其中一个地方而忘记另一个地方,导致配置失效,看后续能否把这两处配置移到同一个文件中进行,这样就不会出问题了。 **2. 使能modbus对应的串口** 这里我们使用的是uart1,需要在rtconfig.h中进行配置以保证系统启动后能初始化串口。代码如下: ```#define RT_USING_UART1``` 这能保证系统启动后能调用ld文件中的初始化函数列表中的**stm32_hw_usart_init**来对我们要使用的串口进行初始化。 **3. modbus从机示例代码** 自己写了一个简单的从机示例代码,如下: ```#include
#include
#include
#include
#include "user_mb_app.h" #define thread_ModbusSlavePoll_Prio 10 static rt_uint8_t thread_ModbusSlavePoll_stack[512]; struct rt_thread thread_ModbusSlavePoll; /** * \brief Modbus从机轮询入口 */ void thread_entry_ModbusSlavePoll (void* parameter) { // 端口选择Port1 即Uart1 eMBInit(MB_RTU, 0x01, 1, 115200, MB_PAR_EVEN); eMBEnable(); while (1) { eMBPoll(); } } void test_modbus (void) { rt_thread_init(&thread_ModbusSlavePoll, "MBSlavePoll", thread_entry_ModbusSlavePoll, RT_NULL, thread_ModbusSlavePoll_stack, sizeof(thread_ModbusSlavePoll_stack), thread_ModbusSlavePoll_Prio, 5); rt_thread_startup(&thread_ModbusSlavePoll); }``` 使用**eMBInit**来完成初始化配置,协议采用ModbusRTU;0x01表示从机子地址;1表示端口1,即uart1;115200表示从机波特率;MB_PAR_EVEN表示采用偶校验。只需要在主程序中调用**test_modbus**即可开始从机测试。 **4. 采用 modbus poll 软件来测试从机** 使用串口连接板子和PC,打开modbus_poll软件配置端口,如图所示:  点击菜单栏Connection,选择好协议、端口、波特率等参数,点击OK开始连接。  连接成功后点击寄存器地址来修稿保持寄存器的值,需要配置从机ID,寄存器地址等参数。  配置完成后能看到对应寄存器值同步更新。 **5. 修改modbus从机寄存器值** 编写从机的初衷是希望主机能及时查询到从机值的变化,我们可以使用**eMBRegHoldingCB**接口来改写保持寄存器的值,接口原型如下: ```eMBErrorCode eMBRegHoldingCB(UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegisterMode eMode)``` 需要配置的参数是待写入的数据缓冲区指针、寄存器首地址、写入的寄存器个数以及操作模式(读或写)。 **6. 关于modbus的寄存器浮点数问题** 单精度浮点数占4个字节32bits,modbus单个寄存器空间为2个字节16bits,可以在连续的两个寄存器中存放单精度浮点数的高段和低段来存储一个单精度浮点数。需要注意的是存储方式需要根据主机对浮点数的读取方式来做应对,如区分是**低字优先还是高字优先**、**先高后低还是先低后高**。 这里也给一种浮点数转成字或字节的解决方案,如下: ``` /** * \brief 单精度浮点数联合体 */ typedef union { float f; uint8_t buf[4]; } __data_float;``` 装载浮点数后可以分解成字节的形式,在根据主机的读取方式来倒装,最后写入寄存器。 **that's all, thank you!**
查看更多
28
个回答
默认排序
按发布时间排序
armink
2018-06-06
This guy hasn't written anything yet
不错呀,图文并茂,流程清晰,感谢你的分享
shauew
2018-06-06
This guy hasn't written anything yet
[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=35157&ptid=7282][color=#999999]armink 发表于 2018-6-6 18:38[/color][/url][/size] 不错呀,图文并茂,流程清晰,感谢你的分享[/quote] 有点浅,不好意思哦。
phoniex2004
2018-06-07
This guy hasn't written anything yet
在MODBUS里,方向控制脚怎么设置呢?
shauew
2018-06-07
This guy hasn't written anything yet
[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=35175&ptid=7282][color=#999999]phoniex2004 发表于 2018-6-7 14:29[/color][/url][/size] 在MODBUS里,方向控制脚怎么设置呢?[/quote] 我使用的是无流控的,流控脚配置成了一个未使用的脚。 需要在board.h中宏定义好流控脚,如下: [code]// Modbus pin config //__STM32_PIN(42, A, 9), //__STM32_PIN(43, A, 10), //__STM32_PIN(2, C, 13), //未使用 #define MODBUS_SLAVE_RT_CONTROL_PIN_INDEX 2 //物理并未连接流控脚 So选用一个保留脚[/code] 如果你硬件上使用了流控,把流控脚宏定义成你使用的引脚,并在初始化modbus前先初始化对应的GPIO口即可。
zxcmcu
2018-07-03
This guy hasn't written anything yet
slave模式波特率设为9600压根通信不上? 115200 也会隔一会出现一个超时错误。。。 咋回事,你们遇见了么?
shauew
2018-07-05
This guy hasn't written anything yet
[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=35571&ptid=7282][color=#999999]zxcmcu 发表于 2018-7-3 11:09[/color][/url][/size] slave模式波特率设为9600压根通信不上? 115200 也会隔一会出现一个超时错误。。。 咋回事,你们遇见了么? ...[/quote] 9600可以通讯,大约隔10个包会有一次超时,最近在干其他事,还没研究这个问题。
yaomo718
2018-08-04
This guy hasn't written anything yet
我用freemodbus的时候提示字节丢失错误[attach]4906[/attach] 但是我看通讯数据的时候觉得数据没有问题啊![attach]4907[/attach] 那个大神能给我指点一下?
shauew
2018-08-06
This guy hasn't written anything yet
[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=36568&ptid=7282][color=#999999]yaomo718 发表于 2018-8-4 12:27[/color][/url][/size] 我用freemodbus的时候提示字节丢失错误 但是我看通讯数据的时候觉得数据没有问题啊! 那个大神能给我指点一 ...[/quote] 回复帧是不是少了两个字节? 之前有网友告诉我把系统时钟由10ms调成1ms会好一点,你可以试试看.
hyz_rtt
2018-08-29
This guy hasn't written anything yet
还有一个需要注意的就是输入输出引脚模式设为浮空输入,我用F4板子,起初移植不行,很头疼啊,便取看armink的代码,看到串口设置,发现是浮空输入。。。。
shauew
2018-08-30
This guy hasn't written anything yet
[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=37515&ptid=7282][color=#999999]hyz_rtt 发表于 2018-8-29 22:02[/color][/url][/size] 还有一个需要注意的就是输入输出引脚模式设为浮空输入,我用F4板子,起初移植不行,很头疼啊,便取看armink ...[/quote] OK
撰写答案
登录
注册新账号
关注者
0
被浏览
9.4k
关于作者
shauew
This guy hasn't written anything yet
提问
28
回答
138
被采纳
0
关注TA
发私信
相关问题
1
ModbusRTU协议栈漏发送最后一个字节
2
3.0 增加freemodbus,编译不过
3
RT_THREAD上面的串口MODBUSRTU为啥没功能码?
4
关于 freemodbus 里存在的一点问题分享
5
请教如何使用组件里的FreeMODBUS
6
求一个FreeModbus的从机测试程序
7
rtt_freemodbus
8
freemodbus怎么配置到uart
9
FreeModeBus从机调试问题
10
FreeModbus的从机可以使用一个端口模拟多个从机吗?
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
五分钟玩转RT-Thread新社区
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
6
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
7
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
8
国产MCU移植系列教程汇总,欢迎查看!
9
STM32的“GPU”——DMA2D实例详解
10
RT-Thread隐藏的宝藏之completion
最新文章
1
串口发送函数解析 -- 关于流模式
2
自定义协议的智能家居节点实现
3
基于RT1060EVKB+LVGL的便携移动示波器
4
基于RT-Thread+RA6M4的 蓝牙无线点灯
5
LWIP内存占用与裁剪
热门标签
RT-Thread Studio
串口
LWIP
AT
Env
FinSH
SPI
ART-Pi
Bootloader
Hardfault
USB
CAN
文件系统
DMA
studio
RT-Thread
线程
Nano
stm32
MQTT
SCons
ota
ESP8266
rtthread
UART
freemodbus
I2C
flash
软件包
定时器
RTC
cubemx
W5500
FAL
rtt
rt-smart
BSP
PWM
AB32VG1
ADC
编译报错
msh
socket
SDIO
SFUD
C++
MicroPython
中断
RT-Studio
keil
本月问答贡献
crystal266
19
个答案
11
次被采纳
lchnu
5
个答案
2
次被采纳
小小李sunny
8
个答案
1
次被采纳
rcp
7
个答案
1
次被采纳
RTT_逍遥
7
个答案
1
次被采纳
本月文章贡献
不讲武德的老法师
3
篇文章
4
次点赞
RTT_逍遥
2
篇文章
6
次点赞
还没想好
1
篇文章
11
次点赞
RTT_Studio
1
篇文章
9
次点赞
qinyunti
1
篇文章
5
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部