我正在使用带有IComsat SIM900 GSM / GPRS屏蔽的Arduino UNO . 使用以下教程:Arduino Live GPS Tracker我遇到了AT CREG?命令,检查SIM卡是否在提供商处注册 .
使用以下逻辑:在“void setup()”函数中的GSM_HTTP.INO文件中,以下行执行modem.checkNetwork();
void setup() {
Serial.begin(9600);
Serial.println("GM862 monitor");
modem.switchOn(); // switch the modem on
delay(4000); // wait for the modem to boot
modem.init(); // initialize the GSM part of Module
modem.version(); // request modem version info
while (!modem.isRegistered()) {
delay(1000);
modem.checkNetwork(); // check the network availability
}
}
函数“checkNetwork()”是包含的库GSM862.cpp的一部分,如下所示:
void GM862::checkNetwork() {
char buf[BUF_LENGTH];
char result;
requestModem("AT+CREG?", 1000, true, buf);
result = buf[21];
if (result == '1') {
state |= STATE_REGISTERED;
}
else {
state &= ~STATE_REGISTERED;
}
}
现在这是重要的部分:函数“requestModem”接收到的“result”的值返回隐藏值,但没有netword状态(数字0-5),这就是为什么有无限循环试图无错误地注册或成功的消息 .
由于此函数从GSM862.cpp中的函数“requestModem”中获取“buf”变量,我也看了一下:
byte GM862::requestModem(const char *command, uint16_t timeout, boolean check, char *buf) {
byte count = 0;
*buf = 0;
modem->flush();
modem->println(command);
count = getsTimeout(buf, timeout);
return count;
}
为了调试相关变量,我将最后两个函数更改为以下代码:
-
checkNetwork
void GSM862::checkNetwork() {
char buf[BUF_LENGTH];
char result;
requestModem("AT+CREG?", 1000, true, buf);
result = buf[21];
Serial.print("Debugging buf2:");
Serial.print(buf[21]);
Serial.print("Debugging buf2:");
Serial.print(buf[1]);
Serial.print("Debugging buf2:");
Serial.print(buf[0]);
Serial.print("Debugging result2:");
Serial.println(result);
if (result == '1') {
state |= STATE_REGISTERED;
Serial.println("Network registered, home network...");
}
else {
state &= ~STATE_REGISTERED;
if(result == '0'){
Serial.println("Network not registered, not searching for a new operator to register to...");
}
if(result == '2'){
Serial.println("Still searching for an operators network to register to...");
}
if(result == '3'){
Serial.println("Network registration denied...");
}
if(result == '4'){
Serial.println("Network registration state unknown, probably still starting up...");
}
if(result == '5'){
Serial.println("Network registered, roaming...");
}
}
}
-
请求调制解调器
byte GSM862::requestModem(const char *command, uint16_t timeout, boolean check, char *buf) {
byte count = 0;
*buf = 0;
modem->flush();
modem->println(command);
count = getsTimeout(buf, timeout);
Serial.print("Debugging command1:");
Serial.println(command);
Serial.print("Debugging count1:");
Serial.println(count);
Serial.print("Debugging buf1:");
Serial.println(buf);
Serial.print("Debugging timeout1:");
Serial.println(timeout);
return count;
}
就像我上面提到的那样,似乎函数“checkNetwork”的“结果”中的值实际上是“buf [21]”的值,当通过Serial.println显示在终端上时显示一个神秘的值( );
你知道为什么或确切的问题是什么?
1 回答
网络注册信息(CREG)输出取决于调制解调器配置 .
通过发送"AT+CREG=0"可以禁用网络注册码(这是你的情况)
通过发送"AT+CREG=1"可以启用网络注册
通过发送"AT+CREG=2"可以启用网络注册码
位置信息(位置区域代码和小区ID)
选项2和3.还将在调制解调器引导/网络更改时自动发出CREG消息 .
ps:不应忘记通过执行AT&W来保存当前的AT配置
有关CREG的更多详细信息,请参阅“SIM900 AT COMMAND MANUAL”