协议的代码实现

时间:2018-04-10 04:42:36

标签: c protocols pic modbus crc16

我正在尝试使用功能代码1实现Modbus RTU。 我已经在Modbus RTU上编写了代码为3的代码,我可以发送请求&正确获得响应。我正在尝试修改功能代码1的代码。使用以下代码CRC功能没有问题,因为我可以看到计算按照Simply modbus网站进行写入。

CRC错误检查功能

unsigned int crc_fn(unsigned char *dpacket,unsigned int len) // CRC Function(Error calcualtion)
{
 unsigned int crc = 0xffff,poly = 0xa001;
 unsigned int i=0; 

 for(i=0;i<len;i++)
 {
    crc^= dpacket[i];
    for(j=0;j<8;j++)
    {
     if(crc & 0x01)
     {
      crc >>= 1;
      crc ^= poly;
     }
     else
    crc >>= 1;
    }
 }
 return (crc); 
}

请求&amp;响应功能

 void Serial_Data()
{


    unsigned int address,crc1,crc2;
 unsigned char length,i;
    unsigned char Data_Len_Count;
    unsigned char length1;


    // Serial_1_Send_byte(rxbuf[0]);
    crc2=crc_fn(&rxbuf[0],6); //crc function for received protocol from request 
         __delay_ms(10); // Changed on 20.01.2017
  if((rxbuf[6]==(unsigned char)(crc2))&&(rxbuf[7]==((unsigned char)(crc2>>8))))
     {

  if(rxbuf[0]==Device_ID )
  {

   if(rxbuf[1]==READ_REG)
   {
    address=(((unsigned int)(rxbuf[2]<<8))+((unsigned int)(rxbuf[3]))); 
    if(rxbuf[5]>=1)
    {

     length1=(rxbuf[5]<249)?(rxbuf[5]+7)/8:0X20;
                    length=(rxbuf[5]*1);
     address=(address*1); 
     ser_data[0]=Device_ID ;
     ser_data[1]=rxbuf[1];
     ser_data[2]=length; 
     ser_data[3]=rxbuf[6];
     ser_data[4]=rxbuf[7];
     ser_data[5]=length1;
     ser_data[6]=00;
     ser_data[7]=00;
     ser_data[8]=00;
     ser_data[9]=00; 


     crc_data[0]=Device_ID ;
     crc_data[1]=rxbuf[1];
     crc_data[2]=length;

     j=3;
     for(i=address;i<((address+length));i++)
     {
      crc_data[j++]=ser_data[i+3];
                       // ChecksumCal(length);
     }
     crc1 =crc_fn(&crc_data[0],(length+3)); //crc function for response protocol from the device

                    Serial_1_Send_byte(ser_data[0]);
     Serial_1_Send_byte(rxbuf[1]);
     Serial_1_Send_byte(ser_data[2]);

     for(i=address;i<((address+length));i++)
     {
      Serial_1_Send_byte(ser_data[i+3]);

     }
     Serial_1_Send_byte((unsigned char)crc1);
     Serial_1_Send_byte((unsigned char)(crc1>>8));
                     Serial_1_Send_byte(crc_msb);
                             Serial_1_Send_byte(crc_lsb);



                    for(i=0;i<30;i++)
                    {
                       Serial_1_Send_byte(0);
                    }

    } 
   } 
   __delay_ms(5); 
       }

 }
  index=0;
 rec_flag = 0;

}

我怀疑的主要问题是功能码3数据以字节和数字形式发送。功能代码1以位为单位发送数据。因为我怀疑请求进展顺利,但是当响应它弹出的modbus消息中的校验和错误

enter image description here

0 个答案:

没有答案