在最初的MicroPython PYB中,USB CDC是主要的REPL通道,同时也可以作为上位机的通讯通道。而且REPL在用户程序工作的时候是不工作的。但是我今天发现这种方式在PYB接受二进制数据时出现了冲突。
如果开机进入MicroPython REPL,输入help()
,会发现以下提示:
Control commands:
CTRL-A -- on a blank line, enter raw REPL mode
CTRL-B -- on a blank line, enter normal REPL mode
CTRL-C -- interrupt a running program
CTRL-D -- on a blank line, do a soft reset of the board
CTRL-E -- on a blank line, enter paste mode
这五个指令分别对应于0x01/0x02/0x03/0x04/0x05
五种二进制指令。
假设,上位机发送01 FF 02 00
给PYB,会被PYB的REPL识别为Ctrl-A
,Ctrl-B
两种特殊字符进行处理。从设计上看,REPL是用户程序的前置过滤功能。否则也无法通过终端来中断用户程序了。
所以,PYB输出二进制数据工作正常,但是PC传输给PYB二进制就会面临这个冲突问题。偏偏HCI就是二进制协议。解决方法有:
- 使用usb.setinterrupt(-1)关闭REPL字符串过滤功能;
- REPL转到其他UART,把USB留给上位机;
- 采用hex协议或者base64进行传输;
- 底层补丁,关闭REPL。
我的方式
因为手头的设计主要是为LoRaWANPktFwd提供一个仿真设备,所以先使用hex协议进行设计,完成后使用UART/REP避免冲突L,并关闭字符串过滤的方式。
网友评论