【问题标题】:Arduino serial communication with serial encoder与串行编码器的 Arduino 串行通信
【发布时间】:2021-12-18 04:02:27
【问题描述】:

我目前正在尝试通过串行与绝对编码器进行通信,如下图所示,它可以很好地响应我的请求,但我遇到的问题是 arduino 没有正确读取所有响应字节时间。来自编码器的位置请求是命令 0x64,它以 4 个字节进行响应,其中包括一个回波字节(图片中的 0x64)、两个数据字节(图片中的 0xAD 和 0x53)和一个错误字节(图片中的 0x00)。我目前正在做的是发送命令,读取 4 个字节,作为一种调试方式,我将回显字节的响应写回串行端口(图片中的 0x18)。正如你所看到的 0x18 != 0x64 所以我想知道我哪里出错了。我已经仔细检查了波特率并且我正在以正确的速度说话,我似乎无法获得一致的响应读数。下面是我一直在运行以尝试解决此问题的代码的简化版本。 delayMicroseconds() 只是用来分隔示波器上的字节。

  Serial.write(0x64);
  byte echo_byte = 0;
  byte pos_1 = 0;
  byte pos_2 = 0;
  byte status_byte = 0;
  echo_byte = Serial.read();
  pos_1 = Serial.read();
  pos_2 = Serial.read();
  status_byte = Serial.read();
  delayMicroseconds(1000);
  Serial.write(echo_byte)

【问题讨论】:

  • 在最后一行使用Serial.write(0x18) 而不是Serial.write(echo_byte)

标签: arduino serial-port atmega


【解决方案1】:

在调用 Serial.read() 之前,您必须检查并等待端口上有可供读取的字节。如果没有可供读取的字节,Serial.read() 返回 -1。

如:

byte echo_byte = 0;
byte pos_1 = 0;
byte pos_2 = 0;
byte status_byte = 0;

Serial.write(0x64);

while (Serial.available() < 4)  // wait for the 4 byte message.
    ; 

Serial.read(echo_byte);
Serial.read(pos_1);
Serial.read(pos_2);
Serial.read(status_byte);

这有点麻烦,而且容易出错,所以 Serial.readBytes 通常用于多字节传输,如:

// Reads position from encoder, returns true if pos is valid.
bool read_pos(unsigned short& pos)
{
    struct pos_msg 
    {
        byte echo_byte;
        unsigned short pos;
        byte status;
    };

    Serial.write(0x64);

    pos_msg msg;
    Serial.readBytes((char*)&msg, sizeof(msg));

    if (msg.echo_byte != 0x64 || msg.status != 0)
        return false;

    pos = msg.pos;
    return true;
}

【讨论】:

    最近更新 更多