我正在尝试使用功能代码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消息中的校验和错误