首页 > 解决方案 > 从串口解码二进制数据

问题描述

我正在尝试通过 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

标签: c++raspberry-piserial-portbinary-data

解决方案


响应是一条带有标题的消息:

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

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 字节正文校验和。


推荐阅读