跳到主要内容

UART 使用

外设介绍

UART(通用异步收发传输器)是最基础的点对点串行通信接口,仅需 TX、RX 和 GND 三根线即可实现双向传输,常用于调试、传感器、舵机等场景。

核心特征

全双工异步:发送与接收独立,双方无需共享时钟,依靠约定的波特率同步。

波特率:常见 9600、115200 等,通信双方必须一致。

帧格式:1 起始位 + 5~9 数据位(通常 8 位)+ 可选校验位 + 1/2 停止位。

电平:芯片直出为 TTL/CMOS 电平,可通过转换芯片变为 RS-232、RS-485 等以延长距离。

板载资源:RDK 的 40pin 引脚提供多路 UART,对应设备节点如 /dev/ttyS0、/dev/ttyAMA0 等。

使用方法

Python 中可以使用 pyserial 操作 UART,使用如下 pip 命令安装,方式同 USB 串口描述一致:

pip install pyserial

一般调用流程:列出可用的串口设备 → 打开串口 → 发送/接收数据 → 关闭串口

# 必要的引用
import serial
import serial.tools.list_ports

# 列出可用串口
ports = serial.tools.list_ports.comports()
for p in ports:
print(p.device, p.description)

# 打开板载 UART,例如 /dev/ttyACM0,请根据实际接线选择
ser = serial.Serial(
port='/dev/ttyACM0', # 根据实际设备节点选择
baudrate=115200, # 波特率
timeout=1 # 读超时(秒),设为 None 则阻塞
)

# 发送数据
ser.write(b'Hello UART\r\n')
# 读取数据
data = ser.read(10) # 读 10 个字节,超时返回可能不足 10 字节
ser.close()

示例应用

总线舵机使用

以 STS3215 总线舵机为例。

该舵机总线需要 RS485 电平才可正常通信,使用合适的控制板/转接板将板卡发出的 USB/TTL 电平转换为 RS485 电平。

该舵机使用 FT-SCS 自定义协议,协议的命令帧如下:

字头ID 号数据长度指令参数校验和
0xFF 0xFFIDLengthInstructionParameter1 …Parameter NCheck Sum

查阅舵机手册获取数据长度、写指令、参数等信息,控制舵机角度对应的数据长度为 0x04,写指令为 0x03,参数有 3 个:目标位置段地址 0x2A目标位置低 8 位目标位置高 8 位。目标位置的取值范围:-32767 ~ 32767,BIT15 为符号位。

例:欲控制 ID 为 1 的舵机角度为 10000,需要按在一帧串口通信中发送以下内容,然后停止。

Byte0Byte1Byte2Byte3Byte4Byte5Byte6Byte7Byte8
0xFF0xFF0x010x050x030x2A0x270x100x6A

下方程序可以使用 S600 的 /dev/ttyS7 串口,控制 ID 为 1 的总线舵机角度在 2000±200 之间来回摆动。

import serial
import time

ser = serial.Serial('/dev/ttyS7', 1000000, timeout=0.1)

def write(addr, data):
cmd = bytearray([0xff, 0xff, 1, len(data) + 3, 0x03, addr]) + data
s = sum(cmd[2:]) & 0xff
cmd.append((~s) & 0xff)
ser.write(cmd)
time.sleep(0.001)

while True:
# 1800
write(0x2a, bytearray([0x08, 0x07, 0, 0, 0xe8, 0x03]))
time.sleep(1)
# 2200
write(0x2a, bytearray([0x98, 0x08, 0, 0, 0xe8, 0x03]))
time.sleep(1)