0

我使用 SIM800L GSM 模块来检测来电,通常它工作正常。唯一的问题是,有时在 GSM 模块告诉 arduino 有人打电话之前(在 RING 出现在串行连接上之前),它需要多达 8 个 RING。它看起来像 GSM 网络拥塞,但我在正常通话中没有这样的问题(我的意思是人与人之间的通话)。它经常发生 - 所以它不能是网络/提供商过载。其他人有这样的问题吗?ISP/提供商:波兰的 Plus GSM

我没有放任何代码,因为我认为问题出在不同的层

4

2 回答 2

0

对不起,我没有早点回答。我已经对其进行了测试,结果证明在最低限度的代码中它工作正常!我的意思是,我可以在拨号后立即在串行监视器上看到“RING”。所以不是硬件问题!

//bare minimum code:
void loop() {
  if(serialSIM800.available()){
    Serial.write(serialSIM800.read());
  }
  if(Serial.available()){    
    serialSIM800.write(Serial.read());
  }
}

在我的真实代码中,我需要将呼叫号码与受信任的列表进行比较。为此,我将所有受信任的号码保存在 sim 卡上的联系人列表中(公共前缀名称为“mytrusted”)。所以,在主循环中有 if 语句:

   while(mySerial.available()){
     incomingByte = mySerial.read();
     inputString += incomingByte;

   }

   if (inputString.indexOf("mytrusted") > 0){
    isTrusted = 1;
    Serial.println("A TRUSTED NUMBER IS CALLING");
   }

添加此“如果条件”后,Arduino 有时会在第 1 次通话后识别可信号码,有时在第 4 次或第 5 次后识别。我不是怀疑 if 语句本身,而是前面的 while 循环,其中传入的字节被组合成一个字符串。

任何想法,在这个简单的代码中可以改进什么?

于 2019-06-24T11:24:23.697 回答
0

看来,我找到了解决问题的方法。我只是每 20 秒向 SIM800L 发送一个简单的“AT”命令(它回复“OK”)。我使用计时器来计算这 20 秒的间隔(而不是简单的延迟功能)

TimerObject *timer2 = new TimerObject(20000); //AT command interval 
....
timer2->setOnTimer(&SendATCMD);  
....

void SendATCMD () {
  mySerial.println("AT");
  timer2->Stop();
  timer2->Start();
 }

通过这个简单的修改,Arduino 总是可以立即看到来电(响铃 1 次后)

于 2019-07-01T06:35:56.837 回答