5、串口通信实验
大约 3 分钟
例程代码
from fpioa_manager import fm
from machine import UART
import time
# binding UART2 IO:7->RX, 8->TX
fm.register(7, fm.fpioa.UART2_RX)
fm.register(8, fm.fpioa.UART2_TX)
yz_uart = UART(UART.UART2, 115200, 8, 0, 0, timeout=1000, read_buf_len=4096)
write_bytes = b'hello'
last_time = time.ticks_ms()
try:
while True:
# send data per 500ms
if time.ticks_ms() - last_time > 500:
last_time = time.ticks_ms()
yz_uart.write(write_bytes)
# read and print data
if yz_uart.any():
read_data = yz_uart.read()
if read_data:
print("read_data = ", read_data)
except:
pass
yz_uart.deinit()
del yz_uart
实验准备
- 准备一个串口工具、4P杜邦线。
- 通过4P杜邦线将K210与串口工具连接。如下图:
- 将串口与电脑连接,通过usb线将K210也与电脑连接。
- 打开UartAssist串口调试助手,在左上角的串口设置中设置好串口参数,并选择串口工具的串口号(通过设备管理器可查看串口工具的端口号),点击打开。串口调试助手连接上串口工具后:
- 打开CanMV IDE,IDE连接K210,执行上面的例程代码。
- 查看串口调式助手的数据日志。
实验结果
- 运行之后,K210将通过 UART2 进行简单双向数据通信,具体为每隔 500 毫秒发送一次字节数据 “b'hello'”,同时不断检测接收缓冲区,若有数据则读取并打印出来。串口调式助手的数据日志区域将会打印K210发送给串口的信息。
- IDE的串行终端将会打印K210接收到的串口发送的数据。
例程代码讲解
- 导入运行例程所需的模块。fpioa_manager 模块中的 fm 用于配置芯片的引脚功能。machine 模块中的 UART 类用于实现串口通信功能。
from fpioa_manager import fm
from machine import UART
import time
- 通过 fm.register 函数将芯片的引脚 7 配置为 UART2 的接收引脚(RX),将引脚 8 配置为 UART2 的发送引脚(TX)。
fm.register(7, fm.fpioa.UART2_RX)
fm.register(8, fm.fpioa.UART2_TX)
- 创建了一个名为 yz_uart 的 UART 对象,UART.UART2:指定使用的是 UART2 串口。115200:设置串口通信的波特率为 115200。8:数据位设置为 8 位。0:表示无奇偶校验位。timeout=1000:设置读取操作的超时时间为 1000 毫秒,即如果在 1000 毫秒内没有接收到完整的数据,读取操作将返回。read_buf_len=4096:设置接收缓冲区的长度为 4096 字节。
yz_uart = UART(UART.UART2, 115200, 8, 0, 0, timeout=1000, read_buf_len=4096)
- 定义了要发送的字节数据 write_bytes 为 b'hello',并记录了初始的时间戳 last_time。
write_bytes = b'hello'
last_time = time.ticks_ms()
- 进入无限循环执行某些操作,并在执行操作过程中出现任何异常时简单忽略异常不做处理。
try:
while True:
except:
pass
- 以下代码块用于实现每隔500毫秒发送一次数据。当间隔大于500ms时,先更新时间戳,记录本次发送数据的时间,再通过UART发送定义好的字节数据write_bytes。
if time.ticks_ms() - last_time > 500:
last_time = time.ticks_ms()
yz_uart.write(write_bytes)
- 以下代码块用于读取并打印接收到的数据。检查UART接收缓冲区是否有数据可读,如果有数据可读,则从UART接收缓冲区读取数据并打印接收到的数据内容。
if yz_uart.any():
read_data = yz_uart.read()
if read_data: # 如果读取到了有效数据
print("read_data = ", read_data)
- 通过 yz_uart.deinit() 对 UART 对象进行反初始化操作,释放相关资源,然后通过 del yz_uart 删除 UART 对象,彻底清理相关的内存等资源占用。
yz_uart.deinit()
del yz_uart