一、移植步骤总结
1.从官网将Freemodbus源码down下来;
2.在工程中新建文件,用于存放modbus和port文档;
3.在工程中将文档中的.c文件添加,将.h文件关联---即调用.h文件时不会出错;
4.重点是在port->portserial.c(串口配置文件)和porttimer.c(定时器配置文件);
---1)在portserial.c中,添加串口的初始化、重点是添加中断接收和发送的配置函数、如果有串口转485芯片还要主要485工作在半双工模式、添加接收和发送一个字节的函数、添加串口中断函数;
---2)在porttimer.c中,添加定时器配置(重点是其中预分频后的时钟配置在40KHz左右)、添加定时器的中断使能、添加定时器中断的失能、定时器的中断处理函数;
5.添加freemodbus_app函数(这里是调用函数)
---1)在其中包含fremodbus的初始化;
---2)运行函数;
---3)输入寄存器操作函数、保持寄存器操作函数、线圈操作函数、离散寄存器函数;
6.修改mbrtu.c文件中的eMBRTUSend函数,否则只会返回一次数据;---因为使用的是发送完成中断;
7.修改mbconfig.h文件,用于配置Freemodbus;如将取消ASCII的支持;
8.修改一些文件,让我们读取写入的时候地址不会自动+1;
---1)需要修改四个文件,分别为mbfunccoils.c、mbfuncdisc.c、mbfuncholding.c、mbfuncinput.c
---2)直接去对应的文件搜索:usRegAddress++;然后屏蔽掉。
mbfunccoils.c 里面有三处
mbfuncdisc.c 里面有一处
mbfuncholding.c 里面有三处
mbfuncinput.c 里面有一处
二、移植过程遇到的问题
1.移植层出现错误,在portserial.c和porttimer.c文件中,我添加了相应的函数,但是返回的FALSE没有换成TRUE;---在xMBPortSerialInit函数、xMBPortTimersInit函数中
2.串口转485芯片ADM3485,发送和接收,都需要将对应的引脚拉高和拉低;
3.判断接收完成的超时时间,网上教程分频后,定时器时钟40KHz;
4.GD的程序中,TRUE和FLASE的定义和Freemodbus重定义了,所以需要GD中的屏蔽掉;
5.GD中移植Freemodbus,不需要添加printf的重定义代码;
6.GD中移植Freemodbus,其中不识别u8,需要改为uint8_t;
7.ST中移植Freemodbus,需要添加printf的重定义代码,并且需要在其中添加_ttywrch函数;
---例如:
#if 1
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
int handle;
};
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
void _ttywrch(int ch)
{
ch = ch;
}
void _sys_exit(int x)
{
x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
USART1->DR = (u8) ch;
return ch;
}
#endif