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

Linux与ESP32串口通信异常:自定义C++程序无返回数据

Linux C++串口程序无法接收ESP32返回数据的排查与解决

问题概述

  • 开发Linux命令行程序,实现与ESP32的串口交互,不依赖Arduino串口监视器
  • 参考C++串口通信教程编写代码后,无法接收ESP32返回数据:
    • Linux端配置termios参数,发送数据后读取到0字节
    • ESP32端通过Serial.readStringUntil('\r\n')接收指令并返回结果,但无响应
    • 确认串口为/dev/ttyUSB0,执行while true; do cat /dev/ttyUSB0; done监听无输出
  • 相关代码及项目仓库:github.com/Chocobonis/phoenix-OS

排查步骤与解决方案

1. 串口权限检查

  • 执行ls -l /dev/ttyUSB0查看设备权限,确认当前用户是否属于tty或dialout组
  • 若未加入,执行sudo usermod -aG dialout $USER添加权限,重启终端后生效

2. Termios参数修正

确保Linux端termios配置覆盖以下关键项(波特率需与ESP32一致,示例为115200):

struct termios tty;
// 读取当前串口配置
if (tcgetattr(fd, &tty) != 0) {
    perror("tcgetattr failed");
    return -1;
}

// 设置波特率
cfsetispeed(&tty, B115200);
cfsetospeed(&tty, B115200);

// 8N1配置(8位数据位、无校验、1位停止位)
tty.c_cflag &= ~PARENB;
tty.c_cflag &= ~CSTOPB;
tty.c_cflag &= ~CSIZE;
tty.c_cflag |= CS8;

// 禁用硬件流控,启用读取
tty.c_cflag &= ~CRTSCTS;
tty.c_cflag |= CREAD | CLOCAL;

// 禁用规范模式、回显、信号处理
tty.c_lflag &= ~ICANON;
tty.c_lflag &= ~ECHO;
tty.c_lflag &= ~ECHOE;
tty.c_lflag &= ~ECHONL;
tty.c_lflag &= ~ISIG;

// 禁用软件流控与输入转换
tty.c_iflag &= ~(IXON | IXOFF | IXANY);
tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL);

// 禁用输出处理
tty.c_oflag &= ~OPOST;
tty.c_oflag &= ~ONLCR;

// 设置读取超时:1秒超时,最小读取1字节(避免立即返回0)
tty.c_cc[VTIME] = 10;
tty.c_cc[VMIN] = 1;

// 应用配置
if (tcsetattr(fd, TCSANOW, &tty) != 0) {
    perror("tcsetattr failed");
    return -1;
}
  • 核心问题点:若VMIN设为0且VTIME为0,read会立即返回0字节;必须保证波特率与ESP32的Serial.begin(xxx)完全匹配

3. ESP32端代码验证

确保ESP32端正确响应指令并返回带\r\n的结果:

void setup() {
  Serial.begin(115200);
  while (!Serial); // 等待USB串口连接(仅适用于USB转串口模块)
}

void loop() {
  if (Serial.available() > 0) {
    String cmd = Serial.readStringUntil('\r\n');
    // 务必返回包含\r\n的响应,匹配Linux端读取逻辑
    Serial.print("ACK: ");
    Serial.println(cmd);
    Serial.print("\r\n");
  }
}
  • 注意:Linux端发送指令时必须末尾添加\r\n,否则ESP32的readStringUntil会一直等待结束符

4. 硬件与基础测试

  • 用screen /dev/ttyUSB0 115200手动测试串口:输入指令后查看是否有返回,排除硬件或ESP32代码问题
  • 若cat /dev/ttyUSB0无输出,先确认ESP32开机是否打印初始化信息,排查硬件连接

内容的提问来源于stack exchange,提问作者bonii

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 10:08:15