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

Arduino Uno双软串口无数据接收求助(GSM/GPS分接)

解决Arduino Uno双软件串口(GSM+GPS)兼容问题

我来帮你梳理下这个双软件串口的问题,结合你提到的AltSoftSerial和NeoSWSerial单独运行正常、同时使用出问题的情况,给你几个针对性的排查和解决方向:

1. 先确认库的引脚与资源限制

  • AltSoftSerial在Uno上是固定引脚的:它只能用引脚8(RX)和9(TX),刚好对应你的GPS模块接线,这部分没问题;
  • NeoSWSerial要避开AltSoftSerial的定时器资源:Uno上AltSoftSerial占用了Timer1,而你的GSM模块用的引脚2(RX)、3(TX)依赖的是外部中断(INT0/INT1),和Timer1不冲突,所以引脚搭配是合理的。

2. 避免同时读取两个串口的错误逻辑

两个软件串口不能同时进行读取操作,必须用轮询交替处理的方式,否则会导致其中一个串口的数据溢出丢失。给你一个基础的示例代码:

#include <AltSoftSerial.h>
#include <NeoSWSerial.h>

// GPS用AltSoftSerial,固定引脚8=RX、9=TX
AltSoftSerial gpsSerial;
// GSM用NeoSWSerial,引脚2=RX、3=TX
NeoSWSerial gsmSerial(2, 3);

void setup() {
  Serial.begin(9600);
  // 等待串口监视器连接(方便调试)
  while (!Serial);
  Serial.println("系统初始化中...");
  
  gpsSerial.begin(9600);
  Serial.println("GPS串口已启动");
  gsmSerial.begin(9600);
  Serial.println("GSM串口已启动");
}

void loop() {
  // 优先读取GPS数据,每次读1字节后切换
  if (gpsSerial.available()) {
    char gpsData = gpsSerial.read();
    Serial.print("[GPS] ");
    Serial.write(gpsData);
  }
  
  // 再读取GSM数据,同样单次读取后切换
  if (gsmSerial.available()) {
    char gsmData = gsmSerial.read();
    Serial.print("[GSM] ");
    Serial.write(gsmData);
  }
}

注意:别用while(serial.available())连续读取某一个串口的所有数据,这样会阻塞另一个串口的处理,导致数据丢失。

3. 硬件层面的排查要点

  • 接线交叉检查:模块的TX要接Arduino的RX,模块的RX要接Arduino的TX,别接反了;
  • 供电问题:GSM模块功耗很高,Arduino Uno的5V引脚供电大概率不够,建议给GSM模块单独接外部电源(比如3.7V锂电池+升压模块),否则模块可能无法正常工作;
  • 波特率匹配:确保代码中设置的波特率和GSM、GPS模块的默认波特率完全一致(比如都是9600),波特率不匹配会直接导致无输出或乱码。

4. 串口监视器的设置验证

  • 确认串口监视器的波特率和代码中Serial.begin()的波特率一致;
  • 勾选串口监视器右下角的"换行"或"回车+换行"选项,有些模块的输出需要换行符才能在监视器中正常显示。

5. 逐步调试定位问题

  • 先只保留GPS+AltSoftSerial的代码,确认串口监视器能正常收到GPS数据后,再添加GSM+NeoSWSerial的部分;
  • 可以在代码中添加更多调试打印,比如每次读取到数据时打印标记,这样能清楚看到哪个串口在工作、哪个有问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:32:07