SMS通知不适用于带有GSM模块的Arduino Nano
我想使用Arduino Nano来监控GSM模块的短信流量。我能够读取和发送SMS,但通知系统不工作:当我发送SMS(到GSM模块中的SIM卡)时,串行端口中没有新数据可用。知道我为什么或者如何调试以发现问题吗 通信通过GSM模块(Quectel EC25)的Arduino引脚9和10以及RX和TX完成。我正在使用的代码:SMS通知不适用于带有GSM模块的Arduino Nano,arduino,sms,gsm,at-command,Arduino,Sms,Gsm,At Command,我想使用Arduino Nano来监控GSM模块的短信流量。我能够读取和发送SMS,但通知系统不工作:当我发送SMS(到GSM模块中的SIM卡)时,串行端口中没有新数据可用。知道我为什么或者如何调试以发现问题吗 通信通过GSM模块(Quectel EC25)的Arduino引脚9和10以及RX和TX完成。我正在使用的代码: #include <SoftwareSerial.h> #define DEBUG Serial SoftwareSerial EC25(10,9); // R
#include <SoftwareSerial.h>
#define DEBUG Serial
SoftwareSerial EC25(10,9); // RX, TX - 9600 baud rate
// pin 8 of raspi -> pin 9 of arduino nano
// pin 10 of raspi -> pin 10 of arduino nano
#define AT_RESPONSE_LEN 100
#define TIMEOUT 1000
void setup() {
// put your setup code here, to run once:
EC25.begin(9600);
DEBUG.begin(9600);
// some AT commands just to see if the coms are ok
sendATComm("AT","OK\r\n");
sendATComm("AT+IPR?","OK\r\n");
sendATComm("AT+CGSN","OK\r\n");
sendATComm("AT+CNMI=2,1,0,0,0","OK\r\n");
DEBUG.println("listennig");
}
void loop() {
// put your main code here, to run repeatedly:
if (EC25.available()){
DEBUG.println("Notification received!");
}
}
// function for sending at command.
const char* sendATComm(const char *command, const char *desired_reponse)
{
uint32_t timer;
char response[AT_RESPONSE_LEN]; // module response for AT commands.
memset(response, 0 , AT_RESPONSE_LEN);
EC25.flush();
sendATCommOnce(command);
timer = millis();
while(true){
if(millis()-timer > TIMEOUT){
sendATCommOnce(command);
timer = millis();
}
char c;
int i = 0;
while(EC25.available()){
c = EC25.read();
DEBUG.write(c);
response[i++]=c;
delay(2);
}
if(strstr(response, desired_reponse)){
return response;
memset(response, 0 , strlen(response));
break;
}
}
}
// send at comamand to module
void sendATCommOnce(const char *comm)
{
EC25.print(comm);
EC25.print("\r");
delay(100);
}
#包括
#定义调试序列
软件系列EC25(10,9);//接收、发送-9600波特率
//raspi引脚8->arduino nano引脚9
//raspi的引脚10->arduino nano的引脚10
#在第100列中定义
#定义超时1000
无效设置(){
//将安装代码放在此处,以便运行一次:
EC25.begin(9600);
DEBUG.begin(9600);
//一些AT命令只是为了查看通信是否正常
sendATComm(“AT”,“OK\r\n”);
sendATComm(“AT+IPR?”,“OK\r\n”);
sendATComm(“AT+CGSN”,“OK\r\n”);
sendATComm(“AT+CNMI=2,1,0,0,0”,“正常”\r\n);
DEBUG.println(“listennig”);
}
void循环(){
//将主代码放在此处,以便重复运行:
if(EC25.available()){
println(“收到通知!”);
}
}
//用于发送at命令的函数。
const char*sendATComm(const char*命令,const char*所需响应)
{
uint32_t定时器;
char response[AT_response_LEN];//AT命令的模块响应。
memset(响应,0,在响应长度处);
EC25.flush();
sendATCommOnce(命令);
计时器=毫秒();
while(true){
如果(毫秒()-计时器>超时){
sendATCommOnce(命令);
计时器=毫秒();
}
字符c;
int i=0;
while(EC25.available()){
c=EC25.read();
DEBUG.write(c);
响应[i++]=c;
延迟(2);
}
if(strstr(响应、期望响应)){
返回响应;
memset(响应,0,strlen(响应));
打破
}
}
}
//发送至通信模块
void sendATCommOnce(常量字符*comm)
{
EC25.打印(通信);
EC25.打印(“\r”);
延迟(100);
}
因此,我不得不定义URC的输出端口来使用UART通信(而不是默认使用它)
默认配置设置为usbat
或usbmodem
,这意味着我等待的通知信息正在发送到这些串行端口之一。但我当时正在收听UART(通过RX和TX品脱),因此没有收到任何通知
AT命令QURCCFG
可用于设置应向哪个端口发送URC信号。在这种情况下,我希望将它们发送到UART:
AT+QURCCFG="urcport","uart1"
_“当我发送SNS(到GSM模块中的SIM卡)时,串行端口中没有新数据可用”\ux-这是什么意思?你收到短信(你可以稍后阅读),但你没有收到URC?我可以用AT命令阅读短信。问题是我想在新短信到达时收听通知。当我编写URC时,我谈论的是未经请求的结果代码(=通知)。+CNMI
设置似乎正确。当你说你“用AT命令阅读短信”时,是不是意味着你用你的例程发送了AT命令?换句话说,您的功能是否正常工作?如果答案是肯定的,我只有一个检查建议:可能阻止正确接收SMS的+CMTI
URC的唯一原因是SMS内存已满。你能检查一下吗?一个相关的问题(和答案):。好的,谢谢你提供的信息。是的,我可以通过这些功能阅读短信。问题是,当它接收到SMS时,没有数据通知数据发送到串行EC25,因此available()
方法没有输出任何内容。它不能与SIM卡相关,因为SIM卡正在与备用GSM模块(SIM7600)一起工作。但也许通知保存在模块的某个地方?现在更好了。投票支持研究和改进它的努力。