树莓派4与Teensy 4.0串口引脚通信故障排查求助
问题描述
尝试通过树莓派4的GPIO TX-RX引脚与Teensy 4.0进行串口通信,树莓派端使用C++结合wiringPi库编写发送代码,Teensy端用Arduino代码接收。当前现象为树莓派无报错但Teensy收不到消息,已确认交叉连接(树莓派GPIO14→Teensy引脚0,GPIO15→Teensy引脚1),Teensy可通过Arduino IDE正常访问,由树莓派5V/GND供电。
树莓派原代码
#include <iostream> #include <stdio.h> #include <unistd.h> #include <cstdlib> #include <wiringPi.h> #include <wiringSerial.h> int main() { int port; if ((port = serialOpen("/dev/ttyAMA0", 9600)) < 0) { fprintf(stderr, "Unable to open serial device: %s\n", strerror(errno)); return 1; } if (wiringPiSetup() == -1) { fprintf(stdout, "Unable to start wiringPi: %s\n", strerror(errno)); return 1; } //serialPrintf(port, "test\n"); serialPuts(port, "test"); serialClose(port); return 0; }
Teensy原代码
#include "Arduino.h" void setup() { Serial1.begin(9600); Serial.println("Listening..."); } void loop() { if (Serial1.available() > 0) { String incoming = Serial1.read(); Serial.print("Recieved: "); Serial.println(incoming); } }
排查与解决步骤
1. 树莓派串口前置配置
树莓派默认串口可能被控制台或蓝牙占用,需先启用硬件串口并关闭串口控制台:
- 运行命令
sudo raspi-config - 进入
Interfacing Options→Serial - 第一个选项"Would you like a login shell to be accessible over serial?"选择No
- 第二个选项"Would you like the serial port hardware to be enabled?"选择Yes
- 重启树莓派使配置生效
2. 确认正确的串口设备
由于是用GPIO引脚直接连接串口(非USB连接),树莓派端应使用硬件串口设备/dev/ttyAMA0。可以通过以下命令验证串口状态:
- 查看串口设备:
ls /dev/serial* - 查看串口日志:
dmesg | grep tty
3. 修复代码问题
树莓派代码修正点:
- 调整初始化顺序:必须先调用
wiringPiSetup()初始化库,再打开串口 - 添加延迟:发送后立刻关闭串口会导致数据未完全发送,需添加延迟确保数据输出完成
- 补充头文件:添加
<errno.h>以支持strerror(errno) - 可选:添加换行符:给发送的字符串加换行,方便Teensy识别完整数据
修正后的树莓派代码:
#include <iostream> #include <stdio.h> #include <unistd.h> #include <cstdlib> #include <errno.h> #include <wiringPi.h> #include <wiringSerial.h> int main() { if (wiringPiSetup() == -1) { fprintf(stderr, "Unable to start wiringPi: %s\n", strerror(errno)); return 1; } int port; if ((port = serialOpen("/dev/ttyAMA0", 9600)) < 0) { fprintf(stderr, "Unable to open serial device: %s\n", strerror(errno)); return 1; } serialPuts(port, "test\n"); usleep(100000); // 延迟100ms确保数据发送完成 serialClose(port); return 0; }
Teensy代码修正点:
- 字符读取错误:
Serial1.read()返回单个字符的ASCII值,直接赋值给String会导致显示数字而非字符,应改为char类型接收 - 确保USB串口初始化:
Serial.begin(9600)用于通过USB向电脑输出日志,需明确初始化
修正后的Teensy代码:
#include "Arduino.h" void setup() { Serial.begin(9600); // USB串口,用于向电脑打印日志 Serial1.begin(9600); // GPIO引脚的硬件串口 Serial.println("Listening..."); } void loop() { if (Serial1.available() > 0) { char incoming = Serial1.read(); Serial.print("Received: "); Serial.println(incoming); // 若要读取完整字符串,可替换为: // String incoming = Serial1.readStringUntil('\n'); // Serial.print("Received: "); // Serial.println(incoming); } }
4. 解决权限问题
确保当前用户拥有串口访问权限,将用户加入dialout组:
sudo usermod -aG dialout pi
执行后重新登录或重启树莓派生效。
内容的提问来源于stack exchange,提问作者Runsva
相关产品推荐
相关产品推荐

