移植完成通讯测试截图:
硬件连接:
移植过程:
一、首先下载:FreeModbusV1.6源码
FreeMODBUS官网:
https://www.embedded-solutions.at/zh-hans/freemodbus/
准备一份精英板工程文件夹
修改名称为:
解压FreeModbusV1.6源码
里面的文件:
Demo例有很多移植例子就是没有STM32的......
在精英板工程文件夹里添加一个文件夹FreeModbus
将FreeModbusV1.6源码文件夹里的modbus文件夹内的所有文件复制到精英板工程文件夹里的FreeModbus文件夹里
再将FreeModbusV1.6源码文件夹里的demo文件夹内的BARE文件夹内的port文件夹复制到精英板工程文件夹里的FreeModbus文件夹里
打开MDK工程,添加工程分组FreeModbus,并将工程文件夹FreeModbus内的除Port内的所有.c文件添加到工程分组FreeModbus内
填加相应的头文件目录:
添加工程分组FreeModbusPort,并将工程文件夹FreeModbus内的port文件内所有.c文件添加进来:
编译发现两个错,五个警告:
接下来就是修改文件了:
port.h 可以不修改
porttimer.c
添加定时器初始化代码这里使用TIM参数50us时基
BOOL
xMBPortTimersInit( USHORT usTim1Timerout50us )
定时器开启函数实现
void
vMBPortTimersEnable( )
定时器关闭函数实现
void
vMBPortTimersDisable( )
添加定时器中断服务程序
Portserial.c
发送接收使能函数配置:
void
vMBPortSerialEnable( BOOL xRxEnable, BOOL xTxEnable )
串口初始化函数配置:
BOOL
xMBPortSerialInit( UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits, eMBParity eParity )
配置串口发送和接收字节函数:
BOOL
xMBPortSerialPutByte( CHAR ucByte )
最后添加串口中断处理函数
在main.c添加四个处理函数
注意事项:在mbRTU.c的eMBRTUSend中稍作修改,代码如下。
/* Activate the transmitter. */
//发送状态转换,在中断中不断发送
eSndState = STATE_TX_XMIT;
//插入代码 启动第一次发送,这样才可以进入发送完成中断
xMBPortSerialPutByte( ( CHAR )*pucSndBufferCur );
pucSndBufferCur++;
usSndBufferCount--;
//使能发送状态,禁止接收状态
vMBPortSerialEnable( FALSE, TRUE );
寄存器的起始地址
若出现无法读取寄存器起始地址0地址内容,在计算偏移地址时要多-1或者定义起始地址为1,可解决问题,
也可以修改Freemodbus函数让其从0地址开始处理,而不是1地址。
参考资料:https://www.amobbs.com/thread-5491615-1-1.html
代码已上传我的资源,需要的朋友自行下载吧。
https://download.csdn.net/download/qq_41664294/11264558