STM32F103 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服务器。

二、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”

该命令可用于配置<APN>,<username>,<password>等TCP / IP上下文参数。QoS设置可以由AT + CGQMIN,AT + CGEQMIN,AT + CGQREQ和AT + CGEQREQ配置 。

  • AT+QICSGP=?:查询命令参数。
  • AT+QICSGP=<contextID>:查询 contextID的配置信息。
  • AT+QICSGP=<contextID>[,<context_type>,<APN>[,<username>,<password>)[,<authentication>]]]:配置 contextID信息。
    • <contextID>:整数类型。上下文ID。范围是1-16。
    • <context_type>:整数类型。协议类型。1(IPV4)、2(IPV4V6)。
    • <APN>:字符串类型。接入点名称。移动CMNET,联通UNINET
    • <username>:字符串类型。用户名。
    • <password>:字符串类型。密码。
    • <authentication>:整数类型。身份验证方法。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=<contextID>,<connectID>,<service_type>,<IP_address>/<domain_name>,<remote_port>[,<local_po CONNECTrt>[,<access_mode>]] :打开 Socket 服务。
    • <contextID> :整数类型。上下文ID。范围是1-16。
    • <connectID> :整数类型。套接字服务索引。范围是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:透明访问模式
    • <err>:整数类型。操作的错误代码。请参阅第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 = <connectID>,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);}                                                            
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/54307.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用大白话来讲讲多线程的知识架构

感觉多线程的知识又多又杂&#xff0c;自从接触java&#xff0c;就在一遍一遍捋脉络和深入学习。现在将这次的学习成果展示如下。 什么是多线程&#xff1f; 操作系统运行一个程序&#xff0c;就是一个线程。同时运行多个程序&#xff0c;就是多线程。即在同一时间&#xff0…

基于FPGA的Lorenz混沌系统verilog开发,含testbench和matlab辅助测试程序

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 将vivado的仿真结果导入到matlab显示三维混沌效果&#xff1a; 2.算法运行软件版本 vivado2019.2 matlab2022a 3.部分核心程序 testbench如下所…

npm常用命令 + 前端常用的包管理工具 以及 npm淘宝镜像配置等

npm常用命令 前端常用的包管理工具 以及 npm淘宝镜像配置等 1. 前言1.1 NodeJs的下载安装1.2 windows上1.3 常用包管理工具 2. npm2.1 npm 的安装2.2 npm初始化包2.3 npm 安装、卸载包2.3.1 非全局安装2.3.1.1 单个包的安装2.3.1.1.1 默认版本安装2.3.1.1.2 指定版本安装 2.3.…

解除用户账户控制提醒

解决用户账户控制提醒 1. 前言2. 解决用户账户控制提醒2.1 控制面板2.2 注册表2.3 UAC服务 结束语 1. 前言 当我们使用电脑时&#xff0c;有时进行安装应用或者打开应用时&#xff0c;总会弹出一个提示框&#xff0c;要选择点击是否允许程序运行&#xff1b; 系统经常弹出用户…

【Git】测试持续集成——Git+Gitee+PyCharm

文章目录 概述一、使用Gitee1. 注册账号2. 绑定邮箱3. 新建仓库4. 查看项目地址 二、安装配置Git1. 下载安装包2. 校验是否安装成功。3. 配置Git4. Git命令5. Git实操 三、PyCharmGit1. 配置Git2. Clone项目3. 提交文件到服务器4. 从服务器拉取文件 概述 持续集成&#xff08;…

【javaweb】学习日记Day4 - Maven 依赖管理 Web入门

目录 一、Maven入门 - 管理和构建java项目的工具 1、IDEA如何构建Maven项目 2、Maven 坐标 &#xff08;1&#xff09;定义 &#xff08;2&#xff09;主要组成 3、IDEA如何导入和删除项目 二、Maven - 依赖管理 1、依赖配置 2、依赖传递 &#xff08;1&#xff09;查…

Docker容器学习:Dockerfile制作Web应用系统nginx镜像

目录 编写Dockerfile 1.文件内容需求&#xff1a; 2.编写Dockerfile&#xff1a; 3.开始构建镜像 4.现在我们运行一个容器&#xff0c;查看我们的网页是否可访问 推送镜像到私有仓库 1.把要上传的镜像打上合适的标签 2.登录harbor仓库 3.上传镜像 编写Dockerfile 1.文…

2000-2021年地级市产业升级、产业结构高级化面板数据

2000-2021年地级市产业升级、产业结构高级化面板数据 1、时间&#xff1a;2000-2021年 2、范围&#xff1a;地级市 3、指标&#xff1a;年份、地区、行政区划代码、地区、所属省份、地区生产总值、第一产业增加值、第二产业增加值、第三产业增加值、第一产业占GDP比重、第二…

常见的时序数据库

1.概念 时序数据库全称为时间序列数据库。时间序列数据库指主要用于处理带时间标签&#xff08;按照时间的顺序变化&#xff0c;即时间序列化&#xff09;的数据&#xff0c;带时间标签的数据也称为时间序列数据。 时间序列数据主要由电力行业、化工行业、气象行业、地理信息…

十四、pikachu之XSS

文章目录 1、XSS概述2、实战2.1 反射型XSS&#xff08;get&#xff09;2.2 反射型XSS&#xff08;POST型&#xff09;2.3 存储型XSS2.4 DOM型XSS2.5 DOM型XSS-X2.6 XSS之盲打2.7 XSS之过滤2.8 XSS之htmlspecialchars2.9 XSS之href输出2.10 XSS之JS输出 1、XSS概述 Cross-Site S…

分享一种针对uni-app相对通用的抓包方案

PART1&#xff0c;前言 近年来混合开发APP逐渐成为主流的开发模式&#xff0c;与传统的开发模式相比混合开发极大的提升了开发效率&#xff0c;同时跨平台的特性也降低了开发成本&#xff0c;一直以来混合开发被诟病的性能问题随着技术的发展也得到改善。技术的发展往往是一把…

前端需要理解的跨平台知识

混合开发是指使用多种开发模开发App的一种开发模式&#xff0c;涉及到两大类技术&#xff1a;原生 Native、Web H5。原生 Native 主要指 iOS&#xff08;Objective C&#xff09;、Android&#xff08;Java&#xff09;&#xff0c;原生开发效率较低&#xff0c;开发完成需要重…

【Java集合学习1】ArrayList集合学习及集合概述分析

JavaArrayList集合学习及集合学习概述 一、Java集合概述 Java 集合&#xff0c; 也叫作容器&#xff0c;主要是由两大接口派生而来&#xff1a;一个是 Collection接口&#xff0c;主要用于存放单一元素&#xff1b;另一个是 Map 接口&#xff0c;主要用于存放键值对。对于Col…

Apache Poi 实现Excel多级联动下拉框

由于最近做的功能&#xff0c;需要将接口返回的数据列表&#xff0c;输出到excel中&#xff0c;以供后续导入&#xff0c;且网上现有的封装&#xff0c;使用起来都较为麻烦&#xff0c;故参考已有做法封装了工具类。 使用apache poi实现excel联动下拉框思路 创建隐藏单元格&a…

如何评估开源项目的活跃度和可持续性?

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

元矿山下的音视频应用

// 近年来&#xff0c;矿业的技术和管理模式随着元宇宙的火爆和自动驾驶技术的发展逐渐变化、升级&#xff0c;进而衍生出元矿山的概念&#xff0c;音视频技术也在其中成为了关键一环。LiveVideoStackCon 2023 上海站邀请了来自希迪智驾的任思亮&#xff0c;为大家分享希迪智…

基于神经网络的3D地质模型

地球科学家需要对地质环境进行最佳估计才能进行模拟或评估。 除了地质背景之外&#xff0c;建立地质模型还需要一整套数学方法&#xff0c;如贝叶斯网络、协同克里金法、支持向量机、神经网络、随机模型&#xff0c;以在钻井日志或地球物理信息确实稀缺或不确定时定义哪些可能是…

机器学习笔记之优化算法(十九)经典牛顿法的收敛性分析

机器学习笔记之优化算法——经典牛顿法的收敛性分析 引言回顾&#xff1a;算法的收敛性分析 Wolfe \text{Wolfe} Wolfe准则的收敛性分析梯度下降法在凸函数的收敛性分析梯度下降法在强凸函数的收敛性分析 经典牛顿法的收敛性分析收敛性定理介绍证明过程关于隐含条件的说明 引言…

FFmpeg5.0源码阅读——FFmpeg大体框架

摘要&#xff1a;前一段时间熟悉了下FFmpeg主流程源码实现&#xff0c;对FFmpeg的整体框架有了个大概的认识&#xff0c;因此在此做一个笔记&#xff0c;希望以比较容易理解的文字描述FFmpeg本身的结构&#xff0c;加深对FFmpeg的框架进行梳理加深理解&#xff0c;如果文章中有…

Android Mvvm设计模式的详解与实战教程

一、介绍 在开发设计模式中&#xff0c;模式经历了多次迭代&#xff0c;从MVC到MVP&#xff0c;再到如今的MVVM。发现的过程其实很简单&#xff0c;就是为了项目更好的管理。 设计模式严格来说属于软件工程的范畴&#xff0c;但是如今在各大面试中或者开发中&#xff0c;设计模…