void Modbus_ReadRegister(void) { u8 mem = 0; u8 addr; u16 CrcData; u8 ByteCount,i; addr = Modbus_RecvBuffer[2]; addr = (addr << 8) | Modbus_RecvBuffer[3]; ByteCount = Modbus_RecvBuffer[5] * 2 ; for(i = 0; i < ByteCount; i += 2) { Modbus_SendBuffer[i+3] = Buffer[addr + i]; Modbus_SendBuffer[i+4] = Buffer[addr + i + 1]; } Modbus_SendBuffer[0] = Buffer[1]; Modbus_SendBuffer[1] = 0x03; Modbus_SendBuffer[2] = ByteCount; ByteCount += 3; CrcData = Modbus_CRC16(Modbus_SendBuffer,ByteCount); Modbus_SendBuffer[ByteCount] = CrcData >> 8; ByteCount ++; Modbus_SendBuffer[ByteCount] = CrcData & 0xff; for(mem = 0; mem < (ByteCount + 1); mem ++) { Rs485_SendChar(Modbus_SendBuffer[mem]); } }
//******************************************************************************************************** // 函数名称:TransfersReplyHandle // 输入参数:无 // 输出参数:无 // 功能描述:传输应答帧处理 //******************************************************************************************************** void TransfersReplyHandle(void) { uint16_t CRC_OR_LRC; *ADUData.ADUBuffPtr = ADUData.Address; // 设备地址 CRC_OR_LRC = Modbus_CRC16(ADUData.ADUBuffPtr,ADUData.ADULength-2); // 计算CRC (ADU中CRC前的数据) *(ADUData.ADUBuffPtr+ADUData.ADULength-1) = (uint8_t)(CRC_OR_LRC/0x100); // CRC Hi or LRC Hi *(ADUData.ADUBuffPtr+ADUData.ADULength-2) = (uint8_t)CRC_OR_LRC; // CRC Hi or LRC Hi SendResponse(ADUData.ADUBuffPtr,ADUData.ADULength); }
//******************************************************************************************************** // 函数名称:T15EndHandle // 输入参数:无 // 输出参数:无 // 功能描述:T1.5超时处理 //******************************************************************************************************** void T15EndHandle(void) { uint16 RedundancyCheck; if(ADUData.EndT15) return; ADUData.EndT15 = TRUE; // T1.5时间结束 if((*ADUData.ADUBuffPtr==BROADCAST_ADDRESS)|| // 验证地址是否有效 (*ADUData.ADUBuffPtr==ADUData.Address)) { RedundancyCheck = *(ADUData.ADUBuffPtr+ADUData.ADULength-2)| (*(ADUData.ADUBuffPtr+ADUData.ADULength-1)<<8); if(RedundancyCheck == Modbus_CRC16(ADUData.ADUBuffPtr,ADUData.ADULength-2)) // CRC校验 { ADUData.FrameOK = TRUE; return; } } ADUData.FrameOK = FALSE; }