利用Mbed库建立STM32与PC机的串行USB通信



我有一台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 portrn");
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表示。我该如何在六个地址中转换这一点——这是我必须做的吗?

您不应该转换任何东西或干扰USBproduct_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)。有很多地方可以获得故障排除帮助,例如,请参阅此处。

事实上,你在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);
}
}
}

最新更新