TPYBoard USB口作为串口使用

是的,TPYBoard的USB口可以作为串口使用,而且这实际上是它的主要功能之一。

简单来说,当你通过USB线将TPYBoard连接到电脑时,它在电脑上会模拟出一个串行通信端口(通常称为CDC设备)。这使得你可以像使用传统的串口(如RS-232)一样,通过USB线与板子进行双向数据通信。

具体功能和工作方式:

  1. REPL交互(主要用途):
    • 这是最常用的功能。你不需要任何额外的硬件(如USB转TTL模块),只需一根USB线。
    • 你可以通过任何串口终端工具(如PuTTY, Tera Term,或Mu编辑器自带的终端)连接到这个端口。
    • 在这个终端里,你可以直接输入Python代码并立即执行,查看结果,就像在电脑上的Python命令行一样。这对于调试、测试代码片段和与板子交互非常方便。
  2. 通用串行数据通信:
    • 你可以在你的MicroPython程序中,使用 machine.UART 模块来配置和使用这个USB虚拟出的串口。
    • 你可以通过它来与电脑上的其他软件(如Python的 pyserial 库、串口调试助手、Processing程序等)进行自定义的数据收发。
    • 例如,你可以让TPYBoard读取传感器数据,然后通过USB串口发送到电脑上进行显示或记录。

如何在代码中使用:

在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)

在电脑端如何连接:

  1. 用USB线连接TPYBoard和电脑。
  2. 电脑会自动安装驱动程序(首次使用时可能需要联网)。
  3. 安装成功后,在设备管理器中会看到一个COM端口(Windows)或 /dev/ttyACM0 / /dev/ttyUSB0(Linux/macOS)。
  4. 打开你的串口终端软件,选择对应的端口,设置波特率(通常为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,你需要通过其他方式恢复:

  1. 通过硬件复位:通常重新上电即可恢复
  2. 通过DFU模式:有些板子支持通过DFU模式重新刷写固件
  3. 通过其他接口:如果有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)

重要提醒

  1. 备份重要代码:禁用REPL前确保代码已备份
  2. 测试通信:先确保串口通信正常工作再禁用REPL
  3. 保留恢复方法:知道如何重新启用REPL
  4. 考虑使用WebREPL:作为后备访问方式

总结:关闭REPL确实是解决串口冲突的有效方法,特别适合在产品部署或需要稳定串口通信的场景中使用。建议先在开发阶段测试好通信逻辑,再考虑禁用REPL。

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注