Как отправить массив байтов между ядром f446re с mbed через USB с классом UARTSerial? - PullRequest
0 голосов
/ 08 июля 2019

Я должен отправить массив данных между ядром 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 как на ПК, так и на плате с ядром.

Ответы [ 2 ]

0 голосов
/ 08 июля 2019

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

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

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

// receive speed
tattr.c_ispeed = 921600;
tattr.c_ospeed = 921600;
0 голосов
/ 08 июля 2019

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

...