Пример #1
0
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]);
    }
}
Пример #2
0
//********************************************************************************************************
// 函数名称: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);
}
Пример #3
0
//********************************************************************************************************
// 函数名称: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;
	
}