树莓派 4 与 HiFive1 建立 UART 通信实验指南
本实验将建立树莓派 4 与 HiFive1 间可靠 UART 连接,编程 HiFive1 回显接收数据,并编写树莓派 Python 脚本转发转向角度至开发板。
第 0 部分:在树莓派 4 上启用 UART
树莓派 4 内置四个 UART 控制器。本实验使用 uart2 与 uart3。向 /boot/config.txt 添加以下行并重启:
dtoverlay=uart2,115200 dtoverlay=uart3,115200
重启后,设备节点 /dev/ttyAMA1 (uart2) 与 /dev/ttyAMA2 (uart3) 将可用。
按以下方式连接两板:
- HiFive1 UART1 RX (引脚 7) ↔ Pi 4 UART2 TX (引脚 27) — 数据通道 传输转向指令。
- HiFive1 UART0 TX (引脚 1) ↔ Pi 4 UART3 RX (引脚 29) — 调试通道 输出控制台信息。
树莓派端通过 /dev/ttyAMA1 发送至 HiFive1,通过 /dev/ttyAMA2 接收 HiFive1 控制台输出。
第 1 部分:编程 HiFive1
在 PC (非树莓派) 下载骨架项目:
$ cd ~/Documents/PlatformIO $ wget https://ittc.ku.edu/~heechul/courses/eecs388/l10-comm.tar.gz $ tar zxvf l10-comm.tar.gz
将 l10-interrupt 文件夹加入 VSCode 工作区。目标:从 UART1 读数据、在 UART0 回显、并打印至控制台。
简明算法:
while (1) {
if (ser_isready(1)) {
char data = ser_read(1);
ser_write(0, data);
ser_printline(0, "Received: ");
/* 按需调整格式 */
}
}
串口 API 定义于 eecs388_lib.h/c:
void ser_setup(int devid); int ser_isready(int devid); void ser_write(int devid, char c); void ser_printline(int devid, char *str); char ser_read(int devid); int ser_readline(int devid, int n, char *str);
注意 devid = 0 选 UART0,devid = 1 选 UART1。ser_isready 检查 UART IP 寄存器是否有待读数据:
int ser_isready(int devid) {
uint32_t regval = *(volatile uint32_t *)(UART_ADDR(devid) + UART_IP);
return regval;
}
编译烧录后,切换至树莓派打开两个终端:
- 数据发送端:
screen /dev/ttyAMA1 115200 - 调试查看端:
screen /dev/ttyAMA2 115200
在发送端终端输入任意字符串;调试终端应显示相同字符串,确认通信正常。
第 2 部分:树莓派 4 Python 脚本
替代手动终端,编写 Python 程序:
- 打开
/dev/ttyAMA1写入转向角度。 - 打开
/dev/ttyAMA2用于调试。 - 捕获摄像头帧、运行 DNN 推理、将结果角度发送至 HiFive1。
使用 pySerial 的骨架示例:
import serial
import time
import cv2 # 或您的摄像头接口
# 打开串口
ser1 = serial.Serial('/dev/ttyAMA1', 115200, timeout=1)
ser2 = serial.Serial('/dev/ttyAMA2', 115200, timeout=1)
while True:
# 捕获帧
frame = cv2.imread('frame.jpg') # 替换为实际摄像头读取
# DNN 推理
angle = dnn_inference(frame) # float32
# float 转 4 字节
angle_bytes = angle.to_bytes(4, byteorder='little', signed=True)
ser1.write(angle_bytes)
# 可选:读取调试输出
debug = ser2.readline().decode().strip()
if debug:
print('HiFive1:', debug)
# 定时控制 (如 30 fps)
time.sleep(1/30)
# 清理
ser1.close()
ser2.close()
注意:发送前将 float 转字节,HiFive1 解析时用相同字节序。
附录:树莓派 4 GPIO 与外设概览
树莓派 4 扩展了 I²C、SPI 与 UART 接口。用 pinout 命令查看所有引脚:
pinout
关键外设:
- I²C — 最多 6 条总线,用
sudo i2cdetect -y 1发现设备。 - SPI — 通过
raspi-config启用,使用标准 SCLK/MOSI/MISO 线。 - UART — 异步串口,适合无头通信或连接 HiFive1 等单片机。
详细配置请参阅官方树莓派文档:Config-txt 指南。
制造工艺
- NodeMCU DHT22接入树莓派3B+ MQTT Broker:无缝物联网集成指南
- 树莓派传感器数据融合实战:GPS 与 MPU‑9150 IMU 的 I²C 与 UART 接入
- Arduino 与树莓派 2 I2C 通信集成:打造物联网传感器项目的最佳搭档
- M2M(机器对机器)通信:定义、原理与价值
- 数字通信基础:从理论到实际实现
- 理解数据流:从单工到全双工通信
- 光数据通信:利用光实现高带宽、无干扰传输
- 确定性与容错性:工业控制网络的核心设计原则
- 超宽带(UWB)技术:面向高速、安全短距连接的现代无线标准
- 精通 UART:通用异步收发器详解
- 革命性紧凑光放大器:无噪声太空与光纤通信新希望
- 掌握无线通信距离:功率、速率与干扰如何塑造连接能力