QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之03【EC20模组基础串口指令说明】

  • 一、准备工作
  • 二、硬件环境的搭建
  • 三、基础AT指令的说明和测试
  • STM32F103学习笔记(6)——4G模块EC200S使用
    • TCP/IP AT命令拨号流程
    • 移植文件
    • 使用方法

原文链接:https://blog.csdn.net/praguejing/article/details/115794525

本系列博文将系统性讲解物联网模组系列的实际使用和调试指南,以移远4G模组EC20为例(其他厂家模组的调试方法大同小异),加快嵌入式软、硬件工程师对物联网模组调试和使用的上手速度。

一、准备工作

1、软件:串口调试助手(推荐官方的QCOM,可以讲命令保存为脚本,方便后续多次的调用)

2、硬件:EC20硬件套件、USB转串口线

3、文档:《Quectel_EC20_R2.1_AT_Commands_Manual》

二、硬件环境的搭建

1、模组正常开机,如果硬件有STATUS电路,STATUS电路的LED指示灯会常亮,指示模组开机成功,同样也可以使用万用表测量模组VDD_EXT引脚有稳定1.8V电压;

2、USB转串口线连接到电脑USB,另外一端连接到EC20硬件的主串口部分(再次注意串口电平的匹配问题);

3、打开官方的串口调试助手QCOM,根据自己的电脑不同,串口号会有不同,可以在电脑的设备管理器中观察USB转串口线插入电脑的前后,设备管理器中端口下面COM口的变化判断自己的COM号;

三、基础AT指令的说明和测试

1、打开官方的AT指令手册《Quectel_EC20_R2.1_AT_Commands_Manual》,因为EC20模组的功能十分强大,下面将以个人认为需要熟练掌握的AT命令做重点介绍,打开手册中第二章的AT指令如下所示,红色框框中个人认为是比较重要的部分:

当我们连接好EC20的硬件环境并且模块开机,我们首先会以AT这个指令为首要指令,判断模组是否能够正常响应命令,如果能够正常响应说明模块的串口通讯正常,可以进一步的调试工作;

需要特别注意:当PWRKEY引脚拉低进行开机时,注意手册中给出的串口有效时间(大于等于12s之后);在模块的串口没有初始化完成前发送AT指令模块是不响应的。

AT指令发送示例如下:

①:左下部分红色框框中的Show Time请选择性勾选;右上角红色框框中的白色框必须勾选,因为AT指令是以结尾,如果不勾选,模组会认为没有收到回车的字符判断命令还没有发送完毕,造成命令发送失败。

②:棕色框框中的部分是发送了什么命令?模组返回OK的指令?大家可以先猜测一下

答案:首先发送了AT,而后又发送了ATE

问题是模组出厂时没有打开回显功能,所以造成了不清楚发送了什么命令给模组;当调试较少的指令时还可以记住当下都发送了哪些指令,但是当调试的逻辑越来越复杂,AT指令越来越多,发送的指令根本记不住,所以回显的打开很重要。详细解释下:第一条指令是发送的AT,用来判断模组的通讯是否正常,如上图所示模组返回OK;此时发现模组虽然返回了OK,但是模组的回显功能并没有打开,所以发送了打开回显的AT指令ATE,模组返回OK,提示回显打开成功。所以在下面蓝色框框中的所有AT指令都有回显,打开回显后的调试阅读质量瞬间爆棚有木有。

③:ATI指令:此指令可以返回模组的生产厂家,模组的型号和模组的内核固件版本;之所以重要是因为有时候我们需要知道当前模组的固件版本,特别是当模组出现一些未知的Bug,需要提交模组的log给模组的原厂进行协助分析问题的时候。总之一句话:能救命!

④:AT+CGSN:此命令是返回模组的IMEI,众所周知IMEI号码是全球唯一的号码,可以作为设备的唯一识别码,有很多的模块应用厂家也都是这么做的,关于IMEI号码的组成含义大家有兴趣可以自行百度;至于是否重要就看你是否用到了设备唯一识别码了。

⑤:AT+CFUN?:注意输入命令的时候问号要在英文键盘下进行输入,中文下的问号输入后,发送命令给模组会造成模组返回ERROR的结果;此命令是确认模组当前所处的功能级别;不同的级别代表着不同的功能;注意发送此命令时模组必须返回+CFUN:1;否则需要手动设置写命令AT+CFUN=1,模组返回OK后再次进行查询确认CFUN是否为1。

下面以AT+CFUN指令为例详细说明AT指令的操作含义:

从上图可以看出AT指令大概分为三种命令状态:其一为测试命令,返回的结果为该命令都支持哪些参数设置,各个参数的含义在文档中会进行明确的解释和说明;其二是读命令,返回结果为当前模组所处的状态;其三为写命令,设置参数给模组,使模组达到自己预期的状态,返回结果可以判断命令设置是否成功。

关于AT+CMEE=1命令: 此命令是操作模组遇到ERROR时,返回错误的代号;例如上图中+CME ERROR:;模组默认是仅仅返回ERROR,设置为 AT+CMEE=1 后可以根据模组返回的err代码进行辅助判断问题大致出现在什么地方;此命令在后面章节会有更加详细的说明。

以上就是针对移远4G通讯CAT4模组EC20关于基础串口指令的操作的介绍,希望大家能够对模组AT命令调试方面有一些更加深刻的认识,下一节会针对模组的串口调试的驻网部分做详细介绍,请拭目以待。

STM32F103学习笔记(6)——4G模块EC200S使用

https://blog.csdn.net/qq_36347513/article/details/108853788?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164465013816780271933309%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=164465013816780271933309&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-1-108853788.pc_search_result_positive&utm_term=ec200+stm32&spm=1018.2226.3001.4187

TCP/IP AT命令拨号流程

移植文件

board_ec200s.c

/********************************************************************** INCLUDES*/
#include "stdlib.h"
#include "string.h"
#include "stm32f10x.h"
#include "FreeRTOS.h"
#include "task.h" #include "board_usart.h"
#include "board_ec200s.h" uint8_t sendCmd(char *pCmd, char *pRes, uint32_t timeOut, uint8_t sendNum);
void clearBuffer(void);
void reset(void);/********************************************************************** GLOBAL VARIABLES*/
uint8_t g_usart2RecvFinish = 0;                                                 // 串口2接收标志串口接收完成标志
char g_ec200sBuf[1024] = {0};                                                   // 接收缓存
uint32_t g_ec200sCnt = 0;                                                       // 接收计数    /********************************************************************** LOCAL VARIABLES*/
static uint8_t s_isSendFail = 0;                               /********************************************************************** PUBLIC FUNCTIONS*/
/**@brief 初始化@param 无@return 1 - 成功;0 - 失败
*/
uint8_t EC200S_Init(void)
{       printf("EC200S_Init\r\n");uint8_t result = 0;uint8_t step = 0;switch(step){case 0:if(sendCmd("AT\r\n","OK", 10, 5))                                   // 测试AT指令功能是否正常{step++;}else{printf("Err:AT\r\n");reset();break;} case 1:if(sendCmd("AT+CPIN?\r\n","+CPIN: READY", 20, 2))                   // 查询SIM卡是否正常,返回ready则表示SIM卡正常{step++;}else{printf("Err:AT+CPIN?\r\n");                                     // 20秒内,无法识别SIM状态,重启模块reset();break;}case 2:if(sendCmd("AT+CREG?\r\n","+CREG: 0,1", 90, 2))                     // 查询模组是否注册上GSM网络{step++;                                     }else{printf("Err:AT+CREG?\r\n");                                     // 90秒内,没有注册上CS业务,重启模块 reset();break;}case 3:if(sendCmd("AT+CGREG?\r\n","+CGREG: 0,1", 60, 2))                   // 查询模组是否注册上GPRS网络{step++;                                                 }else{printf("Err:AT+CGREG?\r\n");                                    // 60秒内,没有注册上PS业务reset();        break;}case 4:if(sendCmd("AT+QICSGP=1,1,\"CMNET\",\"\",\"\",1\r\n", "OK", 40, 3)) // 查询模组是否注册上GPRS网络{result = EC200S_NetConfig();                          }else{printf("Err:AT+QICSGP=1,1\r\n");                                // 如果3次都没停止成功或超过40秒没有回应,则重启模块reset();break;}}return result;
}/**@brief 网络配置@param 无@return 无
*/
void EC200S_GpioConfig(void)
{GPIO_InitTypeDef gpioInitStructure;        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);                       // 使能GPIOgpioInitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_1;                         // 选择要初始化的GPIOB引脚PB1,PB8gpioInitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                             // 设置引脚工作模式为通用推挽输出        gpioInitStructure.GPIO_Speed = GPIO_Speed_50MHz;                            // 设置引脚输出最大速率为50MHzGPIO_Init(GPIOB, &gpioInitStructure);
}/**@brief 网络配置@param 无@return 1 - 成功;0 - 失败
*/
uint8_t EC200S_NetConfig(void)
{      uint8_t result = 0;if(sendCmd("AT+QIDEACT=1\r\n", "OK", 40, 1))                                // 在激活GPRS场景之前先关闭GPRS场景,确保连接正确{if(sendCmd("AT+QIACT=1\r\n", "OK", 150, 1))                              // 激活移动场景{EC200S_Connect();} else                                                                 // 等待150秒后,没有响应重启模块{printf("Err:AT+QIACT=1\r\n");                                       // 重启模块reset();}}      else                                                                      // 等待40秒后,没有响应重启模块{printf("Err:AT+QIDEACT=1\r\n");                                         // 重启模块reset();}
}/**@brief 连接TCP服务器@param 无@return 无
*/
void EC200S_Connect(void)
{if(sendCmd("AT+QIOPEN=1,0,\"TCP\",\"180.97.81.180\",53540,0,1\r\n", "+QIOPEN:", 150, 5))    {printf("Connect Success\r\n");}      else{printf("Err:AT+QIOPEN=1,0\r\n");}
}/**@brief 发送数据到TCP服务器@param pString -[in] 发送数据@return 无
*/
void EC200S_Send(char *pString)
{if(!s_isSendFail){if(sendCmd("AT+QISEND=0\r\n", ">", 60, 1)) {if(sendCmd("AT+QISEND=0,0\r\n", "OK", 5, 24))                   // 2分钟后(每5秒查询一次,共24次){/* 发送数据成功,对方收到数据 */}else{printf("Err:AT+QISEND=0\r\n");                                      s_isSendFail = 1;if(sendCmd("AT+QICLOSE=0\r\n", "OK", 10, 1))                // TCP连接出现异常,关闭TCP连接{printf("AT+QICLOSE\r\n");EC200S_Connect();}else{reset();                                                // 等待10秒,没有响应重启模块} }}else{reset();                                                        // 等待60秒,没有响应重启模块}}else{reset();                                                            // 等待60秒,没有响应重启模块      }
}/**@brief 从TCP服务器接收数据@param pRecvDataBuf -[out] 接收数据@return 接收数据长度
*/
uint32_t EC200S_Receive(char *pRecvDataBuf)
{uint32_t recvDataLen = 0;if(g_isUsart2RecvFinish)                                                    // 如果串口接收完成{if(strstr((const char *)g_ec200sBuf, "+QIURC: \"recv\",0,") != NULL)    // 如果检索到关键词{memcpy(pRecvDataBuf, g_ec200sBuf, g_ec200sCnt);recvDataLen = g_ec200sCnt;}clearBuffer();} return recvDataLen;
}/********************************************************************** LOCAL FUNCTIONS*/
/**@brief 发送AT命令@param pCmd -[in] 命令字符串@param pRes -[in] 需要检测的返回命令字符串@param timeOut -[in] 等待时间@param sendNum -[in] 命令发送次数@return 1 - 成功;0 - 失败
*/
uint8_t sendCmd(char *pCmd, char *pRes, uint32_t timeOut, uint8_t sendNum)
{uint8_t i = 0;uint32_t time;clearBuffer();                                                              // 清空缓存   for(i = 0; i < sendNum; i++){time = timeOut * 10;USART_SendString(USART2, pCmd);while(time--){if(g_usart2RecvFinish)                                              // 如果串口接收完成{if(strstr((const char *)g_ec200sBuf, pRes) != NULL)             // 如果检索到关键词{printf("%s", g_ec200sBuf);return 1;}}   vTaskDelay(100);                                                   // 等待100毫秒}clearBuffer();}return 0;
}/**@brief 清空缓存@param 无@return 无
*/
void clearBuffer(void)
{memset(g_ec200sBuf, 0, sizeof(g_ec200sBuf));g_ec200sCnt = 0;g_usart2RecvFinish = 0;
}/**@brief 重启模块@param 无@return 无
*/
void reset(void)
{printf("reset\n");g_isEc200sInit = 0;s_isSendFail = 0;GPIO_ResetBits(GPIOB, GPIO_Pin_8);vTaskDelay(2000);GPIO_SetBits(GPIOB, GPIO_Pin_8);
}/****************************************************END OF FILE****************************************************/

board_ec200s.h

#ifndef _BOARD_EC200S_H_
#define _BOARD_EC200S_H_/********************************************************************** INCLUDES*/
#include "stm32f10x.h"/********************************************************************** GLOBAL VARIABLES*/
extern uint8_t g_usart2RecvFinish;      // 串口2接收标志串口接收完成标志
extern char g_ec200sBuf[1024];          // 接收缓存
extern uint32_t g_ec200sCnt;            // 接收计数/********************************************************************** API FUNCTIONS*/
uint8_t EC200S_Init(void);
void EC200S_GpioConfig(void);
uint8_t EC200S_NetConfig(void);
void EC200S_Connect(void);
void EC200S_Send(char *pString);
uint32_t EC200S_Receive(char *pRecvDataBuf);#endif /* _BOARD_EC200S_H_ */

使用方法

char recvDataBuf[MAX_RECV_BUF_SIZE] = {0};
vTaskDelay(3000);
EC200S_Init();
while(1)                                                            // 任务都是一个无限循环,不能返回
{EC200S_Send("TES");vTaskDelay(10000);  char recvDataBuf[256] = {0};int recvDataLen = EC200S_Receive(recvDataBuf);
}
/**@brief 串口2收发中断@param 无@return 无
*/
void USART2_IRQHandler(void)
{if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)                           // 接收中断{g_usart2RecvFinish = 1;                                                   // 串口2接收标志if(g_ec200sCnt >= sizeof(g_ec200sBuf)){g_ec200sCnt = 0;                                                        // 防止串口被刷爆}g_ec200sBuf[g_ec200sCnt++] = USART2->DR;USART_ClearFlag(USART2, USART_FLAG_RXNE);}
}

QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之03【EC20模组基础串口指令说明】相关推荐

  1. QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之04【EC20模组SIM卡和驻网模组指令说明】

    QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之04[EC20模组SIM卡和驻网模组指令说明] 一.准备工作 二.硬件环境的搭建 三.基础AT指令的说明和测试 关于SIM ...

  2. QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之05【EC20模组TCP/IP模块AT指令说明】

    QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之05[EC20模组TCP/IP模块AT指令说明] Socket长连接 一.准备工作 二.针对TCP/IP协议 关于TCP/ ...

  3. QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之02【EC20模组硬件供电和开关机复位操作】

    QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之02[EC20模组硬件供电和开关机复位操作] 一.模组硬件知识 1.背景知识:网络制式 2.模组的供电 3.模组的开机 4 ...

  4. QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之01物联网模组简介

    本系列博文将系统性讲解物联网模组系列的实际使用和调试指南,以移远4G模组EC20为例(其他厂家模组的调试方法大同小异),加快嵌入式软硬件工程师对物联网模组调试和使用的上手速度,让你们的项目进度尽可能快 ...

  5. QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之02EC20模组硬件供电和开关机复位操作

    本系列博文将系统性讲解物联网模组系列的实际使用和调试指南,以移远4G模组EC20为例(其他厂家模组的调试方法大同小异),加快嵌入式软.硬件工程师对物联网模组调试和使用的上手速度. 一.模组硬件知识 1 ...

  6. QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之03EC20模组基础串口指令说明

    本系列博文将系统性讲解物联网模组系列的实际使用和调试指南,以移远4G模组EC20为例(其他厂家模组的调试方法大同小异),加快嵌入式软.硬件工程师对物联网模组调试和使用的上手速度. 一.准备工作 1.软 ...

  7. QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之【05EC20模组TCP/IP模块AT指令说明】

    本系列博文将系统性讲解物联网模组系列的实际使用和调试指南,以移远4G模组EC20为例(其他厂家模组的调试方法大同小异),加快嵌入式软.硬件工程师对物联网模组调试和使用的上手速度. 一.准备工作 1.软 ...

  8. QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之04EC20模组SIM卡和驻网模组指令说明

    本系列博文将系统性讲解物联网模组系列的实际使用和调试指南,以移远4G模组EC20为例(其他厂家模组的调试方法大同小异),加快嵌入式软.硬件工程师对物联网模组调试和使用的上手速度. 一.准备工作 1.软 ...

  9. 华为gsm模块_出货量全球第一,华为阿里腾讯都是其客户,上海移远通信牛在哪?...

    近些年来,我们明显感受到了科技进步带来的便捷,微信支付.支付宝付款早已经成为绝大多数人的支付方式:交水费.电费等再也不用去缴费大厅排队,手机就能一键实现:出门也不怕迷路了,滴滴出行.手机地图等让你想去 ...

最新文章

  1. 26岁想转嵌入式软件开发来得及吗?参加嵌入式培训好不好?
  2. 可通过http获取远端服务信息_微服务基础——厉害了!API网关
  3. 机器学习第一篇:开篇
  4. spring mail 发送邮件
  5. 切记!这样洗头最伤身
  6. 在Tomcat 与weblogic 中的 日志(log4j) 配置系列一
  7. 如何使用sp_send_dbmail存储过程将SQL查询结果通过电子邮件发送到智能手机
  8. My blog in AI ---神经网络,神经元(neural network,nervecell)
  9. vba把图片转成二进制_70多岁日本老人用Excel画画,我用VBA将图片转成标注图
  10. 双链表(线性表的链式存储)---C语言版
  11. 凸优化第八章几何问题 8.6 分类
  12. 上位机使用C++通过ADS协议与倍福PLC通信例程-通过变量名方式读写浮点数
  13. 【Love2d从青铜到王者】第十四篇:Love2d之分享你的游戏(Distributing your game)
  14. 国内有哪些不错的CV(计算机视觉)团队
  15. 2022-2027年中国稻壳提纯硅产品市场竞争态势及行业投资前景预测报告
  16. nodemcu(esp8266)u8g2 oled显示汉字获取网络时间
  17. ORACLE数据库报错ORA-00910: specified length too long for its datatype
  18. android 按钮带图标 阴影_Android Material Design系列之FloatingActionButton和Snackbar
  19. 使用Docker提交代码参加天池比赛流程
  20. linux下s3c2440开发板,SAMSUNG S3C2440 ARM LINUX 开发板 上手初体验 --开发环境搭建

热门文章

  1. 愤怒的2011幸福的生活
  2. Unskilled in English is looked down on by people (composition)
  3. Ubuntu下Firefox无法打开localhost:5560/isqlplus解决办法
  4. MindSpore报错ValueError:For xx,the x shape:xx must be equal to xxx
  5. 南京大学网络教育计算机第二次作业,南京大学网络学院计算机基础第二次作业...
  6. 假如我来架构12306网站
  7. 1.Cocos跑酷游戏——List工具篇
  8. html项目的致谢词,毕业论文致谢词范文200字(精选10篇)
  9. Android 7.0拍照/相册/截取图片FileProvider使用
  10. 炒作房地产对个人三观之扭曲