STM32和GD32中移植Freemodbus过程,遇到的问题和总结

一、移植步骤总结

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

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值