USB通讯代码
先贡献代码。由于PyBoard缺省通讯口是USB VCP/CDC,所以蛮实用的,不必再转接USB串口IC。但要避免与REPL争夺USB CDC通讯。
在与micropython反复“搏斗”后,总算把USB串口打印代码做成了:
# main.py -- put your code here!
import pyb
import select
def pass_through(usb, uart):
usb.setinterrupt(-1)
led = pyb.LED(1)
i = 0
while True:
usb.write(hex(i))
usb.write(chr(i))
usb.write('\t')
i = (i+1)%256
led.toggle()
pyb.delay(100)
pass_through(pyb.USB_VCP(), pyb.UART(1, 9600))
复制代码
本例基于官网的pass_through例子修改的。可以以9600bps慢速向USB_VCP循环打印HEX和对应的ASCII字符。在TeraTerm中制表符也可以定位等等,所以以后如果移植curses包就可以构建一个VT100终端。
问题
发现PyBoard不成熟的一面:写入用户代码后重启后,boot.py和main.py会经常性地丢失、重启。
写入main.py后,按下硬件复位按键后的现象:
- boot.py中出现乱码;
- 频繁性的重置main.py,即使main.py证实是可以运行的。
最离谱的事情就是boot.py内容被修改成乱码了。因为乱码之后micropython无法运行,估计内部文件系统出问题。可以直接把官网上的boot.py贴回去。boot.py实际就一句话:import pyb。
官方文档micropython.pdf中提到一个例子,UART/USB桥接。USB/UART可以互联互通。可以基于此例子更新到通用的代码。
修改了代码后,发现出现了其他网友出现的NameError。推测是缺乏import pyb而导致的错误,但NameError异常未能够在终端完整打印出来。这种现象我之前也发现过,micropython有“暂停”的现象,估计和内部的垃圾回收算法有关。或者直接堆栈或者堆出错了。
Ctrl+D可以软重启系统,正常的话可以直接运行用户代码,并可以截获部分系统抛出的用户带出错信息。但是经常性崩溃。
本文来自论坛,点击查看完整帖子内容。