初级会员

- 积分
- 124
- 金钱
- 124
- 注册时间
- 2019-5-20
- 在线时间
- 32 小时
|
发表于 2019-7-29 22:55:37
|
显示全部楼层
485设备都是并联挂在485总线上,主机发指令相当就是广播,所有的设备都会收到数据,但每个485设备都是有不同通讯地址,每个设备都是会将收到的数据包校验,然后再判断数据包地址是否是本机地址,如果地址一致则解析数据。
void TaskModbusRecvMsg(void)
{
u16 crc = 0;
//m_uMsgTimeCount++;
//if (m_uMsgTimeCount >= 10)
//{
// m_uMsgTimeCount = 0;
if (m_uRecvCount >= 8)
{
//检测设备地址是否正确--0xff为广播地址
if ((szRecvMsgBuffer[0] == 0xff) || (szRecvMsgBuffer[0] == m_aHoldRegVals[HOLDING_REG_DEV_ADDR]))
//if (szRecvMsgBuffer[0] == m_aHoldRegVals[HOLDING_REG_DEV_ADDR])
{
//crc = (szRecvMsgBuffer[m_uRecvCount-2] << 8) | szRecvMsgBuffer[m_uRecvCount-1];
crc = (szRecvMsgBuffer[m_uRecvCount-1] << 8) | szRecvMsgBuffer[m_uRecvCount-2];
if (crc == crc16(szRecvMsgBuffer, m_uRecvCount-2))
{
msg.function = szRecvMsgBuffer[1];
msg.regAddr = szRecvMsgBuffer[2];
msg.regAddr = (msg.regAddr << 8) | szRecvMsgBuffer[3];
msg.regCount = szRecvMsgBuffer[4];
msg.regCount = (msg.regCount << 8) | szRecvMsgBuffer[5];
msg.error = MB_EX_NONE;
if (MB_FUNC_WRITE_MULTIPLE_REGISTERS == msg.function)
{
msg.len = (szRecvMsgBuffer[6] > MBRTU_MSG_REQ_BUF_SIZE) ? MBRTU_MSG_REQ_BUF_SIZE : szRecvMsgBuffer[6];
memcpy(msg.dat, &szRecvMsgBuffer[7], msg.len);
}
ModbusMsgRecvEvent(&msg);
}
else
{
msg.function = 0x80+szRecvMsgBuffer[1];
msg.error = MB_EX_MEMORY_PARITY_ERROR;//数据校验错误
mbrtu_respond(&msg);
}
}
/*else
{
msg.function = 0x80+szRecvMsgBuffer[1];
msg.error = MB_EX_SLAVE_DEVICE_FAILURE;//设备地址错误
mbrtu_respond(&msg);
}*/
m_uRecvCount = 0;
ModbusClear = 0;
}
else
{
ModbusClear++;
if(ModbusClear>=3)
{
ModbusClear=0;
m_uRecvCount = 0;
}
}
//}
} |
|