/******************************************************************************* * Function Name : ModbusHandle * Description : Modbus从机处理函数 ,在主函数中收到一帧数据后被调用 * Input : * Output : * Return : 0 无错误 1帧地址错 2校验错 3读数据命令错 *******************************************************************************/ uint8_t ModbusHandle(unsigned char* RevBuf,uint32_t RevLen) { uint32_t i; uint32_t len; uint8_t SendBuf[64] = {0x00}; uint16_t CRC16[1]; /*判断帧地址 */ if(RevBuf[0] == ModbusAddr) { } else { return 1; } /*CRC计算*/ CalCRC(RevBuf,RevLen-2,CRC16); if(*(uint16_t *)(CRC16)!=*(uint16_t *)(RevBuf+RevLen-2)) { return 2; /*("校验错误");*/ } /*判断读数据功能码 0x03 */ if(RevBuf[1] == 0x03) { } else { return 3; } len = RevBuf[4]*256 + RevBuf[5]; len = len * 2; //字节数要*2 /*填充发送字节 表计地址 功能码 长度高 长度低 数据1 数据2 数据3 数据4 ... CRC高 CRC低 */ { SendBuf[0] = ModbusAddr; SendBuf[1] = 0x03;//功能码 SendBuf[2] = len;//长度 for(i=0; i<len; i++) { SendBuf[i+3] = modbusdata[i]; } /*CRC计算*/ CalCRC(SendBuf,len+3,(uint16_t *)&SendBuf[len+3]); } /*发送数据*/ UartSend(SendBuf, len+5); return 0; }
void MBCCRC(Modbusp Modp) { u16 RecCRC = GetRecCRC(Modp); u16 MyCRC = CalCRC(Modp->Buff,6); if(RecCRC == MyCRC) { MBResp(Modp); } else { FlushModbusCon(Modp); } }