Arduino和Raspberry Pi 3(Raspy3)之间的串行通信是一个常见的需求,可以用于数据交换和控制。以下是一些基本的步骤和注意事项,帮助你解决Arduino和Raspy3之间的串行通信问题。
硬件连接
- 连接Arduino和Raspy3:
- 使用USB线将Arduino连接到Raspy3。
- 或者使用TX/RX引脚进行硬件串行通信:
- Arduino TX -> Raspy3 RX (GPIO 15)
- Arduino RX -> Raspy3 TX (GPIO 14)
- 共享GND。
软件设置
Arduino端
- 编写Arduino代码: void setup() { Serial.begin(9600); // 初始化串行通信,波特率为9600 } void loop() { if (Serial.available() > 0) { String incomingData = Serial.readStringUntil('\n'); // 读取串行数据直到换行符 Serial.println("Received: " + incomingData); // 发送确认消息 } }
Raspy3端
- 安装必要的库:
- 确保你已经安装了
pyserial
库,可以使用以下命令安装: sudo apt-get update sudo apt-get install python3-serial
- 编写Python代码:
import serial import time # 配置串行通信 ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1) # 使用正确的设备路径和波特率 def send_data(data): ser.write((data + '\n').encode()) # 发送数据并添加换行符 def read_data(): if ser.in_waiting > 0: line = ser.readline().decode('utf-8').rstrip() # 读取并解码数据 print("Received:", line) try: while True: send_data("Hello from Raspy3") read_data() time.sleep(1) # 每隔1秒发送和读取数据 except KeyboardInterrupt: ser.close() # 关闭串行连接
常见问题和解决方法
- 设备路径问题:
- 确保在Python代码中使用正确的设备路径(例如
/dev/ttyUSB0
或/dev/ttyAMA0
)。 - 可以使用
dmesg
命令查看设备路径: dmesg | grep tty
- 波特率不匹配:
- 确保Arduino和Raspy3的波特率设置一致。
- 权限问题:
- 确保你有权限访问串行设备。可以使用
sudo
运行Python脚本,或者将你的用户添加到dialout
组: sudo usermod -aG dialout $USER
- 数据丢失或乱码:
- 确保发送和接收的数据格式一致,避免特殊字符或过长的数据。
- 使用换行符或其他分隔符来确保数据的完整性。