这里记录下调试EC20模块的初始化过程。
先看初始化代码:
void EC20_Init(void)
{
printf("AT\r\n");
delay_ms(500);
strx = strstr((const char *)RxBuffer, (const char *)"OK"); //返回OK
while (strx == NULL)
{
Clear_Buffer();
printf("AT\r\n");
delay_ms(500);
strx = strstr((const char *)RxBuffer, (const char *)"OK"); //返回OK
}
Clear_Buffer();
printf("AT+QGPS?\r\n");//查询当前状态
delay_ms(500);
strx = strstr((const char *)RxBuffer, (const char *)"+QGPS: 1"); //返回已经上电
if (strx == NULL) //如果没上电就上电,上电就不要重复上电
printf("AT+QGPS=1\r\n");//对GNSS上电
delay_ms(500);
printf("ATE1\r\n"); //关闭回显
delay_ms(500);
Clear_Buffer();
printf("AT+CSQ\r\n"); //检查CSQ
delay_ms(500);
printf("ATI\r\n"); //检查模块的版本号
delay_ms(500);
/////////////////////////////////
printf("AT+CPIN?\r\n");//检查SIM卡是否在位
delay_ms(500);
strx = strstr((const char *)RxBuffer, (const char *)"+CPIN: READY"); //查看是否返回ready
while (strx == NULL)
{
Clear_Buffer();
printf("AT+CPIN?\r\n");
delay_ms(500);
strx = strstr((const char *)RxBuffer, (const char *)"+CPIN: READY"); //检查SIM卡是否在位,等待卡在位,如果卡识别不到,剩余的工作就没法做了
}
Clear_Buffer();
///////////////////////////////////
printf("AT+CREG?\r\n");//查看是否注册GSM网络
delay_ms(500);
strx = strstr((const char *)RxBuffer, (const char *)"+CREG: 0,1"); //返回正常
extstrx = strstr((const char *)RxBuffer, (const char *)"+CREG: 0,5"); //返回正常,漫游
while (strx == NULL && extstrx == NULL)
{
Clear_Buffer();
printf("AT+CREG?\r\n");//查看是否注册GSM网络
delay_ms(500);
strx = strstr((const char *)RxBuffer, (const char *)"+CREG: 0,1"); //返回正常
extstrx = strstr((const char *)RxBuffer, (const char *)"+CREG: 0,5"); //返回正常,漫游
}
Clear_Buffer();
/////////////////////////////////////
printf("AT+CGREG?\r\n");//查看是否注册GPRS网络
delay_ms(500);
strx = strstr((const char *)RxBuffer, (const char *)"+CGREG: 0,1"); //,这里重要,只有注册成功,才可以进行GPRS数据传输。
extstrx = strstr((const char *)RxBuffer, (const char *)"+CGREG: 0,5"); //返回正常,漫游
while (strx == NULL && extstrx == NULL)
{
Clear_Buffer();
printf("AT+CGREG?\r\n");//查看是否注册GPRS网络
delay_ms(500);
strx = strstr((const char *)RxBuffer, (const char *)"+CGREG: 0,1"); //,这里重要,只有注册成功,才可以进行GPRS数据传输。
extstrx = strstr((const char *)RxBuffer, (const char *)"+CGREG: 0,5"); //返回正常,漫游
}
Clear_Buffer();
printf("AT+COPS?\r\n");//查看注册到哪个运营商,支持移动 联通 电信
delay_ms(500);
Clear_Buffer();
printf("AT+QICLOSE=0\r\n");//关闭socket连接
delay_ms(500);
Clear_Buffer();
printf("AT+QICSGP=1,1,\042CMNET\042,\042\042,\042\042,0\r\n");//接入APN,无用户名和密码
delay_ms(500);
strx = strstr((const char *)RxBuffer, (const char *)"OK"); //开启成功
while (strx == NULL)
{
delay_ms(500);
strx = strstr((const char *)RxBuffer, (const char *)"OK"); ////开启成功
}
Clear_Buffer();
printf("AT+QIDEACT=1\r\n");//去激活
delay_ms(500);
strx = strstr((const char *)RxBuffer, (const char *)"OK"); //开启成功
while (strx == NULL)
{
delay_ms(500);
strx = strstr((const char *)RxBuffer, (const char *)"OK"); //开启成功
}
Clear_Buffer();
printf("AT+QIACT=1\r\n");//激活
delay_ms(500);
strx = strstr((const char *)RxBuffer, (const char *)"OK"); //开启成功
while (strx == NULL)
{
delay_ms(500);
strx = strstr((const char *)RxBuffer, (const char *)"OK"); //开启成功
}
Clear_Buffer();
printf("AT+QIACT?\r\n");//获取当前卡的IP地址
delay_ms(500);
Clear_Buffer();
printf("AT+QIOPEN=1,0,\"TCP\",\"47.92.146.210\",10000,0,1\r\n");//这里是需要登陆的IP号码,采用直接吐出模式
delay_ms(500);
strx = strstr((const char *)RxBuffer, (const char *)"+QIOPEN: 0,0"); //检查是否登陆成功
while (strx == NULL)
{
strx = strstr((const char *)RxBuffer, (const char *)"+QIOPEN: 0,0"); //检查是否登陆成功
delay_ms(100);
}
delay_ms(500);
Clear_Buffer();
}
这是串口助手抓到的EC20模块返回来的数据:
RDY
OK
+QGPS: 0
OK
OK
OK
AT+CSQ
+CSQ: 99,99
OK
ATI
Quectel
EC20F
Revision: EC20CEFILGR06A05M1G
OK
AT+CPIN?
+CPIN: READY
OK
AT+CREG?
+CREG: 0,2
****************
此处包含无数条重复的,可能是因为第一次开机,
OK
AT+CREG?
+CREG: 0,2
****************
OK
AT+CREG?
+CREG: 0,2
OK
AT+CREG?
+CREG: 0,1
OK
AT+CGREG?
+CGREG: 0,1
OK
AT+COPS?
+COPS: 0,0,"CHINA MOBILE",7
OK
AT+QICLOSE=0
OK
AT+QICSGP=1,1,"CMNET","","",0
OK
AT+QIDEACT=1
OK
AT+QIACT=1
OK
AT+QIACT?
+QIACT: 1,1,1,"10.104.80.212"
OK
AT+QIOPEN=1,0,"TCP","47.92.146.210",10000,0,1
OK
+QIOPEN: 0,0
以下是参考移远的手册,截取的关于上述使用的指令的说明:
Turn on GNSS engine, current
这里用到了GNSS的状态查询AT+QGPS?
,因为多次上电会报错,所以先查询内部GPS开启情况,再开启。
AT+CSQ indicates the received signal strength
这个指令听说是用来查询信号强度和误码率,这里可能是因为还未注册,所以返回的都是99。
The ATI command delivers a product information text.
这个指令用于查询模块的版本型号。
AT+CPIN is used to enter a password or query whether or not the module requires a password which is necessary before it can be operated (SIM PIN, SIM PUK, PH-SIM PIN, etc.).
这个指令用于查询SIM卡的密码类型。实际测试,如果没有插卡,会返回如下消息,所以这个指令可以用来检测SIM卡是否存在。
AT+CPIN?
+CME ERROR: 10
AT+CREG returns the network registration status. The write command sets whether or not to present URC.
手册上这里区分了CDMA和非CDMA,博主对这一块不太熟悉,但是看后面的参数,好像CDMA包含了非CDMA的各种情况。
n | 含义 |
---|---|
0 | 关闭网络注册的主动上报结果码 |
1 | 打开网络注册的主动上报结果码 |
2 | 打开网络注册和位置信息的主动上报结果码 |
stat | 含义 | CDMA支持 |
---|---|---|
0 | 未注册,终端当前并未在搜寻新的运营商 | 支持 |
1 | 已注册本地网络 | 支持 |
2 | 未注册,终端正在搜寻基站 | 支持 |
3 | 注册被拒绝 | 不支持 |
4 | 未知错误 | 不支持 |
5 | 已注册,注册到漫游网络 | 不支持 |
这里需要关注的是1和5两种情况。
The AT+CGREG command queries the network registration status and controls the presentation of an unsolicited result code +CGREG:
这个指令和上面的指令差不多,但前者是仅注册网络,后者注册是GPRS或者4G上网功能;个人理解就是第一个注册成功了之后手机上可以显示中国移动,第二个注册成功了手机上会有4G的图标。
AT+COPS returns the current operators and their status and allows to set automatic or manual network selection.
这个指令用于查询运营商,如+COPS: 0,0,"CHINA MOBILE",7
代表自动注册,GB2312类型的运营商,中国移动“CHINA MOBILE”,E-UTRAN代表4G接入。
Close the specified socket service by AT+QICLOSE. Depending on the Network, it will take at most 10 seconds (default value, host could modify the time with
指令用于关闭socket连接。
Configure the
这里通过AT+QICSGP=1,1,\042CMNET\042,\042\042,\042\042,0\r\n
配置1号接入点为CMNET进行联网。
AT+QIDEACT will deactivate the specific context
Before activating context by AT+QIACT, host should configure the context by AT+QICSGP. After activation, the IP address can be queried by AT+QIACT?. The range of
AT+QIACT=1
将激活接入点CMNET,允许连接。
AT+QIACT?
指令还可以查询获取的IP地址。
Start a socket service by AT+QIOPEN. The service type can be specified by the parameter
通过AT+QIOPEN=1,0,\"TCP\",\"47.92.146.210\",10000,0,1\r\n
即可通过CMNET接入点,socket0,本地的任意端口,直接吐出模式建立TCP连接。