You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Arduino Due与GPS模块连接方法及SoftwareSerial库报错解决方案咨询

Arduino Due上传GPRS/GPS代码时SoftwareSerial库错误的解决方案

刚接触Arduino就折腾GPRS/GPS模块,挺棒的!不过你遇到的这个报错是个典型的新手坑——Arduino Due基于ARM内核,官方的SoftwareSerial库并不支持ARM架构的板卡,这就是代码上传失败的核心原因。原项目代码是为AVR架构的板卡(比如Uno、Nano)编写的,依赖SoftwareSerial模拟串口,但Due本身自带多个硬件串口,完全不需要模拟,我们只需要做几个简单修改就能解决问题:

一、替换SoftwareSerial为硬件串口

Arduino Due自带3个额外的硬件串口:Serial1、Serial2、Serial3,这些串口是原生硬件支持的,比模拟串口稳定得多。修改步骤如下:

  • 删除代码中所有和SoftwareSerial相关的引用:
    1. 删掉开头的#include <SoftwareSerial.h>
    2. 删除定义SoftwareSerial对象的代码(比如原代码里的SoftwareSerial gprsSerial(10, 11);
  • 把代码中所有的SoftwareSerial对象名(比如gprsSerial)替换成你选择的硬件串口(比如Serial1
  • setup()函数里初始化硬件串口:Serial1.begin(9600);(波特率要和原代码一致,比如原代码用9600就保持不变)

二、调整硬件接线

因为原来用的是模拟串口引脚,现在换成硬件串口,需要重新连接模块和Due:

  • 模块的TX引脚 → Arduino Due的Serial1 RX引脚(19号脚)
  • 模块的RX引脚 → Arduino Due的Serial1 TX引脚(18号脚)

注意:串口通信必须是交叉连接(TX接RX,RX接TX),别接反了!

三、修改示例对比

原代码片段(带SoftwareSerial):

#include <SoftwareSerial.h>
SoftwareSerial gprsSerial(10, 11); // RX, TX

void setup() {
  Serial.begin(9600);
  gprsSerial.begin(9600);
}

void loop() {
  if (gprsSerial.available()) {
    Serial.write(gprsSerial.read());
  }
  if (Serial.available()) {
    gprsSerial.write(Serial.read());
  }
}

修改后的代码片段(用硬件Serial1):

void setup() {
  Serial.begin(9600);
  Serial1.begin(9600); // 初始化硬件串口
}

void loop() {
  if (Serial1.available()) {
    Serial.write(Serial1.read());
  }
  if (Serial.available()) {
    Serial1.write(Serial.read());
  }
}

额外提示

如果修改后还有其他报错,可能是原代码中还有其他依赖AVR架构的函数,但最核心的问题已经通过替换硬件串口解决了。上传代码时记得选择正确的板卡:Arduino Due (Programming Port),然后正常上传即可。

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

火山引擎 最新活动