【发布时间】:2020-04-08 14:33:17
【问题描述】:
我有 Arduino UNO 和一个 Sim800L 模块,我知道读取串行的方法,类似于this question,但是当我执行此功能时:
String GetRegData()
{
Serial.println("Get nearby antenna info ...");
SIM800L.print("AT+CNETSCAN=1\r");
delay(1000);
SIM800L.print("AT+CNETSCAN\r");
delay(1000);
String buffer2;
while (SIM800L.available())
{
char c = SIM800L.read();
Serial.print(c);
buffer2.concat(c);
delay(10);
}
//Serial.println();
return buffer2;
}
输出是:
AT+CMGF=1
OK
AT+CNMI=2,2,0,0,0
OK
AT+CNETSCAN=1
OK
AT+CNETSCAN
Operator:"XXXX",MCC:XXX,MNC:XX,Rxlev:XX,Cellid:XX,Arfcn:XX,Lac:q5er32xlAair32xlAacrseifcca,Nvdc00
这个AT命令(AT+CNETSCAN)应该扫描所有附近的天线并在多行打印一些信息(根据数据表),当我在这个设备(SIM800L)上手动执行这个命令时,我得到多行这样的:
Operator:"XXXX",MCC:XXX,MNC:XX,Rxlev:XX,Cellid:XX,Arfcn:XX,Lac:XX,Bsic:XX
Operator:"XXXX",MCC:XXX,MNC:XX,Rxlev:XX,Cellid:XX,Arfcn:XX,Lac:XX,Bsic:XX
Operator:"XXXX",MCC:XXX,MNC:XX,Rxlev:XX,Cellid:XX,Arfcn:XX,Lac:XX,Bsic:XX
OK
但是我不知道当我以编程方式执行它时会发生什么,它搞砸了,我试图改变波特率并改变接收方法并逐个读取字符,我确实在接收之间设置了延迟,我试图做@ 987654325@ 或 for 而不是 while 但没有运气。
我猜在接收每一行之间会有延迟,它会破坏串行可用性,但我不知道该怎么办!任何帮助将不胜感激。
顺便说一下,我的设置函数:
void setup() {
SIM800L.begin(9600);
Serial.begin(9600);
delay(3000);
SIM800L.print("AT+CMGF=1\r");
delay(100);
SIM800L.print("AT+CNMI=2,2,0,0,0\r");
delay(100);
GetRegData();
delay(1000);
}
Ps:整个东西(Arduino + Sim800L)工作正常,没有错误,Simcard已解锁,可以发送接收短信和电话等。
【问题讨论】:
-
所以您在抱怨第一行的“LAC”字段中的响应似乎已损坏?
-
@RobertoCaboni 是的,看起来,在 LAC 字段附近发生了一些不好的事情,其余的行没有打印或保存在变量中。
-
Operator:"XXXX",MCC:XXX,MNC:XX,Rxlev:XX,Cellid:XX,Arfcn:XX,Lac:...中的“X”是否替代了 1vs1 的实际字符?响应中的第一个意外字符是什么?该消息是由Serial.print(c);还是由另一个外部调用打印缓冲区2 打印的? -
我注意到大约 64 个字符后的输出很奇怪。 PS:serial.read() 返回一个 int 类型变量(错误时为 -1,所以你应该检查它的返回值)
-
@RobertoCaboni 的输出类似于 ::Operator:"405803",MCC:405,MNC:803,Rxlev:62,Cellid:51A5,Arfcn:702 和串行打印什么都没有。
标签: arduino serial-port gsm at-command sim800l