3. UART通讯¶
本章中,我们开始为大家介绍一种常见的通讯协议UART, 在我们的鲁班猫板卡上,我们常常使用终端来与板卡进行交互, 而这个终端与板卡连接的众多方式之中,UART串口就是我们最常使用的方式之一。
关于UART协议的具体内容,我们在此不作过多探究,大家可以自行搜索UART通讯协议的相关知识学习。
本章中,我们的重点是使用前面Python库,来使用到我们鲁班猫板卡上的UART资源。
3.1. UART实验¶
在本章里,我们会使用板卡上的串口资源,通过板卡与USB转TTL模块连接到我们的电脑上, 并通过串口上位机来进行实验现象的演示和操作。
3.2. 实验准备¶
在开始实验前,需要做一些准备。
3.2.1. 添加UART资源¶
在板卡上的部分资源可能默认未被开启,在使用前请根据需要修改 /boot/uEnv.txt 文件, 可添加对应设备树插件的加载,重启系统,以在系统中添加对应资源。
如本节实验中,通常情况下在鲁班猫系统中默认使能 UART
的功能,
如大家发现UART的设备树插件未加载,请做相应修改。
同时如果大家在使用中发现UART功能引脚被复用或有冲突,请要将对应占用UART引脚资源的设备树插件取消加载, 否则UART资源可能无法使用。若已开启对应资源,忽略以下步骤。
如笔者使用的鲁班猫i.MX6ULL MINI板卡,uart2与ec-spi3资源就互相冲突, 那么笔者就选择uart3资源为大家进行演示。
方法参考如下:
添加uart3设备树插件,以使系统支持uart3功能,如下:
# 以鲁班猫i.MX6ULL MINI板卡uart3设备树插件内容为例:
dtoverlay=/usr/lib/linux-image-4.19.35-imx6/overlays/imx-fire-uart3.dtbo
如若运行代码时出现“Device or resource busy”或者运行代码卡死等等现象, 请按上述情况检查并按上述步骤操作。
如出现 Permission denied
或类似字样,请注意用户权限,大部分操作硬件外设的功能,几乎都需要root用户权限,简单的解决方案是在执行语句前加入sudo或以root用户运行程序。
# 在终端中输入如下命令,可以查看到UART资源:
ls /dev/ttymxc*
板卡上的UART资源示例,仅供参考:
其中/dev/ttymxc2对应的就是板卡上的uart3资源。
3.2.2. 硬件连接¶
注:硬件连接小节,需要大家根据自身开发环境等情况对本章内容进行参考调整。
本章中,我们通过上述Python库,编写使用鲁班猫i.MX6ULL MINI 板卡上uart3资源的代码, 并通过USB转TTL模块、串口上位机来进行代码正确性测试。
笔者硬件连接如图,仅供参考:
USB转TTL模块连接如上图示。
3.3. 方式一:使用pyserial¶
pyserial 库封装了对串口资源的访问方法,该库兼容多种平台对串口资源使用, 有许多平台特性相关的方法,官方的使用说明参考:pyserial 库代替。
在Linux系统上,关于UART子系统相关内容,参考 《Linux UART通讯》 。
3.3.1. 安装pyserial¶
重要
在前面小节的实验中,可能已经安装了此库,如已安装则跳过此操作。
pyserial 的安装方式如下:
# 在板卡使用如下命令安装
sudo pip3 install pyserial
3.3.2. 使用pyserial¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | """ pyserial uart 测试 """
import serial
# 打开uart3,设置串口波特率为115200,数据位为8,无校验位,停止位为1,不使用流控制,以非阻塞模式打开串口,等待时间为1s
with serial.Serial(
"/dev/ttymxc2",
baudrate=115200,
bytesize=serial.EIGHTBITS,
stopbits=serial.STOPBITS_ONE,
parity=serial.PARITY_NONE,
timeout=10,
) as uart3:
# 使用申请的串口发送字节流数据 "Hello World!\n"
uart3.write(b"Hello World!\n")
# 以非阻塞的方式打开的串口,在读取串口接收的数据时,该函数返回条件二者满足其一,一、读取到128个字节,二、读取时间超过1秒
buf = uart3.read(128)
# 注:Python读取出来的数据类型为:bytes
# 打印原始数据
print("原始数据:\n", buf)
# 转码为gbk字符串,可以显示中文
data_strings = buf.decode("gbk")
# 打印读取的数据量及数据内容
print("读取到 {:d} 个字节 , 以字符串形式打印:\n {:s}".format(len(buf), data_strings))
|
3.3.2.1. 实验操作¶
由于在硬件连接时,已经将uart3对应的TX\RX接口与USB转TTL模块的RX\TX接口连接, 所以要查看实验现象,需要使用到串口上位机以显示数据方便观察实验现象。
使用野火多功能调试助手中,就自带串口上位机。
如图,我们在串口助手中设置串口的工作模式与我们程序配置的一致,并打开对应的端口, 即图中的1、2步骤。接下我们运行程序。
示例代码使用LubanCat i.MX6ULL MINI板卡,操作如下:
# 确认已安装pyserial包
# 确认使能了UART设备树插件
# 在板卡uart_test.py所在的目录执行如下命令
python3 uart_test.py
# 可看到串口助手打印出的程序中编程好的数据:Hello World!\n
在终端中输入命令后,我们在串口助手中编辑要发送的数据,并发送,即图中的3、4步骤。
在等待超时后,可看到终端打印出的接收到的数据:你好世界
关于该库,更多的用法,参见:pyserial API 。
3.4. 方式二:使用python-periphery¶
python-periphery 库支持的UART功能是基于Linux的UART系统实现的,所以要想利用该库使用到UART的功能, 需要板卡提供支持。像鲁班猫板卡,就可以完美使用 python-periphery 库UART通讯功能。
3.4.1. 安装 python-periphery¶
重要
如在前面小节中安装了此库,务必跳过此操作。
python-periphery 的安装方式如下:
# 在板卡使用如下命令安装
sudo pip3 install python-periphery
3.4.2. periphery使用UART功能¶
使用 python-periphery 库进行UART功能使用的示例代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | """ periphery uart 测试 """
from periphery import Serial
try:
# 申请串口资源/dev/ttymxc2,设置串口波特率为115200,数据位为8,无校验位,停止位为1,不使用流控制
serial = Serial(
"/dev/ttymxc2",
baudrate=115200,
databits=8,
parity="none",
stopbits=1,
xonxoff=False,
rtscts=False,
)
# 使用申请的串口发送字节流数据 "Hello World!\n"
serial.write(b"Hello World!\n")
# 读取串口接收的数据,该函数返回条件二者满足其一,一、读取到128个字节,二、读取时间超过1秒
buf = serial.read(128, 1)
# 注:Python读取出来的数据类型为:bytes
# 打印原始数据
print("原始数据:\n", buf)
# 转码为gbk字符串,可以显示中文
data_strings = buf.decode("gbk")
# 打印读取的数据量及数据内容
print("读取到 {:d} 个字节 , 以字符串形式打印:\n {:s}".format(len(buf), data_strings))
finally:
# 释放申请的串口资源
serial.close()
|
代码说明:
第6行,申请UART资源,占用uart3,配置对应的工作模式
第16行,使用申请到的串口资源发送数据
第19行,使用申请到的串口资源接收数据,接收方式为阻塞接收
第23~27行,将读取到的数据打印出来
第30行,释放UART资源,释放uart3
3.4.2.1. 实验操作¶
实验操作与上同。
示例代码使用LubanCat i.MX6ULL MINI板卡,操作如下:
# 确认已安装python-periphery包
# 确认使能了UART设备树插件
# 在板卡uart_test.py所在的目录执行如下命令
python3 uart_test.py
# 可看到串口助手打印出的程序中编程好的数据:Hello World!\n
在终端中输入命令后,我们在串口助手中编辑要发送的数据,并发送,即图中的3、4步骤。
在等待超时后,可看到终端打印出的接收到的数据:你好世界
自此,实验完成。
python-periphery 库关于UART的更多用法,关注: Periphery UART 下给出的介绍。