STM32F103移植FreeModbus主机协议实现modbus主机

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32F103移植FreeModbus主机协议实现modbus主机相关的知识,希望对你有一定的参考价值。


一、代码结构

首先复制FreeModbus官网的协议栈里后缀为.m的文件,复制到自己的工程中,如下图所示:

STM32F103移植FreeModbus主机协议实现modbus主机_stm32f103


二、代码修改

1.首先在主函数中调用初始化函数并且使能modbus:

eMBMasterInit(MB_RTU, 2, 115200,  MB_PAR_EVEN);
eMBMasterEnable();

2.在一个大循环中调用​​eMBMasterPoll​​​。
三、操作从机

usModbusUserData[0] = (USHORT)(rt_tick_get()/10);
usModbusUserData[1] = (USHORT)(rt_tick_get()%10);
errorCode = eMBMasterReqWriteHoldingRegister(1,3,usModbusUserData[0],200);

// errorCode = eMBMasterReqReadHoldingRegister(1,3,1,RT_WAITING_FOREVER);
// errorCode = eMBMasterReqWriteCoil(1,8,0xFF00,RT_WAITING_FOREVER);
if (errorCode != MB_MRE_NO_ERR)

errorCount++;
rt_kprintf("error\\n");

else
rt_kprintf("no error\\n");

读取出来的数据在这几个数组中

/*-----------------------Master mode use these variables----------------------*/
#if MB_MASTER_RTU_ENABLED > 0 || MB_MASTER_ASCII_ENABLED > 0
//Master mode:DiscreteInputs variables
USHORT usMDiscInStart = M_DISCRETE_INPUT_START;
#if M_DISCRETE_INPUT_NDISCRETES%8
UCHAR ucMDiscInBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_DISCRETE_INPUT_NDISCRETES/8+1];
#else
UCHAR ucMDiscInBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_DISCRETE_INPUT_NDISCRETES/8];
#endif
//Master mode:Coils variables
USHORT usMCoilStart = M_COIL_START;
#if M_COIL_NCOILS%8
UCHAR ucMCoilBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_COIL_NCOILS/8+1];
#else
UCHAR ucMCoilBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_COIL_NCOILS/8];
#endif
//Master mode:InputRegister variables
USHORT usMRegInStart = M_REG_INPUT_START;
USHORT usMRegInBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_REG_INPUT_NREGS];
//Master mode:HoldingRegister variables
USHORT usMRegHoldStart = M_REG_HOLDING_START;
USHORT usMRegHoldBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_REG_HOLDING_NREGS];

四、注意点
1.只支持ID连续的从机。
2.下面的工程有问题:
a.读取从机的寄存器错误率比较高,是因为程序的问题。
b.操作从机的波特率比较讲究,除了115200,换其他的波特率程序会卡死。
c.下面的工程仅供参考,不可在实际项目中使用。
d.如果有大神解决了上面的问题,麻烦告诉一下,本人学习学习。

​​完整工程链接,仅供参考​​


以上是关于STM32F103移植FreeModbus主机协议实现modbus主机的主要内容,如果未能解决你的问题,请参考以下文章

GD32F103学习笔记——在GD32F103移植STM32F103代码

STM32F103R8T6系统移植到STM32F103RCT6

GD32F103学习笔记——在GD32F103移植STM32F103代码

OLED程序在stm32f103上的移植

嵌入式从STM32F103ZET6移植到STM32F103RCT6的流程

STM32入门开发: LWIP网络协议栈移植(网卡采用DM9000)