chat 牛!备份一个,以下内容均来自chat老师
以下是一个完整的树莓派串口通信示例程序,包含发送和接收功能,并处理了树莓派特有的串口配置问题:
import serial
import time
def 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程序被用户中断")
break
except Exception as e:
print(f"通信错误: {str(e)}")
break
except 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