是的,TPYBoard的USB口可以作为串口使用,而且这实际上是它的主要功能之一。
简单来说,当你通过USB线将TPYBoard连接到电脑时,它在电脑上会模拟出一个串行通信端口(通常称为CDC设备)。这使得你可以像使用传统的串口(如RS-232)一样,通过USB线与板子进行双向数据通信。
具体功能和工作方式:
- REPL交互(主要用途):
- 这是最常用的功能。你不需要任何额外的硬件(如USB转TTL模块),只需一根USB线。
- 你可以通过任何串口终端工具(如PuTTY, Tera Term,或Mu编辑器自带的终端)连接到这个端口。
- 在这个终端里,你可以直接输入Python代码并立即执行,查看结果,就像在电脑上的Python命令行一样。这对于调试、测试代码片段和与板子交互非常方便。
- 通用串行数据通信:
- 你可以在你的MicroPython程序中,使用
machine.UART模块来配置和使用这个USB虚拟出的串口。 - 你可以通过它来与电脑上的其他软件(如Python的
pyserial库、串口调试助手、Processing程序等)进行自定义的数据收发。 - 例如,你可以让TPYBoard读取传感器数据,然后通过USB串口发送到电脑上进行显示或记录。
- 你可以在你的MicroPython程序中,使用
如何在代码中使用:
在MicroPython中,你需要使用 machine.UART 来操作这个USB CDC串口。通常,它被定义为UART 0。
python
from machine import UART
# 创建一个UART对象,使用USB CDC端口(通常是UART 0)
# 波特率对于USB CDC来说通常不重要,但习惯上设置为115200
usb_serial = UART(0, 115200)
# 发送数据到电脑
usb_serial.write("Hello, PC!\n")
# 检查是否有数据从电脑发送过来
if usb_serial.any():
data_received = usb_serial.read(10) # 读取10个字节
print("Received:", data_received)
在电脑端如何连接:
- 用USB线连接TPYBoard和电脑。
- 电脑会自动安装驱动程序(首次使用时可能需要联网)。
- 安装成功后,在设备管理器中会看到一个COM端口(Windows)或 /dev/ttyACM0 / /dev/ttyUSB0(Linux/macOS)。
- 打开你的串口终端软件,选择对应的端口,设置波特率(通常为115200),然后就可以进行通信了。
注意事项:
- 波特率:对于USB CDC,实际的通信速度是USB的全速(12 Mbps),波特率设置更多是出于与传统串口工具的兼容性考虑。通常设置为115200,但很多情况下其他速率也能工作。
- REPL冲突:如果你通过串口向板子发送数据,但板子上的程序没有在读取这个串口,那么你输入的内容会被REPL解释器接收。如果你的程序正在持续地从串口读取数据,可能会与REPL发生冲突。在设计通信协议时需要考虑到这一点。
- 两个串口:请注意,TPYBoard通常有两个串口资源:
- UART(0): USB CDC虚拟串口。
- UART(1): 硬件UART,连接在GPIO引脚(TX, RX)上,用于连接其他串口设备(如GPS、蓝牙模块等)。
总结:
TPYBoard的USB口最主要、最核心的用途之一就是作为一个便捷的串口通道,用于程序开发、调试和与上位机通信。你完全可以把它当作一个即插即用的串口来使用。
repl可以关掉吗?这样就不会冲突了?
是的,REPL完全可以关掉! 这是一个非常正确的思路,可以有效避免串口通信时的冲突。
关闭REPL的方法
方法1:在boot.py中禁用REPL(推荐)
创建一个 boot.py 文件,内容如下:
python
# boot.py - 在启动时运行 import os import machine # 方法A:完全禁用REPL over USB os.dupterm(None) # 方法B:更彻底的方法 - 取消USB CDC的REPL # 这需要根据具体的TPYBoard型号调整 # 对于大多数基于STM32的板子: # from pyb import USB_VCP # usb = USB_VCP() # usb.setinterrupt(-1)
方法2:使用uos.dupterm(None)
在代码中动态禁用:
python
import os
import machine
# 禁用REPL
os.dupterm(None)
# 现在可以安全地使用USB串口进行通信
usb_serial = machine.UART(0, 115200)
while True:
if usb_serial.any():
data = usb_serial.read()
# 处理数据...
usb_serial.write("Echo: " + data)
方法3:使用USB_VCP(针对Pyboard/TPYBoard)
python
from pyb import USB_VCP usb = USB_VCP() # 禁用REPL中断 usb.setinterrupt(-1) # 现在USB端口完全用于数据通信
重新启用REPL的方法
如果关闭了REPL,你需要通过其他方式恢复:
- 通过硬件复位:通常重新上电即可恢复
- 通过DFU模式:有些板子支持通过DFU模式重新刷写固件
- 通过其他接口:如果有WiFi或蓝牙,可以通过WebREPL或蓝牙REPL访问
更好的解决方案:软重启时处理
为了避免永久禁用REPL,可以在每次程序启动时处理:
python
import os
import machine
import sys
# 检查是否是通过REPL启动的
if not sys.stdin.isatty():
os.dupterm(None)
print("REPL disabled for serial communication")
实际应用示例
python
import os
import machine
import time
# 启动时禁用REPL
os.dupterm(None)
usb = machine.UART(0, 115200)
def handle_serial_data():
if usb.any():
command = usb.read().decode().strip()
if command == "get_temp":
# 读取温度传感器等操作
temp = read_temperature()
usb.write(f"Temperature: {temp}\n")
elif command == "restart":
machine.reset()
while True:
handle_serial_data()
time.sleep(0.1)
重要提醒
- 备份重要代码:禁用REPL前确保代码已备份
- 测试通信:先确保串口通信正常工作再禁用REPL
- 保留恢复方法:知道如何重新启用REPL
- 考虑使用WebREPL:作为后备访问方式
总结:关闭REPL确实是解决串口冲突的有效方法,特别适合在产品部署或需要稳定串口通信的场景中使用。建议先在开发阶段测试好通信逻辑,再考虑禁用REPL。









发表于 2018-5-18 16:26:58 |
先上最终效果,感觉还是可以的,不过要是想完美,得像卖得挺火的那种木壳钟一样,平常像块木头,显示的时候才透出来,不过没找到合适的外壳。
