Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
libmodbus
RT-Thread
modbus主机
RT-Thread 应用笔记 - libmodbus RTU RS485 主机
发布于 2020-12-07 21:50:44 浏览:5671
订阅该版
[tocm] [RT-Thread 入门学习笔记 - 目录](https://club.rt-thread.org/ask/article/3420.html) [RT-Thread 应用笔记 - 不正确使用LOG也会引发hard fault](https://club.rt-thread.org/ask/article/2329.html) [RT-Thread 应用笔记 - RTC Alarm 组件的使用](https://club.rt-thread.org/ask/article/2312.html) [RT-Thread 应用笔记 - freemodbus RTU RS485 从机](https://club.rt-thread.org/ask/article/2346.html) [RT-Thread 应用笔记 - freemodbus RTU RS485 主机](https://club.rt-thread.org/ask/article/2353.html) [RT-Thread 应用笔记 - libmodbus RTU RS485 从机](https://club.rt-thread.org/ask/article/2378.html) [RT-Thread 应用笔记 - libmodbus RTU RS485 主机](https://club.rt-thread.org/ask/article/2382.html) [RT-Thread 应用笔记 - STM32 CAN 通信双机](https://club.rt-thread.org/ask/article/2385.html) [RT-Thread USB学习实践系列](https://club.rt-thread.org/ask/article/2396.html) ## 背景 * modbus协议,简单,实用,一些小数据通信控制场合,用的比较多。 * 部分用户使用起来,并不是想象中那么的顺利。 * libmodbus,可用于modbus主从机的开发。 * libmodbus代码基于C库,有动态内存的使用,与freemodbus相比,在适配时稍有不同。 * 基于rt-thread,已经有libmodbus的软件包,默认是主机。这里实现主机功能的验证。 * 这里基于STM32F103 实现modbus RS485 RTU从机的功能。 * 部分使用libmodbus的用户,配置好libmodbus,发现无法通信,就开始【求助】,可能需要了解引脚配置! * 部分移植方法,参考上篇从机的配置! ## 前言 * 嵌入式软件工程师,需要了解原理图,了解引脚定义,如串口、RS485控制引脚等等。 * 我的板子,MCU 为STM32F103C8T6, Flash与SRAM都相对不大。 * UART1用于rt-thread MSH串口。 * UART3用于RS485,用于modbus rtu串口。 ## 移植 * 首先需要配置好rt-thread最小系统,在rt-thread源码工程里,找一个与使用MCU平台相似的BSP,修改使用。 * 下载配置libmodbus软件包,使用ENV menuconfig ![2020-12-07_211921.png](/uploads/20201207/1be89e3fe7af452abb82097192913175.png) ![2020-12-07_211747.png](/uploads/20201207/31ad8009a4d48dfcec35eb910f1237de.png) * 因为STM32F103C8T6,Flash比较小,只有64KB,因此,需要设置一下编译的优化选项,改为 -O2 ![2020-12-07_212039.png](/uploads/20201207/a56d20674eb9ca118c7d778a47f03dd4.png) * 因为libmodbus的 例程在软件包里面,因此,我复制出来,否则,git 无法更新软件包里的代码。 ```c #include "modbus_rtu_test.h" #include "modbus.h" #include "stdio.h" #include "string.h" #define RS485_RE GET_PIN(A, 8) static void modbus_master_thread(void *param) { uint16_t tab_reg[64] = {0}; modbus_t *ctx = RT_NULL; ctx = modbus_new_rtu("/dev/uart3", 115200, 'N', 8, 1); modbus_rtu_set_serial_mode(ctx, MODBUS_RTU_RS485); modbus_rtu_set_rts(ctx, RS485_RE, MODBUS_RTU_RTS_UP); modbus_set_slave(ctx, 3); //从机地址 modbus_connect(ctx); modbus_set_response_timeout(ctx, 0, 1000000); int num = 0; while (1) { memset(tab_reg, 0, 64 * 2); int regs = modbus_read_registers(ctx, 0, 20, tab_reg); rt_kprintf("[%4d][read num = %d]", num, regs); num++; int i; for (i = 0; i < 20; i++) { rt_kprintf("<%#x>", tab_reg[i]); } rt_kprintf("\n"); rt_thread_mdelay(2000); } //7-关闭modbus端口 modbus_close(ctx); //8-释放modbus资源 modbus_free(ctx); } static int rtu_test_init(void) { rt_pin_mode(RS485_RE, PIN_MODE_OUTPUT); rt_thread_t tid; tid = rt_thread_create("modbus", modbus_master_thread, RT_NULL, 2048, 12, 10); if (tid != RT_NULL) rt_thread_startup(tid); return RT_EOK; } INIT_APP_EXPORT(rtu_test_init); ``` * 注意UART引脚与RS485方向控制引脚的配置,可以参考上篇从机的配置。 * 例程实现 保持寄存器的 读操作,因此,通过USB转RS485或其他Modbus从机,开始测试。 ![2020-12-07_212547.png](/uploads/20201207/e10daf3f3c767965a9925bbd545c1af8.png) ![2020-12-07_212613.png](/uploads/20201207/5e5b4ed1ea33f3813c5e21e94ee1258c.png) ![2020-12-07_213539.png](/uploads/20201207/2abf76ead99c45a18dc8dc90f59cf513.png) ![2020-12-07_213619.png](/uploads/20201207/75e7d0aeb71eb178e964e015077a1250.png) ## 总结 * 今天验证RS485,重新接的线,发现不通 * 最后确认,是RS485 A+ B-接反了,A+需要连接A+,B-需要连接B-。 ![2020-12-07_220057.png](/uploads/20201207/83e566b479431a73b612b4612484d7a5.png) * 注意这个demo设置的从机地址是3,理论上,主机可以与多个从机进行通信! * libmodbus主机操作的API比较齐全,可以用于主机的实现。 * libmodbus由于使用了malloc等动态内存,注意不要发生内存泄漏、数组越界等操作。 * libmodbus 针对linux的设备管理,rt-thread是通过开启DFS适配的,操作串口类似于文件的io操作!因此,代码占用的ROM(Flash)较大。 ## 参考例程 ```c https://gitee.com/zhangsz0516/rtt_stm32_libmodbus ```
10
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
张世争
学以致用
文章
131
回答
813
被采纳
177
关注TA
发私信
相关文章
1
RT-THREAD在STM32H747平台上移植lwip
2
正点原子miniSTM32开发板读写sdcard
3
反馈rtt串口驱动对低功耗串口lpuart1不兼容的问题
4
Keil MDK 移植 RT-Thread Nano
5
RT1061/1052 带 RTT + LWIP和LPSPI,有什么坑要注意吗?
6
RT thread HID 如何收发数据
7
求一份基于RTT系统封装好的STM32F1系列的FLASH操作程序
8
RT-Thread修改项目名称之后不能下载
9
rt-studio编译c++
10
有木有移植rt-thread(nano)到riscv 32位MCU上
推荐文章
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组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
cubemx
PWM
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
keil_MDK
SFUD
msh
ulog
C++_cpp
MicroPython
本月问答贡献
三世执戟
5
个答案
1
次被采纳
KunYi
4
个答案
1
次被采纳
RTT_逍遥
3
个答案
1
次被采纳
xiaorui
1
个答案
1
次被采纳
JonasWen
1
个答案
1
次被采纳
本月文章贡献
出出啊
1
篇文章
3
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部