关联:大夏龙雀、阿里云、mqtt、dx_ct511、stm32
4G模块我这边使用的是大夏龙雀的4G模块,如果是新人购买,9.9就能买到测试套装,还是比较划算的,这个模块也是通过串口使用AT命令交互的,对之前使用过ESP8266的小伙伴来说应该不会很难,之所以选择4G模块而不选择ESP8266也是因为考虑到整体系统的使用场景,以野外或者长距离为主,使用WiFi会有很多局限性,所以选择4G。
我们对4G模块进行初始化主要策略也是查配置这两个手段通过观察数据手册上的命令行来进行相关的操作。我们先来看手册,手册上有我们需要的所有内容。
命令格式如下:
AT+Command=<param1,param2,param3><CR><CF>
所有的指令以 AT 开头,<CR><LF>结束,在本文档中表现命令和响应的表格中,省略了<CR><LF>,仅显示命令和响应。所有 AT 命令字符都为大写。
<>内为可选内容,如果命令中有多个参数,以逗号"。”隔开,实际命令中不包含尖括号。
<CR>为回车字符\r,十六进制为 0XOD.
<LF>为换行字符\n,十六进制为 0X0A。
指令执行成功,返回相应命令以 OK结束,失败返回 ERROR 或者+CME ERROR:<err>,"<err>”内容为对应错误码(错误码请参考 5.10)
通过观察这个命令格式,其中表主要的一点就是AT一定要大写,相信使用过ESP8266的小伙伴对这个一定不陌生
红框里面这几个命令我感觉对模块初始化比较关键,我们得了解到模块的联网状态以及sim卡状态,最主要的是能不能上网,毕竟都不能上网我们还怎么上云呢?
下面是我的初始化代码,提供参考:
uint8_t CT511_Init(void)
{
CT511_DIS() //使能拉低,关机
user_delay_ms(800);
CT511_EN() //使能拉高,开机
user_delay_ms(8000); //等待开机完成
debug_print("\r\n初始化4G模块请等待\r\n");
//CT511_CheckAck("AT+RESET\r\n", "OK", 3000);
/* 测试模块接口状态 */
if (CT511_CheckAck("AT\r\n", "OK", 1500) == 1)
{
/* 获取模块信号强度 */
CT511_BUFF_MEMSET();
CT511_SEND("AT+CSQ\r\n");
HAL_Delay(10); // 延时10ms
if (ct511.buff_flag != 1)
{
return 0; // 信号强度获取失败
}
ct511.buff_flag = 0;
debug_print("\n ------> recv: %s \n", ct511.BUFF);
parseCSQ((const char *)ct511.BUFF, &ct511.signal_quality, &ct511.RXQUAL);
if (ct511.signal_quality == 99)
{
debug_print("无信号");
return 0;
}
debug_print("4G_Rssl %ddBm,RXQUAL %d\r\n", ct511.signal_quality, ct511.RXQUAL);
/* 获取模块网络状态 */
CT511_BUFF_MEMSET();
CT511_SEND("AT+CEREG?\r\n");
HAL_Delay(500); // 延时500ms
if (ct511.buff_flag != 1)
{
return 0; // 网络状态获取失败
}
ct511.buff_flag = 0;
debug_print("\n ------> recv: %s \n", ct511.BUFF);
parseCEREG((const char *)ct511.BUFF, &ct511.is_connected);
if (ct511.is_connected == 1)
{
debug_print("\r\n网络注册成功\r\n");
}
else
{
debug_print("\r\n网络注册失败\r\n");
return 0;
}
/* 初始化成功 */
return 1;
}
else
{
return 0;
}
}
下面是我的串口debug信息
到此模块初始化结束