0

我有一个STM32 f401RE。我正在使用Mbed 库来设置从 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);
    }
}

您可以使用 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端口在设备管理器中用COMxxLinux表示ttyACMxx。我将如何在六进制地址中转换它 - 这是我必须做的吗?

4

3 回答 3

1

您不必转换任何东西或弄乱 USBproduct_idvendor_idmbed 串行端口应该显示为任何其他串行端口,因此如果它不适合您,则意味着您遇到了驱动程序问题。

在最新的 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 电缆仅用于充电,不适合您的目的,而另一些则在一段时间后就失效了)。我首先要确保您的电缆可以与其他设备一起使用(显然不是仅用于充电)。你的电路板也有可能坏了(或来自工厂),但这不太可能。

于 2019-11-06T08:01:51.160 回答
0

我刚刚找到了这种方法并且它正在工作。我不明白的是为什么在我的电脑上我收到这条消息: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);
    }
}
于 2019-11-06T08:45:40.290 回答
0

忽略那个'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);
        }
    }
}
于 2019-11-06T09:32:16.937 回答