树莓派4B串口通讯
chat 牛!备份一个,以下内容均来自chat老师
以下是一个完整的树莓派串口通信示例程序,包含发送和接收功能,并处理了树莓派特有的串口配置问题:
import serial
import timedef uart_communication():try:# 使用树莓派推荐的串口别名port_name = "/dev/serial0"# 配置串口参数uart = serial.Serial(port=port_name,baudrate=9600,bytesize=serial.EIGHTBITS,parity=serial.PARITY_NONE,stopbits=serial.STOPBITS_ONE,timeout=1.0, # 读超时1秒write_timeout=1.0, # 写超时1秒xonxoff=False, # 禁用软件流控rtscts=False # 禁用硬件流控)# 确保串口已打开if not uart.is_open:uart.open()print(f"串口 {port_name} 已打开, 波特率: {uart.baudrate}")# 测试消息test_message = "Hello from Raspberry Pi!\n"while True:try:# 发送数据print(f"发送: {test_message.strip()}")uart.write(test_message.encode('utf-8'))# 接收数据start_time = time.time()response = uart.readline()if response:print(f"收到: {response.decode('utf-8').strip()}")else:print("未收到响应数据 (超时)")# 等待2秒进行下一次通信time.sleep(2)except KeyboardInterrupt:print("\n程序被用户中断")breakexcept Exception as e:print(f"通信错误: {str(e)}")breakexcept serial.SerialException as e:print(f"串口初始化失败: {str(e)}")print("请检查:")print("1. 串口物理连接 (TX/RX)")print("2. 用户权限 (尝试: sudo usermod -a -G dialout $USER 然后注销重登)")print("3. 树莓派配置 (sudo raspi-config -> Interface Options -> Serial)")finally:if 'uart' in locals() and uart.is_open:uart.close()print("串口已关闭")if __name__ == "__main__":uart_communication()
使用前必备步骤:
1.启用树莓派串口
sudo raspi-config
选择:
-
Interface Options
→Serial Port
-
禁用登录shell(选择"No")
-
启用串口硬件(选择"Yes")
2.添加用户到dialout组
sudo usermod -a -G dialout $USER
注销后重新登陆使权限生效
3.检查串口映射
ls -l /dev/serial*
正常应显示:
/dev/serial0 -> ttyAMA0
/dev/serial1 -> ttyS0
硬件连接指南:
树莓派 其他设备
=======================
GPIO14 (TXD) ---> RXD
GPIO15 (RXD) ---> TXD
GND ---> GND
测试方法:
-
自发自收测试(短接TX-RX):
-
用杜邦线连接树莓派的GPIO14(TXD)和GPIO15(RXD)
-
直接运行程序,将看到自发自收的消息
-
-
与另一设备通信:
-
连接USB转TTL模块的RX到树莓派TX
-
连接USB转TTL模块的TX到树莓派RX
-
两边共接地线(GND)
-
使用串口调试助手(如Putty、minicom)在电脑端接收和发送数据
-
常见问题解决:
1.权限问题
sudo chmod a+rw /dev/serial0
2.禁用蓝牙(如使用ttyAMA0)
编辑/boot/config.txt
添加:
dtoverlay=disable-bt
3.检查串口活动
sudo dmesg | grep tty
4.测试串口回环
stty -F /dev/serial0 9600
echo "test" > /dev/serial0
cat < /dev/serial0