Example #1
0
/*******************************************************************************
* 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;
}
Example #2
0
void MBCCRC(Modbusp Modp)
{
    u16 RecCRC = GetRecCRC(Modp);
    u16 MyCRC = CalCRC(Modp->Buff,6);
    
    if(RecCRC == MyCRC)
    {
        MBResp(Modp);
    }
    else
    {
        FlushModbusCon(Modp);
    }
}