我使用SIM800L GSM模块检测来电,通常情况下工作正常。唯一的问题是,有时GSM模块告诉arduino某人正在呼叫之前,它最多需要8个RING(在RING出现在串行连接上之前)。看起来好像是GSM网络的拥塞,但是普通通话(我的意思是人与人之间的通话)没有这种问题。它经常发生-因此它不可能是网络/提供程序过载。还有其他人有这样的问题吗? ISP /提供商:波兰加上GSM
我没有输入任何代码,因为问题出在我认为的不同层
答案 0 :(得分: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循环中,将传入的字节组合成一个字符串。
任何想法,用这个简单的代码可以改善什么?
答案 1 :(得分: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声振铃之后)