STM32F407VET6学习笔记10:移植smallmodbus
即今日记录一些smallmodbus 移植的过程,以及使用的关键点.
主要是有些别的坑,移植和用起来还是不麻烦的。
目录
下载源码:
RT-Thread 操作系统:
添加源码:
修改config_small_modbus.h 文件宏定义:
board_virtualIO.c:
头文件的引用:
定义与实例:
串口与使能脚的定义:
使能引脚的作用函数:
创建线程:
从机回调函数:
其他需要注意的宏:
移植程序效果:
下载源码:
RT-Thread-Mirror/small_modbus
RT-Thread 操作系统:
移植smallmodbus的工程必须要有RT-thread操作系统的支持
别忘记注册串口的设备,在stm32f4xx_hal_msp.c文件添加你要用到的串口的初始化:
添加源码:
在它的几个文件夹中寻找并添加完全这几个源码:
修改config_small_modbus.h 文件宏定义:
将它的适配平台改为RT-Thread:
board_virtualIO.c:
这个文件定义了可以调用的master和slave 对线圈操作的函数
这里需要注意,update 与 write 的区别,更新是给slave用的,write应该是给master用的
我在实际移植过程中,测试的是slave的基础功能,发现作者的调用有误,会导致测试slave的时候卡死,因为根本的函数调用错了,误调了master用到的写write方法了:
我在自己额外的线程例子中,将其改为这个就能正常更新线圈了:
头文件的引用:
定义与实例:
使用它的库的过程中,有些定义与实例不可缺少:
这个结构体定义不可少,不然没法正常启动:
串口与使能脚的定义:
使能引脚的作用函数:
它的库会调用这个作用函数来使能与失能485通信:
我这里写了四个这样的函数,每个slave实例会用到一个它串口相对应的函数、引脚
圈出来的是我自己宏定义好的引脚
创建线程:
我这里创建俩个线程,一个是处理slave的线程,一个是更新线圈用的
初始化线程:
线程的作用函数:
slave线程的任务:
从机回调函数:
可以在从机回调函数中定义自己通信的地址,与回调逻辑:
最终应用层的删改也是在这里进行了
其他需要注意的宏:
board_virtualIO.c 文件 有宏会定义每个线圈的最大数据量,原文不是我截图的这样,这里是我为了自己使用方便extern了:
small_modbus_base.h会定义一些最大读写长度:
从机回调函数的调用使用这一块,不能使用MODBUS_WAIT_FOREVER,否则就会出现,只回复一次就结束通信的情况。
移植程序效果:
能正常通信,测试的01功能码的离散量线圈的读写功能: