我正在开发一个项目,在该项目中我必须读取保存寄存器数据。我使用此http://www.freemodbus.com/检查了所有内容,并且一切正常,并获得了适当的答复。在尝试开发的程序时,我没有得到正确的答复。
软件响应:0x01 0x03 0x04 0x1a 0xa0 0x42 0x48 0xcd 0x9f Arduino响应:0x01 0x04 0x83 0x43 0xff 0xff 0xff 0xff 0xff
请注意,在Arduino响应中,0x01之后没有0x03,我不知道为什么会发生这种情况。任何人都可以帮助我解决这个问题。
请在下面找到附加的Arduino代码。
static union
{
unsigned long a;
byte b[4];
float f;
}vr;
void readregister(unsigned int address)
{
byte rxbuf[]={0,0,0,0,0,0,0,0,0,0,0};
byte data[] = {0x01,0x03,0x00,0xab,0x00,0x02,0xb5,0xeb};
Serial3.flush();
for(int i=0;i<8;i++)
{
Serial3.write(data[i]);
}
delay(250);
while(Serial3.available()>0)
{
for(int v=0; v<=10;v++)
{
rxbuf[v]=Serial3.read();
Serial.println(rxbuf[v],HEX);
}
}
Serial3.flush();
vr.b[3]=rxbuf[3];
vr.b[2]=rxbuf[2];
vr.b[1]=rxbuf[5];
vr.b[0]=rxbuf[4];
}
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
Serial3.begin(9600,SERIAL_8E1);
}
void loop() {
// put your main code here, to run repeatedly:
readregister(99);
Serial.print("\n");
delay(3000);
}
答案 0 :(得分:0)
是的,我认为您从设备返回了错误代码4。参见http://www.simplymodbus.ca/exceptions.htm
在这一行中,您准备请求的地方:
字节数据[] = {0x01,0x03,0x00,0xab,0x00,0x02,0xb5,0xeb};
您要说的是,设备1,功能3,0x00是空格,然后是寄存器地址0xAB。然后不确定额外的零,然后是长度2,然后是CRC。因此,我投票认为CRC错误,或者多余的零错误。
另外,请注意,即使您做对了所有事情,modbus也会由于无缘无故失败,因此请在几秒钟后重试,看看会发生什么情况