用485总线,modbus协议通讯,移植完了不会用,网上看的程序也糊里糊涂的

2019-07-14 20:31发布

大家好,本人用的板子是STM32vet6,用到modbus通讯,但是初次接触modbus,modbus的文档也看了不少,但是程序里不知道怎么写来实现modbus的强大功能,目前我想先用modbus先实现接受和发送数据,但是不知道代码是怎样的,求大家能指导一下,或者大家有做过modbus这一块的,希望可以分享一下经验或者资料,感激不尽,帮助小白我,谢谢谢谢
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
17条回答
meimengxing2014
2019-07-16 15:31
static void MBRTU_Fun10(uint8_t *RcvDataBuf)
{
    uint8_t  k;
    uint16_t ReadAdr;
    uint16_t Register_Num;                                                      //接收到数据第1个字节为从机地址,第2个字节为功能码0x10
    ReadAdr = (uint16_t)RcvDataBuf[2] * 256 + RcvDataBuf[3];                    // 接收到数据的3、4两个字节存放的起始地址      
    Register_Num = (uint16_t)RcvDataBuf[4] * 256 + RcvDataBuf[5];               //5、6两个字节存放的是寄存器数量
    uint32_t index = 0;
   
    if (!(((ReadAdr >= MUL_REG_REGION1_BGEIN) && (ReadAdr <= MUL_REG_REGION1_END))
            && ((ReadAdr + Register_Num) <= (MUL_REG_REGION1_END + 1))
            && ((0 != Register_Num) && (Register_Num * 2 == RcvDataBuf[6]))))   //第7个字节存放的字节计数=寄存器数量*2
    {
        MBRTU_SendErr(RcvDataBuf, MB_EX_ILLEGAL_DATA_ADDRESS);
        return;
    }
    for (k = 0; k < Register_Num; ReadAdr++, k++)
    {
        switch (ReadAdr)                                                       //第8、9两个字节存放的是寄存器值
        {
        case 0x0030:                                                                //PWM频率
            PWMPara.PWM_Frequency = (uint16_t)RcvDataBuf[7+index] * 256 + RcvDataBuf[8+index];
            index += 2;
            break;
            
        case 0x0031:                                                                //PWM占空比
            PWMPara.Duty = (uint16_t)RcvDataBuf[7+index] * 256 + RcvDataBuf[8+index];
            index += 2;
            break;
            
        case 0x0032:                                                                //PWM的脉冲个数
            PWMPara.PulseCount = (uint16_t)RcvDataBuf[7+index] * 256 + RcvDataBuf[8+index];
            index += 2;
            break;
            
        default:
            break;
        }
    }
    MBRTU_SendMsg(RcvDataBuf, 6);
}

一周热门 更多>