使用 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 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);
}
}
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_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)
。您可以在很多地方获得故障排除帮助,例如,请参阅 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);
}
}
}
我有一个 STM32 f401RE. I am using Mbed library 用于设置从 STM32 到 PC 的连接。我想通过串口向开发板发送一个字符序列。作为答案,我期待一个闪烁的 LED。例如: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);
}
}
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_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)
。您可以在很多地方获得故障排除帮助,例如,请参阅 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);
}
}
}