序:
在帖子:ARDUINO 小制作:14行代码做个stm32 usb转串口|
http://bbs.mydigit.cn/read.php?tid=2247536 看似数行语句非常简单,实则功能强大,因为我们在此基础上能做无限的扩充;
需求:有时候,我们想了解pc和单片机或设备和设备间通过串口交换了那些信息,通常我们用两种方法:
1 淘宝上的逻辑分析仪,可以抓个通讯片段,分析个波特率等性息;
2 也有些串口调试软件,带有串口监视功能,但部分软件需要 驱动和注册,还有个限制是这只能用于pc和设备的性息监视;
在这里,我们要自己做个串口监视器,插在串口链路里,后台将双向通讯内容dump出来;
直接上源程序:
- #define com1 Serial1
- #if 1
- # define com2 Serial2
- # define comspy SerialUSB
- #else
- # define com2 SerialUSB
- # define comspy Serial2
- #endif
- #define led LED_BUILTIN
- void setup() {
- uint8_t cn = 0;
- pinMode(led, OUTPUT);
- SerialUSB.begin(115200);
- Serial1.begin(115200);
- Serial2.begin(115200);
- while (!SerialUSB) {
- digitalToggle(led);
- delay(100);
- }
- while (!comspy.available()) {
- digitalToggle(led);
- delay(500);
- }
- comspy.println("serialSpy V0.1 by huaweiwx@sina.com");
- comspy.print("please connecting from coms to devieces,then power on the devices");
- for (;;) {
- if (com1.available()) {
- uint8_t c = com1.read();
- com2.write(c);
- if (cn == 1) {
- comspy << " " << _HEX(c);
- } else {
- comspy << "\ncom1: " << _HEX(c);
- cn = 1;
- }
- }
- if (com2.available()) {
- uint8_t c = com2.read();
- com1.write(c);
- if (cn == 2) {
- comspy << " " << _HEX(c);
- } else {
- comspy << "\ncom2: " << _HEX(c);
- cn = 1;
- }
- }
- }
- }
- void loop() {}
程序简单说明:
1~8 定义了转接的串口com1 和com2,comspy 是我们的监听口;com1 是 Serial1(PA9/10)
其中监听口可以是 usb虚拟串口 SerialUSB 或者是Serial2(PA2/3), 这取决于line2 取值是1 还是 0;
16~19 等待pc机 usb虚拟串口的驱动准备好,led 快闪;
20~23 等待我在监视口发送任意一个字符(如回车),否则 每秒一次led闪亮;
30~35 在com1 收到一个信息转送到com2后我们向监听口dump出来(16进制)用空格作为间隔;如果上一次dump数据是com2则先发送一个回车;
40~45 同30~35 dump com2 数据;
使用:
先将usb转串口pc,如果这作为comspy口,则用usb转串口连接并插上pc,则通过串口调试软件打开串口;
将com1 和com2 插入监视的通讯链路中;
向 comspy口发个任意字符;启动监听;
将com1 com2 所连接设备 上电并运行;
此时你就可以看到全部通讯内容了,如性息量很大,可以将此在pc上保存为文件,慢慢分析;