一、簡介
EC200S-CN 是移遠通信最近推出的 LTE Cat 1 無線通信模塊,支持最大下行速率 10Mbps 和最大上行速率 5Mbps,具有超高的性價比;同時在封裝上兼容移遠通信多網(wǎng)絡(luò)制式 LTE Standard EC2x(EC25、EC21、EC20 R2.0、EC20 R2.1)和 EC200T/EG25-G/EG21-G 模塊以及 UMTS/HSPA+ UC20/UC200T 模塊,實現(xiàn)了 3G 網(wǎng)絡(luò)與 4G 網(wǎng)絡(luò)之間的無縫切換。EC200S-CN 還支持標(biāo)準(zhǔn)的 Mini PCIe 封裝,以滿足不同行業(yè)產(chǎn)品應(yīng)用需求。
Quectel EC2x 模塊具有嵌入式 TCP/IP堆棧,使主機可以通過 AT 命令直接上網(wǎng)??梢詫崿F(xiàn)TCP客戶端、UDP客戶端、TCP服務(wù)器和UDP服務(wù)器。
二、AT指令
2.1 AT
測試AT指令功能是否正常,等待模塊返回 OK。
AT
OK
2.2 AT + CPIN?
查詢 SIM 卡狀態(tài),返回 READY 則表示SIM卡正常,如果 20 秒后還無法識別 SIM 卡,重新啟動模塊。
AT+CPIN?
+CPIN: READY
OK
2.3 AT + CREG?
查詢模組是否注冊上GSM網(wǎng)絡(luò),如果 90秒后未能在 CS 上注冊域名服務(wù),重新啟動模塊。
如果返回 1 或 5 ,代表 CS 服務(wù)注冊成功。
+CREG:0,1 表示已注冊上本地網(wǎng),+CREG:0,5表示注冊上漫游網(wǎng)。
AT+CREG?
+CREG: 0,1
OK
2.4 AT + CGREG?
查詢模組是否注冊上GPRS網(wǎng)絡(luò),+CGREG:0,1 表示已注冊上本地網(wǎng),+CGREG:0,5表示注冊上漫游網(wǎng)。
AT+CGREG?
+CGREG: 0,1
OK
2.5 AT + QICSGP=1,1,“CMNET”
該命令可用于配置<APN>,<username>,<password>等TCP / IP上下文參數(shù)。QoS設(shè)置可以由AT + CGQMIN,AT + CGEQMIN,AT + CGQREQ和AT + CGEQREQ配置 。
- AT+QICSGP=?:查詢命令參數(shù)。
- AT+QICSGP=<contextID>:查詢 contextID的配置信息。
- AT+QICSGP=<contextID>[,<context_type>,<APN>[,<username>,<password>)[,<authentication>]]]:配置 contextID信息。
- <contextID>:整數(shù)類型。上下文ID。范圍是1-16。
- <context_type>:整數(shù)類型。協(xié)議類型。1(IPV4)、2(IPV4V6)。
- <APN>:字符串類型。接入點名稱。移動CMNET,聯(lián)通UNINET
- <username>:字符串類型。用戶名。
- <password>:字符串類型。密碼。
- <authentication>:整數(shù)類型。身份驗證方法。0(沒有)、1(PAP)、2(CHAP)、3(PAP或CHAP)。
- 返回信息:OK 或 ERROR。
AT+QICSGP=1,1,\"CMNET\",\"\",\"\",1
OK
2.6 AT + QIDEACT=1
在激活GPRS場景之前先關(guān)閉GPRS場景,確保連接正確
AT+QIDEACT=1
OK
2.7 AT + QIACT=1
激活移動場景
AT+QIACT=1
OK
2.8 AT+QIOPEN
該命令用于打開套接字服務(wù)。
- AT+QIOPEN=?:查詢命令參數(shù)。
- AT+QIOPEN=<contextID>,<connectID>,<service_type>,<IP_address>/<domain_name>,<remote_port>[,<local_po CONNECTrt>[,<access_mode>]] :打開 Socket 服務(wù)。
- <contextID> :整數(shù)類型。上下文ID。范圍是1-16。
- <connectID> :整數(shù)類型。套接字服務(wù)索引。范圍是0-11。
- <SERVICE_TYPE>:字符串類型。套接字服務(wù)類型。
- “ TCP ” :作為客戶端啟動TCP連接
- “ UDP ”:作為客戶端啟動UDP連接
- “TCP LISTENER” :啟動TCP服務(wù)器以偵聽TCP連接
- “UDP SERVICE” :啟動UDP服務(wù)
- <IP_address>:字符串類型。
- 如果<service_type>是TCP或UDP ,則表示遠程服務(wù)器的IP地址,例如 “220.180.239.212”。
- 如果<service_type>是TCP LISTENER或UDP SERVICE 地址,請輸入“127.0.0.1”。
- <domain_name>:字符串類型。遠程服務(wù)器的域名地址。
- <remote_port> :遠程服務(wù)器的端口,僅在<service_type>為“TCP”或“UDP”時有效。范圍是0-65535。
- <LOCAL_PORT> :本地端口。范圍是0-65535。
- 如果<service_type>是“TCP LISTENER”或“UDP SERVICE”,則此參數(shù)必須指定。
- 如果<service_type>是“TCP”或“UDP”。如果<local_port>為0,那么本地端口將是自動分配。否則,將按指定分配本地端口。
- <access_mode> :整數(shù)類型。套接字服務(wù)的數(shù)據(jù)訪問模式。
- 0: 緩沖區(qū)訪問模式
- 1:直推模式
- 2:透明訪問模式
- <err>:整數(shù)類型。操作的錯誤代碼。請參閱第4章。
AT+QIOPEN=1,0,\"TCP\",\"180.97.81.180\",53540,0,1
OK
+QIOPEN: 0,0
Buffer模式,Push模式,透傳模式。通過參數(shù)<access_mode>進行配置。
2.9 AT + QISEND
如果指定套接字服務(wù)的<access_mode>是緩沖區(qū)訪問模式或直接推送模式,則數(shù)據(jù)可以是通過AT + QISEND發(fā)送。如果數(shù)據(jù)成功發(fā)送到模塊,將返回“ SEND OK ” 。否則它將返回“ SEND FAIL ” 或“ ERROR ” ?!?SEND FAIL ” 表示發(fā)送緩沖區(qū)已滿客戶可以嘗試重新發(fā)送數(shù)據(jù)?!癊RROR”表示在發(fā)送過程中遇到錯誤 數(shù)據(jù)??蛻魬?yīng)該延遲一段時間來發(fā)送數(shù)據(jù)。最大數(shù)據(jù)長度為1460字?!癝END OK”并不意味著數(shù)據(jù)已成功發(fā)送到服務(wù)器。客戶可以查詢數(shù)據(jù)是否通過AT + QISEND = <connectID>,0命令到達服務(wù)器。透傳模式下不需要AT指令發(fā)送數(shù)據(jù)文章來源:http://www.zghlxwxcb.cn/news/detail-681282.html
三、TCP/IP AT命令撥號流程
四、復(fù)位模塊
RESET_N 引腳可用于使模塊復(fù)位。拉低 RESET_N 引腳至少 300 ms 后釋放可使模塊復(fù)位。RESET_N
信號對干擾比較敏感,因此建議在模塊接口板上的走線應(yīng)盡量的短,且需包地處理。文章來源地址http://www.zghlxwxcb.cn/news/detail-681282.html
五、移植文件
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接收標(biāo)志串口接收完成標(biāo)志
char g_ec200sBuf[1024] = {0}; // 接收緩存
uint32_t g_ec200sCnt = 0; // 接收計數(shù)
/*********************************************************************
* 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秒內(nèi),無法識別SIM狀態(tài),重啟模塊
reset();
break;
}
case 2:
if(sendCmd("AT+CREG?\r\n","+CREG: 0,1", 90, 2)) // 查詢模組是否注冊上GSM網(wǎng)絡(luò)
{
step++;
}
else
{
printf("Err:AT+CREG?\r\n"); // 90秒內(nèi),沒有注冊上CS業(yè)務(wù),重啟模塊
reset();
break;
}
case 3:
if(sendCmd("AT+CGREG?\r\n","+CGREG: 0,1", 60, 2)) // 查詢模組是否注冊上GPRS網(wǎng)絡(luò)
{
step++;
}
else
{
printf("Err:AT+CGREG?\r\n"); // 60秒內(nèi),沒有注冊上PS業(yè)務(wù)
reset();
break;
}
case 4:
if(sendCmd("AT+QICSGP=1,1,\"CMNET\",\"\",\"\",1\r\n", "OK", 40, 3)) // 查詢模組是否注冊上GPRS網(wǎng)絡(luò)
{
result = EC200S_NetConfig();
}
else
{
printf("Err:AT+QICSGP=1,1\r\n"); // 如果3次都沒停止成功或超過40秒沒有回應(yīng),則重啟模塊
reset();
break;
}
}
return result;
}
/**
@brief 網(wǎng)絡(luò)配置
@param 無
@return 無
*/
void EC200S_GpioConfig(void)
{
GPIO_InitTypeDef gpioInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 使能GPIO
gpioInitStructure.GPIO_Pin = GPIO_Pin_8; // 選擇要初始化的GPIOB引腳PB8
gpioInitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 設(shè)置引腳工作模式為通用推挽輸出
gpioInitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 設(shè)置引腳輸出最大速率為50MHz
GPIO_Init(GPIOB, &gpioInitStructure);
}
/**
@brief 網(wǎng)絡(luò)配置
@param 無
@return 1 - 成功;0 - 失敗
*/
uint8_t EC200S_NetConfig(void)
{
uint8_t result = 0;
if(sendCmd("AT+QIDEACT=1\r\n", "OK", 40, 1)) // 在激活GPRS場景之前先關(guān)閉GPRS場景,確保連接正確
{
if(sendCmd("AT+QIACT=1\r\n", "OK", 150, 1)) // 激活移動場景
{
EC200S_Connect();
}
else // 等待150秒后,沒有響應(yīng)重啟模塊
{
printf("Err:AT+QIACT=1\r\n"); // 重啟模塊
reset();
}
}
else // 等待40秒后,沒有響應(yīng)重啟模塊
{
printf("Err:AT+QIDEACT=1\r\n"); // 重啟模塊
reset();
}
}
/**
@brief 連接TCP服務(wù)器
@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 發(fā)送數(shù)據(jù)到TCP服務(wù)器
@param pString -[in] 發(fā)送數(shù)據(jù)
@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次)
{
/* 發(fā)送數(shù)據(jù)成功,對方收到數(shù)據(jù) */
}
else
{
printf("Err:AT+QISEND=0\r\n");
if(sendCmd("AT+QICLOSE=0\r\n", "OK", 10, 1)) // TCP連接出現(xiàn)異常,關(guān)閉TCP連接
{
printf("AT+QICLOSE\r\n");
EC200S_Connect();
}
else
{
reset(); // 等待10秒,沒有響應(yīng)重啟模塊
}
}
}
else
{
reset(); // 等待60秒,沒有響應(yīng)重啟模塊
}
}
/**
@brief 從TCP服務(wù)器接收數(shù)據(jù)
@param pRecvDataBuf -[out] 接收數(shù)據(jù)
@return 接收數(shù)據(jù)長度
*/
uint32_t EC200S_Receive(char *pRecvDataBuf)
{
uint32_t recvDataLen = 0;
if(g_isUsart2RecvFinish) // 如果串口接收完成
{
if(strstr((const char *)g_ec200sBuf, "+QIURC: \"recv\",0,") != NULL) // 如果檢索到關(guān)鍵詞
{
memcpy(pRecvDataBuf, g_ec200sBuf, g_ec200sCnt);
recvDataLen = g_ec200sCnt;
}
clearBuffer();
}
return recvDataLen;
}
/*********************************************************************
* LOCAL FUNCTIONS
*/
/**
@brief 發(fā)送AT命令
@param pCmd -[in] 命令字符串
@param pRes -[in] 需要檢測的返回命令字符串
@param timeOut -[in] 等待時間
@param sendNum -[in] 命令發(fā)送次數(shù)
@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) // 如果檢索到關(guān)鍵詞
{
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接收標(biāo)志串口接收完成標(biāo)志
extern char g_ec200sBuf[1024]; // 接收緩存
extern uint32_t g_ec200sCnt; // 接收計數(shù)
/*********************************************************************
* 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) // 任務(wù)都是一個無限循環(huán),不能返回
{
EC200S_Send("TEST");
vTaskDelay(10000);
char recvDataBuf[256] = {0};
int recvDataLen = EC200S_Receive(recvDataBuf);
}
/**
@brief 串口2收發(fā)中斷
@param 無
@return 無
*/
void USART2_IRQHandler(void)
{
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) // 接收中斷
{
g_usart2RecvFinish = 1; // 串口2接收標(biāo)志
if(g_ec200sCnt >= sizeof(g_ec200sBuf))
{
g_ec200sCnt = 0; // 防止串口被刷爆
}
g_ec200sBuf[g_ec200sCnt++] = USART2->DR;
USART_ClearFlag(USART2, USART_FLAG_RXNE);
}
}
到了這里,關(guān)于STM32F103 4G Cat.1模塊EC200S使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!