STM32F103学习笔记(6)——4G Cat.1模块EC200S使用
一、简介
EC200S-CN 是移远通信最近推出的 LTE Cat 1 无线通信模块,支持最大下行速率 10Mbps 和最大上行速率 5Mbps,具有超高的性价比;同时在封装上兼容移远通信多网络制式 LTE Standard EC2x(EC25、EC21、EC20 R2.0、EC20 R2.1)和 EC200T/EG25-G/EG21-G 模块以及 UMTS/HSPA+ UC20/UC200T 模块,实现了 3G 网络与 4G 网络之间的无缝切换。EC200S-CN 还支持标准的 Mini PCIe 封装,以满足不同行业产品应用需求。
Quectel EC2x 模块具有嵌入式 TCP/IP堆栈,使主机可以通过 AT 命令直接上网。可以实现TCP客户端、UDP客户端、TCP服务器和UDP服务器。
ES200S资料:链接:https://pan.baidu.com/s/10PzjAjYqCM2sI1r-C6-7ww?pwd=gsux 提取码:gsux
二、AT指令
2.1 AT
测试AT指令功能是否正常,等待模块返回 OK。
ATOK
2.2 AT + CPIN?
查询 SIM 卡状态,返回 READY 则表示SIM卡正常,如果 20 秒后还无法识别 SIM 卡,重新启动模块。
AT+CPIN?+CPIN: READYOK
2.3 AT + CREG?
查询模组是否注册上GSM网络,如果 90秒后未能在 CS 上注册域名服务,重新启动模块。
如果返回 1 或 5 ,代表 CS 服务注册成功。
+CREG:0,1 表示已注册上本地网,+CREG:0,5表示注册上漫游网。
AT+CREG?+CREG: 0,1OK
2.4 AT + CGREG?
查询模组是否注册上GPRS网络,+CGREG:0,1 表示已注册上本地网,+CGREG:0,5表示注册上漫游网。
AT+CGREG?+CGREG: 0,1OK
2.5 AT + QICSGP=1,1,“CMNET”
该命令可用于配置,,等TCP / IP上下文参数。QoS设置可以由AT + CGQMIN,AT + CGEQMIN,AT + CGQREQ和AT + CGEQREQ配置 。
- AT+QICSGP=?:查询命令参数。
- AT+QICSGP=:查询 contextID的配置信息。
- AT+QICSGP=[,<context_type>,[,,)[,]]]:配置 contextID信息。
- :整数类型。上下文ID。范围是1-16。
- <context_type>:整数类型。协议类型。1(IPV4)、2(IPV4V6)。
- :字符串类型。接入点名称。移动CMNET,联通UNINET
- :字符串类型。用户名。
- :字符串类型。密码。
- :整数类型。身份验证方法。0(没有)、1(PAP)、2(CHAP)、3(PAP或CHAP)。
- 返回信息:OK 或 ERROR。
AT+QICSGP=1,1,\"CMNET\",\"\",\"\",1OK
2.6 AT + QIDEACT=1
在激活GPRS场景之前先关闭GPRS场景,确保连接正确
AT+QIDEACT=1OK
2.7 AT + QIACT=1
激活移动场景
AT+QIACT=1OK
2.8 AT+QIOPEN
该命令用于打开套接字服务。
- AT+QIOPEN=?:查询命令参数。
- AT+QIOPEN=,,<service_type>,<IP_address>/<domain_name>,<remote_port>[,<local_po CONNECTrt>[,<access_mode>]] :打开 Socket 服务。
- :整数类型。上下文ID。范围是1-16。
- :整数类型。套接字服务索引。范围是0-11。
- <SERVICE_TYPE>:字符串类型。套接字服务类型。
- “ TCP ” :作为客户端启动TCP连接
- “ UDP ”:作为客户端启动UDP连接
- “TCP LISTENER” :启动TCP服务器以侦听TCP连接
- “UDP SERVICE” :启动UDP服务
- <IP_address>:字符串类型。
- 如果<service_type>是TCP或UDP ,则表示远程服务器的IP地址,例如 “220.180.239.212”。
- 如果<service_type>是TCP LISTENER或UDP SERVICE 地址,请输入“127.0.0.1”。
- <domain_name>:字符串类型。远程服务器的域名地址。
- <remote_port> :远程服务器的端口,仅在<service_type>为“TCP”或“UDP”时有效。范围是0-65535。
- <LOCAL_PORT> :本地端口。范围是0-65535。
- 如果<service_type>是“TCP LISTENER”或“UDP SERVICE”,则此参数必须指定。
- 如果<service_type>是“TCP”或“UDP”。如果<local_port>为0,那么本地端口将是自动分配。否则,将按指定分配本地端口。
- <access_mode> :整数类型。套接字服务的数据访问模式。
- 0: 缓冲区访问模式
- 1:直推模式
- 2:透明访问模式
- :整数类型。操作的错误代码。请参阅第4章。
AT+QIOPEN=1,0,\"TCP\",\"180.97.81.180\",53540,0,1OK+QIOPEN: 0,0
Buffer模式,Push模式,透传模式。通过参数<access_mode>进行配置。
2.9 AT + QISEND
如果指定套接字服务的<access_mode>是缓冲区访问模式或直接推送模式,则数据可以是通过AT + QISEND发送。如果数据成功发送到模块,将返回“ SEND OK ” 。否则它将返回“ SEND FAIL ” 或“ ERROR ” 。“ SEND FAIL ” 表示发送缓冲区已满客户可以尝试重新发送数据。“ERROR”表示在发送过程中遇到错误 数据。客户应该延迟一段时间来发送数据。最大数据长度为1460字。“SEND OK”并不意味着数据已成功发送到服务器。客户可以查询数据是否通过AT + QISEND = ,0命令到达服务器。透传模式下不需要AT指令发送数据
三、TCP/IP AT命令拨号流程
四、复位模块
RESET_N 引脚可用于使模块复位。拉低 RESET_N 引脚至少 300 ms 后释放可使模块复位。RESET_N
信号对干扰比较敏感,因此建议在模块接口板上的走线应尽量的短,且需包地处理。
五、移植文件
5.1 board_ec200s.c
/********************************************************************** INCLUDES*/
#include "stdlib.h"
#include "string.h"
#include "stm32f10x.h"
#include "FreeRTOS.h"
#include "task.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; // 接收计数 /********************************************************************** 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; // 选择要初始化的GPIOB引脚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(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"); 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秒,没有响应重启模块}
}/**@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"); GPIO_ResetBits(GPIOB, GPIO_Pin_8);vTaskDelay(2000);GPIO_SetBits(GPIOB, GPIO_Pin_8);
}/****************************************************END OF FILE****************************************************/
4.2 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_ */
六、使用方法
EC200S_GpioConfig();
EC200S_Init();
while(1) // 任务都是一个无限循环,不能返回
{EC200S_Send("TEST");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);}
}
• 由 Leung 写于 2020 年 9 月 28 日
• 参考:移远 EC200S 模组(4G Cat.1 通信模组)AT指令测试 TCP/UDP 通信过程
移远EC20 R2.0 AT指令拨号流程
Quectel EC20 R2.1 AT指令集(TCP/部分)
STM32F103学习笔记(6)——4G Cat.1模块EC200S使用相关推荐
- STM32F103学习笔记(2)——收音机模块TEA5767使用
一.简介 TEA5767是由菲利普公司推出的一款低功耗立体声收音机接收器芯片.频率范围从76-108MHz自动数字调谐.高灵敏度,高稳定性,低噪音,收音模块.一片低功耗电调谐调频立体声收音机电路,其内 ...
- Python学习笔记:常用内建模块6 (urllib)
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- Python学习笔记:常用内建模块4:hmac
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- Python学习笔记:常用内建模块3:struct
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- STM32F103学习笔记(5)——数码管驱动TM1650使用
一.简介 TM1650 是一种带键盘扫描接口的 LED(发光二极管显示器)驱动控制专用电路.内部集成有 MCU 输入输出控制数字接口.数据锁存器.LED 驱动.键盘扫描.辉度调节等电路.TM1650 ...
- Arduino模块学习笔记(一)—GPS模块的使用
Arduino模块学习笔记(一)--GSP模块的使用 文章目录 Arduino模块学习笔记(一)--GSP模块的使用 所需组件 一.模块使用介绍 1.GPS模块(在室内时,一般获取不到位置信息) 2. ...
- 【小猫爪】AUTOSAR学习笔记03-Communication Stack之CanIf模块
[小猫爪]AUTOSAR学习笔记03-Communication Stack之CanIf模块 前言 1 CanIf简介 2 功能介绍 2.1 发送缓冲区 2.2 CAN Controller 模式控制 ...
- STM32F103学习笔记四 时钟系统
STM32F103学习笔记四 时钟系统 本文简述了自己学习时钟系统的一些框架,参照风水月 1. 单片机中时钟系统的理解 1.1 概述 时钟是单片机的脉搏,是单片机的驱动源 用任何一个外设都必须打开相应 ...
- 【小猫爪】AUTOSAR学习笔记10-Communication Stack之CanTsyn模块
[小猫爪]AUTOSAR学习笔记10-Communication Stack之CanTsyn模块 前言 1 时间同步的引入 2 时间同步的角色 3 时间同步过程 3.1 四种报文 3.2 时间同步过程 ...
最新文章
- Shell Sort 希尔排序 收藏
- MyBatis-学习笔记05【05.使用Mybatis完成CRUD】
- Redis 6.0 如何实现大幅度的性能提升?
- python字典dragonloot_Python 字典与列表使用实例
- Android之Content和activity、service、Application关系和attachBaseContext函数调用的时候
- 奇妙的 CSS shapes(CSS图形)
- iOS 两种方法实现左右滑动出现侧边菜单栏 slide view
- 修改intellij(idea)中mybatis对应的xml背景颜色
- html页面关闭执行函数,html页面调用js文件里的函数报错--方法名 is not defined处理方法...
- 互联网金融数据分析-笔记
- [导入]Asp.net 2.0 自定义控件开发[实现自动计算功能(AutoComputeControl)][示例代码下载]...
- 【通信】基于matlab Alamouti空频编码【含Matlab源码 801期】
- java类中静态变量自增_Java中静态变量(类变量)、实例变量、局部变量和成员变量...
- RedHat7安装及小红帽硬盘分区建议
- 【毕业设计论文】(软件类专业)规范写作以及查重篇
- ICCV 2021可逆的跨空间映射实现多样化的图像风格传输:Diverse Image Style Transfer via Invertible Cross-Space Mapping
- 工程师应用计算机考试题型,IE工程师考试试题
- 2019dnf刷图脚本制作教程
- Wind对接pytho总结
- js中Math.random()生成指定范围数值的随机数