为何SIM900与ATMEGA328PU在不同PC的Arduino串口监视器下结果不同?
我在面包板上连接了SIMCOM900与ATMEGA328PU:使用一台PC的Arduino串口监视器输入指令时,设备能输出正确结果;但使用另一台PC的Arduino串口监视器输入相同指令(电路未改变),设备甚至无响应。
用到的代码
#include <SoftwareSerial.h> //SIM800 TX连接到Arduino D8 #define SIM800_TX_PIN 10 //SIM800 RX连接到Arduino D7 #define SIM800_RX_PIN 11 //创建用于与SIM800通信的软件串口对象 SoftwareSerial serialSIM800(SIM800_TX_PIN,SIM800_RX_PIN); void setup() { //启动Arduino与Arduino IDE(串口监视器)的串口通信 Serial.begin(9600); while(!Serial); //启动Arduino与SIM800的串口通信 serialSIM800.begin(9600); delay(1000); Serial.println("Setup Complete!"); } void loop() { //读取SIM800输出(若有)并打印到Arduino IDE串口监视器 if(serialSIM800.available()){ Serial.write(serialSIM800.read()); } //读取Arduino IDE串口监视器输入(若有)并发送至SIM800 if(Serial.available()) { serialSIM800.write(Serial.read()); } }
输出对比
无响应情况(另一台PC)
Setup Complete!
ATATAT
正常响应情况(第一台PC)
Setup Complete!
AT
OK
AT+CENG?
+CENG: 0,0
OK
AT+CNETSCAN
Operator:"405803",MCC:405,MNC:803,Rxlev:62,Cellid:51A5,Arfcn:702
Operator:"405803",MCC:405,MNC:803,Rxlev:51,Cellid:51A7,Arfcn:709
Operator:"405803",MCC:405,MNC:803,Rxlev:45,Cellid:35D6,Arfcn:703
Operator:"405803",MCC:405,MNC:803,Rxlev:37,Cellid:51A6,Arfcn:707
Operator:"Airtel",MCC:404,MNC:45,Rxlev:30,Cellid:08EC,Arfcn:53
Operator:"Airtel",MCC:404,MNC:45,Rxlev:28,Cellid:08E9,Arfcn:55
Operator:"Airtel",MCC:404,MNC:45,Rxlev:25,Cellid:08EA,Arfcn:103
Operator:"Airtel",MCC:404,MNC:45,Rxlev:18,Cellid:AF79,Arfcn:59
Operator:"Airtel",MCC:404,MNC:45,Rxlev:22,Cellid:186B,Arfcn:60
Operator:"Airtel",MCC:404,MNC:45,Rxlev:30,Cellid:08EB,Arfcn:61
Operator:"Hutch-Kamataka",MCC:404,MNC:86,Rxlev:51,Cellid:11B5,Arfcn:725
Operator:"Hutch-Kamataka",MCC:404,MNC:86,Rxlev:51,Cellid:11B4,Arfcn:666
Operator:"Spice Telecom",MCC:404,MNC:44,Rxlev:37,Cellid:0A5D,Arfcn:22
Operator:"Spice Telecom",MCC:404,MNC:44,Rxlev:34,Cellid:0A5B,Arfcn:25
Operator:"Spice Telecom",MCC:404,MNC:44,Rxlev:33,Cellid:0A5C,Arfcn:17
Operator:"Bharat Karnataka",MCC:404,MNC:71,Rxlev:21,Cellid:DB93,Arfcn:76
排查方案与分析
我之前调试SIM模块时也遇到过几乎一模一样的问题,核心原因基本都是PC端串口配置不匹配或者硬件层面的通信干扰/供电问题,给你列几个优先级最高的排查点:
检查串口监视器的参数设置:
这是最常见的问题!你看无响应时输出的ATATAT,明显是你多次输入AT但SIM900没识别到指令结尾——因为另一台PC的串口监视器可能没设置正确的换行符。一定要确保:- 波特率选9600(和代码里一致)
- 换行符设置为NL & CR(AT指令必须以回车换行结尾才能被模块识别)
- 数据位8、无校验、停止位1(默认是这个,但别不小心改了)
排查PC的USB驱动与供电:
另一台PC可能没正确安装Arduino的CH340/FT232等串口驱动,导致串口通信异常;另外SIM900模块工作时电流不小,有些PC的USB口供电不足会让模块无法正常响应。你可以:- 打开设备管理器,看看串口端口有没有黄色感叹号,有就重新装驱动
- 换PC上的其他USB端口试试,优先用后置USB口(供电更稳)
检查USB线缆质量:
劣质或过长的USB线缆会导致串口信号衰减,尤其是高频的串口通信。换一根短一点、质量好的USB线试试,别用那种几元钱的细线。延长SIM模块的初始化延迟:
代码里的delay(1000)可能不够,有些SIM模块需要3-5秒才能完成网络注册和初始化。把延迟改成delay(3000)或者delay(5000),再测试看看。关闭硬件流控:
有些PC的串口默认开启了RTS/CTS硬件流控,但你的电路里没接这些引脚,会导致通信卡住。可以在Arduino串口监视器的设置里关闭流控,或者去设备管理器的串口属性里禁用硬件流控。
内容的提问来源于stack exchange,提问作者bandejiya

