You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 02:38:16