MicroPython USB REPL复用问题

在最初的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-ACtrl-B两种特殊字符进行处理。从设计上看,REPL是用户程序的前置过滤功能。否则也无法通过终端来中断用户程序了。

所以,PYB输出二进制数据工作正常,但是PC传输给PYB二进制就会面临这个冲突问题。偏偏HCI就是二进制协议。解决方法有:

  • 使用usb.setinterrupt(-1)关闭REPL字符串过滤功能;
  • REPL转到其他UART,把USB留给上位机;
  • 采用hex协议或者base64进行传输;
  • 底层补丁,关闭REPL。

我的方式

因为手头的设计主要是为LoRaWANPktFwd提供一个仿真设备,所以先使用hex协议进行设计,完成后使用UART/REP避免冲突L,并关闭字符串过滤的方式。

你可能感兴趣的:(MicroPython USB REPL复用问题)