Настройка последовательной связи USB между STM32 и ПК с библиотекой Mbed - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть STM32 f401RE . Я использую библиотеку Mbed для настройки соединения с STM32 на ПК. Я хочу послать через серию последовательность символов на доску. В ответ я ожидаю мигающий светодиод. Например: led1 приводит к LED ON, led2 приводит к LED OFF.

Проблема в том, что я не знаю, как установить порт для подключения.

#include "mbed.h"
#include "USBSerial.h"

//Virtual serial port over USB
USBSerial serial;

int main(void) {

    while(1)
    {
        serial.printf("I am a virtual serial port\r\n");
        wait(1.0);
    }
}

Вы можете использовать интерфейс USBSerial для эмуляции последовательного порта через USB. Вы можете использовать этот последовательный порт в качестве дополнительного последовательного порта или в качестве решения для отладки. Он также обменивается данными между Mbed и компьютером.

Я хотел бы сделать все вышеизложенное (хотя я не знаю, что эмулирует последовательный порт через USB . Чтоэто виртуальный USB?).

Я вижу, что USBSerial конструктор занимает USBSerial (bool connect_blocking=true, uint16_t vendor_id=0x1f00, uint16_t product_id=0x2012, uint16_t product_release=0x0001). И я думаю, что мне нужно изменить некоторые из этих адресов. Проблема в том, что на Windows порты представлены в диспетчере устройств с COMxx, а на Linux, как ttyACMxx. Как бы я преобразовал это в гекса адреса - это то, что я должен сделать?

Ответы [ 3 ]

1 голос
/ 06 ноября 2019

Игнорировать это «б». Ваше устройство не видит этого «б». Он просто печатается утилитой последовательного терминала. Также я хотел бы упомянуть то, что я получил от вашего вопроса: вы хотите отправить некоторые данные с ПК на плату через последовательный порт, и если устройство получает эти данные, оно должно начать мигать светодиодом. Если это правильно, используйте код ниже:

#include "mbed.h"

Serial pc(USBTX, USBRX); // tx, rx
DigitalOut led(LED1);    // If blinking doesn't work with LED1, Check the pin map for your board and pass the LED pin instead of LED1

char token = 'a';        // This is the character that you should send to trigger blinking
bool startBlinking = false;

int main() {
    pc.baud(9600);

    while(1)
    {
        if (pc.getc() == token) {
            startBlinking = true;
        }
        if (startBlinking) {
            led = 1;
            wait(0.2);
            led = 0;
            wait(0.8);
        }
    }
}
1 голос
/ 06 ноября 2019

Вам не нужно ничего преобразовывать или связываться с USB product_id или vendor_id, последовательный порт mbed должен отображаться как любой другой последовательный порт, поэтому, если это не так, это означает, что у вас проблемы с драйвером.

В большинстве последних дистрибутивов Linux на устройстве должно отображаться что-то похожее на следующие сообщения ядра:

 cdc_acm 5-2:1.1: ttyACM0: USB ACM device
 usbcore: registered new interface driver cdc_acm
 cdc_acm: v0.26:USB Abstract Control Model driver for USB modems and ISDN adapters

В Windows вам, вероятно, потребуется установить драйверы. После этого последовательный порт должен отображаться как mbed Serial Port (COMx) в вашем диспетчере устройств. Есть много мест, где вы можете получить помощь по устранению неполадок, например, здесь .

Тот факт, что вы ничего не получаете как в Windows, так и в Linux, заставляет задуматься, если вы используете правильный кабель(Некоторые USB-кабели работают только для зарядки и не годятся для ваших целей, а некоторые просто через некоторое время выходят из строя). Я бы сначала позаботился о том, чтобы ваш кабель работал с другими устройствами (очевидно, не только для зарядки). Существует также вероятность того, что ваша доска испортилась (или пришла с завода), но это маловероятно.

0 голосов
/ 06 ноября 2019

Я только что нашел этот подход, и он работает. Я не понимаю, почему на моем компьютере появляется это сообщение: b'Hello World!\n'

#include "mbed.h"

Serial pc(USBTX, USBRX); // tx, rx

int main() {
    pc.baud(9600);

    while(1)
    {
        pc.printf("Hello World!\n");
        wait(0.1);
    }
}
...