使用 Mbed 库在 STM32 和 PC 之间设置串行 USB 通信

Setting up Serial USB communication between STM32 and PC with Mbed library

我有一个 STM32 f401RE. I am using Mbed library 用于设置从 STM32 到 PC 的连接。我想通过串口向开发板发送一个字符序列。作为答案,我期待一个闪烁的 LED。例如:led1 结果为 LED ONled2 结果为 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);
    }
}

You can use the USBSerial interface to emulate a serial port over USB. You can use this serial port as an extra serial port or as a debug solution. It also communicates between Mbed and a computer.

我想做以上所有事情(尽管我不知道什么是 通过 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。我如何将其转换为六进制地址 - 这是我必须要做的吗?

您不必转换任何东西或弄乱 USB product_idvendor_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)。您可以在很多地方获得故障排除帮助,例如,请参阅 here

您在 Windows 和 Linux 上都没有得到任何东西这一事实让人怀疑您是否使用了正确的电缆(一些 USB 电缆仅用于充电,对您的目的没有好处,还有一些人只是在一段时间后失败了)。我首先要确保您的电缆可以与其他设备一起使用(显然不只是用于充电)。也有可能您的电路板(或来自工厂)坏了,但这不太可能。

我刚刚发现了这种方法,而且它很有效。我不明白的是为什么在我的电脑上我收到这条消息: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);
    }
}

忽略'b'。您的设备没有看到 'b'。它只是由串行终端实用程序打印。另外我想提一下我从你的问题中得到的是,你想通过串口将一些数据从 PC 发送到电路板,如果设备接收到该数据,它应该开始闪烁 LED。如果正确,请使用以下代码:

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