首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Arduino Modbus RTU串口响应?

Arduino Modbus RTU串口响应?
EN

Stack Overflow用户
提问于 2019-04-27 22:13:17
回答 1查看 292关注 0票数 0

我正在开发一个项目,其中我必须读取持有寄存器的数据。我使用这个http://www.freemodbus.com/检查了所有东西,它正在工作,并得到了正确的响应。在尝试开发程序时,我得不到正确的响应。

软件响应: 0x01 0x03 0x04 0x1a 0xa0 0x42 0x48 0xcd 0x9f Arduino响应: 0x01 0x04 0x83 0x43 0xff 0xff 0xff

请注意,在Arduino响应中,0x01之后没有0x03,我不知道为什么会发生这种情况,有人能帮我解决这个问题吗?

请在下面找到附加的Arduino代码。

代码语言:javascript
复制
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);
}
EN

回答 1

Stack Overflow用户

发布于 2019-05-01 23:52:26

是的,我认为你从设备上得到了一个错误代码4。请参阅http://www.simplymodbus.ca/exceptions.htm

在这一行,您可以准备您的请求:

字节data[] ={0x01,x03,0x00,0xab,0x00,0x02,0xb5,0xeb};

你的意思是,设备1,函数3,0x00是空格,然后是寄存器地址0xAB。不确定额外的零,然后是长度2,然后是CRC。因此,我认为要么CRC是错误的,要么额外的零是错误的。

另外,请注意,即使您做的一切都是正确的,modbus也会无缘无故地失败,所以请在几秒钟后重试,看看会发生什么

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55881424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档