如何通过带有UARTSerial类的USB通过mbed在核f446re之间发送字节数组?

时间:2019-07-08 13:39:20

标签: c++ uart mbed nucleo

我必须使用UARTSerial类在核f446re和具有ubuntu的PC之间发送数据数组。

我在mbed上使用的代码如下:

int main() {
    UARTSerial pc(USBTX, USBRX, 921600);
    uint8_t buff[256] = {
        5, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4
    };

    pc.sync();

    while(true) {
        pc.write(buff, 23);
        pc.sync();
        wait(1);
    }

    return 0;
}

我在PC上运行的代码是:

int main() {
    struct termios tattr{0};

    // open the device in read/write sync
    int com = open("/dev/ttyACM0", O_RDWR | O_NOCTTY | O_SYNC );

    if (com == -1)
        throw std::runtime_error("ERROR: can't open the serial");

    tcgetattr(com, &tattr);

    tattr.c_iflag &= ~(INLCR|IGNCR|ICRNL|IXON);

    tattr.c_oflag &= ~(OPOST|ONLCR|OCRNL|ONLRET); 

    tattr.c_cflag = CS8 | CREAD | CLOCAL; 

    tattr.c_lflag &= ~(ICANON|ECHO);    

    tattr.c_cc[VMIN] = 1;

    tattr.c_cc[VTIME] = 0;

    tattr.c_ispeed = 921600;
    tattr.c_ospeed = 921600;

    tcsetattr (com, TCSAFLUSH, &tattr);

    while (true) {
        usleep(1000);
        tcflush(com, TCIOFLUSH);
        uint8_t buff[24];
        ::read(com, buff, 23);

        printf("reading frame... ");
        for (auto b : buff) {
            printf("%02X ", b);
        }
        puts("\n");
    }
}

我在PC上收到的输出是:

[...]
reading frame... 00 00 8D 9C 1E 7F 00 00 00 00 00 00 00 00 00 00 70 5B C7 01 AD 55 00 00 

reading frame... 00 00 8D 9C 1E 7F 00 00 00 00 00 00 00 00 00 00 70 5B C7 01 AD 55 00 00  
[...]

您会看到结果与我期望的不同。

我已经尝试过一次通过循环发送一个字节,但是结果是一样的。

我不明白为什么我无法读取USB,我试图在PC和核板上都刷新USB。

2 个答案:

答案 0 :(得分:0)

您必须使用解码器从串行端口解码字节 请参阅下面的链接: https://codereview.stackexchange.com/questions/200846/a-simple-and-efficient-packet-frame-encoder-decoder

答案 1 :(得分:0)

我发现了问题。这是波特率的设置,我必须使用以下行:

// receive speed
cfsetispeed (&tattr, B921600);
// transmit speed
cfsetospeed (&tattr, B921600);

代替此:

// receive speed
tattr.c_ispeed = 921600;
tattr.c_ospeed = 921600;