打印
[STM32F1]

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

[复制链接]
1159|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2021-9-7 10:05 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
一、代码结构
首先复制FreeModbus官网的协议栈里后缀为.m的文件,复制到自己的工程中,如下图所示:


使用特权

评论回复
沙发
tpgf|  楼主 | 2021-9-7 10:06 | 只看该作者
二、代码修改
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];


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1760

主题

15201

帖子

10

粉丝