【问题标题】:Decoding binary data from serial port从串口解码二进制数据
【发布时间】:2018-12-13 21:13:05
【问题描述】:

我正在尝试通过 Raspberry Pi 上的串口与 Simplebgc 板进行通信。我正在向似乎正在工作的板上写命令,但我需要帮助解码二进制响应。当指南似乎添加到 18 时,为什么我得到 23 个轮空?我是 C 和二进制的新手。

void sendCommand() {
    int fd;

    if ((fd = serialOpen ("/dev/ttyS0", 115200)) < 0) {
        //fprintf (stderr, "Unable to open serial device: %s\n", strerror (errno));
        cout<<"Unable to open serial device"<<endl;
        return;
    }

    unsigned char motor_on[6] = {0x3E, 0x4D, 0x01, 0x4E,0x01, 0x01}; //MOTOR ON
    unsigned char motor_off[6] = {0x3E, 0x6D, 0x01, 0x6E,0x01, 0x01};  //MOTOR OFF
    unsigned char board_info[6] = {0x3E, 0x56, 0x01, 0x57, 0x01, 0x01};  //BOARD_INFO

    serialFlush(fd);

    // Send command to grab board info
    write(fd, board_info, 6);
    sleep(2);

    // Read board response and print it
    char c;
    int counter = 0;
    while (read(fd, &c, 1) == 1) {
        //putchar(c);  // print out char    
        printf("%d ",c);
        counter++;
    }
    cout<<"\ncounter="<<counter<<endl;
    sleep(5);


}

int main() {
    sendCommand();
    return 0;
}

输出:

pi@raspberrypi:~/myPrograms/SerialGPIOExamples/c++/SBGC_board $ ./serialSBGCTest 62 86 18 104 30 70 10 0 27 0 0 0 0 0 0 0 0 0 0 0 0 0 137 计数器=23

【问题讨论】:

  • 你的调试输出绝对没用。您正在打印一长串数字,但您不知道从板上收到的数字是什么。例如,628 - 您收到的是 6,然后是 28、62,然后是 8,还是 6,然后是 2,然后是 8?
  • 这样做的正确方法是什么?
  • 更新了我的问题。 %d 是否应该按照手册中的说明正确打印出十进制数字?

标签: c++ raspberry-pi serial-port binary-data


【解决方案1】:

响应是带有标题的消息:

消息格式
每个命令都由标题和正文组成,两者都带有校验和。带有错误标题的命令 或正文校验和,或与预期不同的正文大小,应被忽略。解析器应该扫描 下一个起始字符的传入数据流并尝试从中恢复同步。

Header:
    Start Character    1u
    Command ID         1u
    Payload Size       1u
    Header Checksum    1u
Body
    18 bytes as defined by you.
    Body Checksum      1u

这给了你 23 个字节。 4 字节标头。身体。 1 字节正文校验和。

【讨论】:

  • 现在说得通了。如果值是 2u,例如 FIRMWARE_VER,我是否需要进行位移,因为它似乎是错误的。
猜你喜欢
  • 2021-12-05
  • 1970-01-01
  • 2014-08-09
  • 1970-01-01
  • 2011-11-02
  • 1970-01-01
  • 1970-01-01
  • 2010-10-03
  • 2017-07-14
相关资源
最近更新 更多