Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Modbus
FreeModbus的从机调试说明(含测试程序)
发布于 2018-06-06 17:58:00 浏览:11041
订阅该版
* 本帖最后由 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软件配置端口,如图所示: ![menu.saveimg.savepath20180606162524.jpg](/uploads/201806/06/182259jcxgpswchpqcarwb.jpg) 点击菜单栏Connection,选择好协议、端口、波特率等参数,点击OK开始连接。 ![menu.saveimg.savepath20180606162553.jpg](/uploads/201806/06/182259zgouzxe7qogchgg7.jpg) 连接成功后点击寄存器地址来修稿保持寄存器的值,需要配置从机ID,寄存器地址等参数。 ![menu.saveimg.savepath20180606162605.jpg](/uploads/201806/06/182259soalzm3a3kmm22ma.jpg) 配置完成后能看到对应寄存器值同步更新。 **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!**
查看更多
30
个回答
默认排序
按发布时间排序
armink
2018-06-06
这家伙很懒,什么也没写!
不错呀,图文并茂,流程清晰,感谢你的分享
shauew
2018-06-06
这家伙很懒,什么也没写!
>不错呀,图文并茂,流程清晰,感谢你的分享 --- 有点浅,不好意思哦。
phoniex2004
2018-06-07
这家伙很懒,什么也没写!
在MODBUS里,方向控制脚怎么设置呢?
shauew
2018-06-07
这家伙很懒,什么也没写!
>在MODBUS里,方向控制脚怎么设置呢? --- 我使用的是无流控的,流控脚配置成了一个未使用的脚。 需要在board.h中宏定义好流控脚,如下: ``` // 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选用一个保留脚 ``` 如果你硬件上使用了流控,把流控脚宏定义成你使用的引脚,并在初始化modbus前先初始化对应的GPIO口即可。
zxcmcu
2018-07-03
这家伙很懒,什么也没写!
slave模式波特率设为9600压根通信不上? 115200 也会隔一会出现一个超时错误。。。 咋回事,你们遇见了么?
shauew
2018-07-05
这家伙很懒,什么也没写!
>slave模式波特率设为9600压根通信不上? >115200 也会隔一会出现一个超时错误。。。 >咋回事,你们遇见了么? ... --- 9600可以通讯,大约隔10个包会有一次超时,最近在干其他事,还没研究这个问题。
yaomo718
2018-08-04
这家伙很懒,什么也没写!
我用freemodbus的时候提示字节丢失错误[attach]4906[/attach] 但是我看通讯数据的时候觉得数据没有问题啊![attach]4907[/attach] 那个大神能给我指点一下?
shauew
2018-08-06
这家伙很懒,什么也没写!
>我用freemodbus的时候提示字节丢失错误 >但是我看通讯数据的时候觉得数据没有问题啊! >那个大神能给我指点一 ... --- 回复帧是不是少了两个字节? 之前有网友告诉我把系统时钟由10ms调成1ms会好一点,你可以试试看.
hyz_rtt
2018-08-29
这家伙很懒,什么也没写!
还有一个需要注意的就是输入输出引脚模式设为浮空输入,我用F4板子,起初移植不行,很头疼啊,便取看armink的代码,看到串口设置,发现是浮空输入。。。。
shauew
2018-08-30
这家伙很懒,什么也没写!
>还有一个需要注意的就是输入输出引脚模式设为浮空输入,我用F4板子,起初移植不行,很头疼啊,便取看armink ... --- OK
撰写答案
登录
注册新账号
关注者
1
被浏览
11k
关于作者
shauew
这家伙很懒,什么也没写!
提问
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
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
张世争
8
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
KunYi
6
个答案
1
次被采纳
本月文章贡献
程序员阿伟
5
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部