Как передать массив байтов между нуклео f446re с mbed через USB с классом UARTSerial?

Мне нужно отправить массив данных между нуклео f446re и ПК с ubuntu, используя класс UARTSerial.

Код, который я использую на 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;
}

Код, который я запускаю на компьютере:

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");
    }
}

Вывод, который я получаю на ПК:

[...]
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. Я пытался очистить USB как на компьютере, так и на плате Nucleo.


person Noè Murr    schedule 08.07.2019    source источник


Ответы (2)


вам нужно использовать декодер для декодирования байтов из последовательного порта, см. ссылку ниже: https://codereview.stackexchange.com/questions/200846/a-simple-and-efficient-packet-frame-кодировщик-декодер

person Saif Faidi    schedule 08.07.2019
comment
Я не понимаю, почему мне нужно использовать декодер, если я не использую какой-либо протокол для отправки данных. - person Noè Murr; 08.07.2019
comment
на самом деле, при чтении из последовательного порта он только кусается, потому что он конвертируется в байты при отправке данных, поэтому для получения удобочитаемой информации вы должны декодировать эти данные. - person Saif Faidi; 08.07.2019

Я нашел проблему. Это была установка скорости передачи, я должен использовать следующие строки:

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

вместо этого:

// receive speed
tattr.c_ispeed = 921600;
tattr.c_ospeed = 921600;
person Noè Murr    schedule 08.07.2019