文章目錄
- 一、指令匯總
- 二、串口助手單條AT指令測驗
- 三、在Stm32中的組合使用
一、指令匯總
1.先弄清楚四種AT指令的格式
AT+<cmd>= ? 測驗命令,用于向模塊詢問支持的設定專案,
AT+<cmd>? 讀取命令,用于讓模塊上報某個命令代表的設定項當前的值,
AT+<cmd>=p1 設定命令,用于向模塊設定某個專案的值
AT+<cmd> 執行命令,用于向模塊執行某個操作
2.可以用AT+CLAC查看所有支持的指令
[09:18:38.230]發→◇AT+CLAC
□
[09:18:38.242]收←◆AT+CLAC
AT+COPS
AT+CGATT
AT+NEARFCN
AT+NCSEARFCN
……………//太長了,就不復制了
//*************************************************//
具體指令:
1.ATI 回傳模塊廠商和型號等基本資訊
2.ATE<0/1> 0:指令碼不回顯 1:指令碼回顯
3.AT+CGMI 回傳制造商名字
4.AT+CGMM/AT+CGMM=? 回傳制造商模塊的型號編碼
5.AT+CGMR/AT+CGMR=? 回傳制造商模塊的版本號
6.AT+CGSN=1 ***回傳制造商模塊的IMEI***
7.AT+CEREG 用于設定模塊 網路 注冊狀態(協議方面)
8.AT+CSCON ***模塊與基站 網路 的射頻網路是否連接(檢測是否進入PSM狀態)***
9.AT+CLAC 列出所有支持的指令
10.AT+CSQ ***用來測驗信號強度(信號強度取決于:基站、位置、NB模塊天線設計匹配)***
11.AT+CGPADDR ***取核心網和基站分配給NB模塊的本次通信的臨時IP地址***
12.AT+COPS 用來設定運營商
13.AT+CGATT=<0關/1開> ***用來設定或檢測模塊是否連接上核心網***
14.AT+CGACT 用來使能或禁止PDP背景關系
15.AT+CIMI 用來獲取IMSI(國際用戶識別碼)
16.AT+CGDCONT Define a PDP Context
17.AT+CFUN ***用來設定NB模塊內部的射頻單元,與自動聯網/手動聯網有關***
18.AT+CMEE ***用來列印NB模塊錯誤資訊***
19.AT+CCLK 回傳當前時間
20.AT+CPSMS 設定PSM模式相關引數
21.AT+CEDRXS 設定eDRX模式相關引數
22.AT+CEER 用來列印NB設備端出錯的擴展資訊
23.AT+CEDRXRDP eDRX模式相關的動態引數設定
24.AT+CTZR 用來設定或獲取時區資訊
25.AT+CIPCA PDP背景關系初始化
26.AT+CGAPNRC APN速率控制
//*************************************************//
1.AT+CSMS 短信服務相關
2.AT+CNMA 與新接收訊息相關
3.AT+CSCA Service Centre Address
4.AT+CMGS NB設備主動向云平臺發送訊息
5.AT+CMGC Send SMS Command
6.AT+CSODCP Send Originating Data via the Control Plane
7.AT+CRTDCP Report Terminating Data via Control Plane
//************************************************//
1.AT+NRB ***軟體復位模塊***
2.AT+NUESTATS ***回傳UE(user equipment,用戶設備,NB模塊)的狀態資訊***
3.AT+NEARFCN 設定搜索頻率850MHZ(電信的)
4.AT+NSOCR 相當于socket函式 ,讓模塊內部創建一個socket介面
5.AT+NSOST SendTo函式 (UDP Only)
6.AT+NSOSTF 相當于帶flag的sendto函式,在UDP中進行訊息發送
7.AT+NSORF 相當于recv函式,在UDP中進行訊息接收
8.AT+NSOCL 相當于close函式,用于關閉socket
9.AT+NSONMI 指示socket收到訊息
10.AT+NPING 相當于ping命令,用來測驗當前模塊和遠端網路地址是否接通
11.AT+NBAND 用于設定當前模塊的Band,BC95-B 5
12.AT+NLOGLEVEL 設定debug log資訊的輸出level
13.AT+NCONFIG ***用于對UE進行配置***
14.AT+NATSPEED ***配置波特率9600***
15.AT+NCCID 用于獲取NB卡的唯一編碼(ICCID)
16.AT+NFWUPD 用于通過UART來升級模塊內部韌體
17.AT+NPOWERCLASS Set the Mapping for Band and Power Class
18.AT+NPSMR Power Saving Mode Status Report
19.AT+NPTWEDRXS Paging Time Window Value and eDRX Setting
20.AT+NPIN PIN Operation
21.AT+NCSEARFCN Clear Stored EARFCN
//***********************************************//
1.AT+NCDP ***用于設定CDP(電信云的IP地址)***
2.AT+QSECSWT 設定加密模式(開發中)
3.AT+QSETPSK 設定調制(開發中)
4.AT+NMGS ***用于向電信云服務器發送訊息***
5.AT+NMGR ***接收訊息Get Messages***
6.AT+NNMI ***模塊收到電信云下行的資料后會自動接收提示***
7.AT+NSMI ***模塊向電信云上行資料后提示***
8.AT+NQMGR 向模塊查詢有無收到電信云下行的資料
9.AT+NQMGS 向模塊查詢訊息有無發送成功
10.AT+NMSTATUS 查詢模塊在訊息發送階段的狀態
11.AT+QLWULDATAEX 發送連接和不連接Send CON/NON Messages
12.AT+QLWULDATASTATUS Query CON Messages Sending Status
//**********************************//
二、串口助手單條AT指令測驗
- 注意發送加回車換行,在程式里加
“\r\n”,否則模塊識別不了

- 模組需要相應指令,發送需加延時

1.驗證AT指令可用
[17:06:27.301]發→◇AT
□
[17:06:27.310]收←◆
OK
2.讀信號質量
[17:14:53.397]發→◇AT+CSQ
□
[17:14:53.409]收←◆
+CSQ:28,99
OK
3.獲取IMEI號
[17:37:41.343]發→◇AT+CGSN=1
□
[17:37:41.358]收←◆AT+CGSN=1
+CGSN:865823049053753
OK
4.模塊注冊到NB網路
[17:44:05.006]發→◇AT+CEREG=1
□
[17:44:05.023]收←◆AT+CEREG=1
OK
[17:46:31.083]發→◇AT+CEREG?
□
[17:46:31.098]收←◆AT+CEREG?
+CEREG:1,1
OK
5.查看模塊物理地址
[09:28:14.281]發→◇AT+CGPADDR
□
[09:28:14.296]收←◆AT+CGPADDR
+CGPADDR:0,10.24.31.22
OK
6.設定運營商
[09:36:26.509]發→◇AT+COPS=0
□
[09:36:26.524]收←◆AT+COPS=0
OK
[09:36:03.288]發→◇AT+COPS?
□
[09:36:03.300]收←◆AT+COPS?
+COPS:0,2,"46000"
OK
7.設定或檢測模塊是否連接上核心網
[09:42:46.151]發→◇AT+CGATT=1
□
[09:42:46.170]收←◆AT+CGATT=1
OK
[09:42:40.348]發→◇AT+CGATT=?
□
[09:42:40.363]收←◆AT+CGATT=?
+CGATT:(0,1)
OK
8.回傳當前時間
[09:48:12.326]發→◇AT+CCLK?
□
[09:48:12.339]收←◆AT+CCLK?
+CCLK:20/09/11,01:48:15+32
OK
和我電腦差了八個小時,沒找到設定時區的,在程式里加上吧……
9.軟復位模塊,時間會更新,誤差歸零,可以定時來復位,去除累積誤差
[10:07:37.746]發→◇AT+NRB
□
[10:07:37.758]收←◆REBOOTING
[10:07:38.619]收←◆Boot: Unsigned
Security B.. Verified
Protocol A..
[10:07:41.753]收←◆Verified
Apps A......
[10:07:42.685]收←◆Verified
[10:07:43.001]收←◆
REBOOT_CAUSE_APPLICATION_AT
Neul
OK
[10:07:52.599]收←◆
+QLWEVTIND:0
+QLWEVTIND:3
10.功能選項AT+CFUN<0/1>
引數0代表基本功能,1代表基本功能+附加功能,附加功能每個廠商定義不一樣,

[11:39:10.580]發→◇AT+CFUN=1
□
[11:39:10.595]收←◆AT+CFUN=1
OK
[11:39:18.994]發→◇AT+CFUN?
□
[11:39:19.008]收←◆AT+CFUN?
+CFUN:1
OK
三、在Stm32中的組合使用
1.Stm32準備作業
(1)初始化一個串口,并打開接收中斷
void MX_USART2_UART_Init(void)
{
huart2.Instance = USART2;
huart2.Init.BaudRate = 9600;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart2) != HAL_OK)
{
Error_Handler();
}
Usart2RecIT();
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart->Instance == USART2) {//BC35-G NB-iot通信模塊
HAL_UART_Receive_IT(&huart2, &uart1Data, 1);
uart2WriteByte(uart1Data);
uart2DataFlg = 1;
//HAL_UART_Transmit(&huart2,&uart2Data,1,0xFFFF);
}
}
(2)將當前發送的指令保存在堆疊中
typedef struct
{
uint8_t* ATSendbuf;
uint8_t* ATRecvbuf;
int16_t ATSendlen;
int16_t ATRecvlen;
int8_t* ATack;
int8_t* ATNack;
}NBIOT_ATCmdTypeDef;
static void NBIOT_ATCmd_SetCmdStack(NBIOT_ATCmdTypeDef* ATCmdStack, int8_t* Sendbuf, uint16_t Sendlen, int8_t* ATack, int8_t* ATNack)
{
ATCmdStack->ATSendbuf = (uint8_t *)Sendbuf;
ATCmdStack->ATSendlen = Sendlen;
ATCmdStack->ATack = ATack;
ATCmdStack->ATNack = ATNack;
}
typedef struct
{
uint8_t sdata[MaxUartBC95];
uint16_t slen;
}sensordataType_Def;
sensordataType_Def nbdata;
sensordataType_Def rlynbdata;
(3)發送AT指令
void NB_SEND(uint8_t *buf,uint16_t len)
{
HAL_UART_Transmit_IT (&huart2,buf,len);
}
int8_t NBIOT_ATCMD_SEND(NBIOT_ATCmdTypeDef* ATCmdStack, int8_t* Sendbuf, uint16_t Sendlen, int8_t* ATack, int8_t* ATNack,int32_t tm)
{
NBIOT_ATCmdTypeDef ATCmd;
NBIOT_ATCmd_SetCmdStack(&ATCmd,Sendbuf,Sendlen,ATack,ATNack);
Uart2BufClear();
NB_SEND(ATCMD->ATSendbuf,ATCMD->ATSendlen);//發送
ReceiveNBIOT(tm);//延時用于串口接收模組回傳資料
return (analysisNBData(ATCMD->ATack,ATCMD->ATNack));//回傳設定是否成功
}
(4)接收模組回傳資料函式
void ReceiveNBIOT(uint16_t waittime)//發送AT后的等待時間
{
HAL_Delay(waittime);
nbdata.slen = uartReadByte(&huart2,&nbdata.sdata[0],MaxUartBC95);
if (nbdata.slen > MaxUartBC95)
{
nbdata.slen = MaxUartBC95;
}
memset (&rlynbdata.sdata[0],0,MaxUartBC95);
memcpy (&rlynbdata.sdata[0],&nbdata.sdata[0],nbdata.slen);
rlynbdata.slen = nbdata.slen;
}
(5)分析指令是否設定成功
int8_t analysisNBData(int8_t* RLY,int8_t* NRLY)
{
int8_t flg = NACK;
if (rlynbdata.slen)
{
if(strstr_my((int8_t *)&rlynbdata.sdata[0],RLY) == NULL)
{
if(strstr_my((int8_t *)&rlynbdata.sdata[0],NRLY) == NULL)
{
flg = NACK;
}
else
{
flg = ACKERROR;
}
}
else
{
flg = ACKOK;
}
}
return flg;
}
2.在Stm32中使用AT指令的組合
現在我們用NBIOT_ATCMD_SEND函式反復操作AT指令就可以啦
(1)重啟
從第二部分看,似乎重啟只需要一條AT指令,但是官方推薦在關機之前,使用AT+CFUN保存頻點、去網路附著,開機后我們再打開附著,
void NBIOT_reCON(void)
{
int8_t OK[] = "OK";
int8_t ERROR[] = "ERROR";
int8_t ATOK[] = "AT\r\n";
int8_t ATCFUN0[] = "AT+CFUN=0\r\n";
int8_t ATNRB[] = "AT+NRB\r\n";
int8_t ATCFUN1[] = "AT+CFUN=1\r\n";
int8_t ATCGATT[] = "AT+CGATT=1\r\n";
NBIOT_ATCmdTypeDef ATCmd;
NBIOT_ATCMD_SEND(&ATCmd,ATOK,strlen((char *)ATOK),OK,ERROR,1000);
NBIOT_ATCMD_SEND(&ATCmd,ATNRB,strlen((char *)ATNRB),OK,ERROR,5000);
NBIOT_ATCMD_SEND(&ATCmd,ATCFUN0,strlen((char *)ATCFUN0),OK,ERROR,3000);
NBIOT_ATCMD_SEND(&ATCmd,ATOK,strlen((char *)ATOK),OK,ERROR,1000);
NBIOT_ATCMD_SEND(&ATCmd,ATCFUN1,strlen((char *)ATCFUN1),OK,ERROR,5000);
NBIOT_ATCMD_SEND(&ATCmd,ATCGATT,strlen((char *)ATCGATT),OK,ERROR,3000);
}
2.讀取IMEI并決議
int8_t Q_NBIOT_IMEI(int8_t *imei)
{
int8_t ATCGSN[] = "AT+CGSN=1\r\n"; //Request the IMEI number +CGSN:490154203237511
int8_t OK[] = "OK";
int8_t ERROR[] = "ERROR";
NBIOT_ATCmdTypeDef ATCmd;
NBIOT_ATCMD_SEND(&ATCmd,ATCGSN,strlen((char *)ATCGSN),OK,ERROR,1000);
memset((void *)imei, 0x0, sizeof(imei));
if (sscanf((const char*)&rlynbdata.sdata[0], "%*[^+CGSN]%*[^:]:%[^\r]", imei) <= 0)
{
return -1;
}
return 0;
}
sscanf()函式使用方法
3.讀取網路時間并決議
int8_t Q_NBIOT_CCLK(int8_t *localtime, size_t localtime_len)
{
int8_t ATCCLK[] = "AT+CCLK?\r\n"; //+CCLK:19/12/01,02:05:38+32
int8_t OK[] = "OK";
int8_t ERROR[] = "ERROR";
int rly,num = 0;
NBIOT_ATCmdTypeDef ATCmd;
while (num++ < 3)
{
NBIOT_ATCMD_SEND(&ATCmd,ATCCLK,strlen((char *)ATCCLK),OK,ERROR,2000);
rly = net_gettime((char *)&rlynbdata.sdata[0],(char *)localtime,strlen((char *)&rlynbdata.sdata[0]));//
if (0 == rly)
break;
}
return 0;
}
4.讀取溫度和電量
//+QCHIPINFO:TEMP,30
//+QCHIPINFO:VBAT,3316
int8_t Q_NBIOT_CHIPINFO(int8_t **var)
{
int8_t ATCCHIPINFO[] = "AT+QCHIPINFO=ALL\r\n";
int8_t OK[] = "OK";
int8_t ERROR[] = "ERROR";
int rly,num = 0;
NBIOT_ATCmdTypeDef ATCmd;
int8_t temp[10];
int8_t vbat[10];
memset(temp,0,sizeof(temp));
memset(vbat,0,sizeof(vbat));
while (num++ < 3)
{
NBIOT_ATCMD_SEND(&ATCmd,ATCCHIPINFO,strlen((char *)ATCCHIPINFO),OK,ERROR,2000);
rly = getinfo(&rlynbdata.sdata[0],strlen((char *)&rlynbdata.sdata[0]),(int8_t*)"TEMP",4,temp,sizeof(temp));
if (-1 == rly)
continue;
rly = getinfo(&rlynbdata.sdata[0],strlen((char *)&rlynbdata.sdata[0]),(int8_t*)"VBAT",4,vbat,sizeof(vbat));
if (0 == rly)
break;
}
if (0 == rly)
{
memcpy(*var,temp,10);
memcpy(*(var+1),vbat,10);
return 0;
}
return -1;
}
5.聯網上傳資料到電信云平臺
(1)先看看官方給出的步驟

(2)聯網
這里模組和平臺通信的協議采用的是Coap協議,CoAP的默認埠號為5683,
int8_t CenterConnect(void)
{
int8_t rly = -1;
rly = Q_Link();
if (ACKOK == rly)
{
return 0;
}
NBIOT_reCON();
rly = Q_Link();
if (ACKOK == rly)
{
return 0;
}
rly = NBIOT_CONNECT();
return rly;
}
int8_t NBIOT_CONNECT(void)
{
int8_t C1[] = "1";
int8_t C0[] = "0";
int8_t OK[] = "OK";
int8_t ERROR[] = "ERROR";
int8_t ATOK[] = "AT\r\n";
int8_t ATNRB[] = "AT+NRB\r\n";
int8_t ATCFUN0[] = "AT+CFUN=0\r\n";
int8_t ATCPSMS[] = "AT+CPSMS=1\r\n";
int8_t ATNCSEARFCN[] = "AT+NCSEARFCN\r\n";
int8_t ATCFUN1[] = "AT+CFUN=1\r\n";
int8_t ATCGATT[] = "AT+CGATT=1\r\n";
int8_t ATCGATTq[] = "AT+CGATT?\r\n";
int8_t ATNCONFIG[] = "AT+NCONFIG=CELL_RESELECTION,TRUE\r\n";
int8_t ATNCDP[] = "AT+NCDP=180.101.147.115,5683\r\n";
int8_t ATNCONFIGTRUE[] = "AT+NCONFIG=AUTOCONNECT,TRUE\r\n";
int8_t ATCEDRXS[] = "AT+CEDRXS=0,5\r\n";
NBIOT_ATCmdTypeDef ATCmd;
NBIOTReset();
NBIOT_ATCMD_SEND(&ATCmd,ATOK,strlen((char *)ATOK),OK,ERROR,1000);
NBIOT_ATCMD_SEND(&ATCmd,ATNCDP,strlen((char *)ATNCDP),OK,ERROR,1000);
NBIOT_ATCMD_SEND(&ATCmd,ATNRB,strlen((char *)ATNRB),OK,ERROR,5000);
NBIOT_ATCMD_SEND(&ATCmd,ATCFUN0,strlen((char *)ATCFUN0),OK,ERROR,3000);
NBIOT_ATCMD_SEND(&ATCmd,ATNCSEARFCN,strlen((char *)ATNCSEARFCN),OK,ERROR,1000);
NBIOT_ATCMD_SEND(&ATCmd,ATCPSMS,strlen((char *)ATCPSMS),OK,ERROR,1000);
NBIOT_ATCMD_SEND(&ATCmd,ATNCONFIG,strlen((char *)ATNCONFIG),OK,ERROR,1000);
NBIOT_ATCMD_SEND(&ATCmd,ATCFUN1,strlen((char *)ATCFUN1),OK,ERROR,5000);
NBIOT_ATCMD_SEND(&ATCmd,ATNCONFIGTRUE,strlen((char *)ATNCONFIGTRUE),OK,ERROR,2000);
NBIOT_ATCMD_SEND(&ATCmd,ATCGATT,strlen((char *)ATCGATT),OK,ERROR,3000);
NBIOT_ATCMD_SEND(&ATCmd,ATCEDRXS,strlen((char *)ATCEDRXS),OK,ERROR,3000);
return (NBIOT_ATCMD_SEND(&ATCmd,ATCGATTq,strlen((char *)ATCGATTq),C1,C0,2000));
}
(3)上傳資料AT+QLWULDATAEX/AT+NMGR(發布)
AT+QLWULDATAEX有四種訊息型別可選:

int8_t NBIOT_QLWULDATAEX(int8_t* Sendbuf, uint16_t Sendlen)
{
int8_t OK[] = "OK";
int8_t ERROR[] = "ERROR";
int8_t CMEE[] = "AT+CMEE=1\r\n";
//int8_t ATCMEE[] = "AT+NMSTATUS?\r\n";
NBIOT_ATCmdTypeDef ATCmd;
uint16_t buflen;
buflen = sizeof(data_buf)/2;
if (Sendlen > buflen)
{
Sendlen = buflen;
}
NBIOT_ATCMD_SEND(&ATCmd,CMEE,strlen((char *)CMEE),OK,ERROR,1000);
memset (NMGScmd_buf,0,sizeof(NMGScmd_buf));
NBIOT_trans (Sendbuf,data_buf,Sendlen);
sprintf((char *)NMGScmd_buf,"AT+QLWULDATAEX=%d,%s,0x0001\r\n",Sendlen,data_buf);
//NBIOT_ATCMD_SEND(&ATCmd,ATCMEE,strlen((char *)ATCMEE),OK,ERROR,1000);
return ( NBIOT_ATCMD_SEND(&ATCmd,NMGScmd_buf,strlen((char *)NMGScmd_buf),OK,ERROR,2000));
}
uint8_t SData2NET(int8_t *sensordata,uint16_t slen)
{
uint8_t rly;
//uint8_t r;
rly = NBIOT_QLWULDATAEX(&sensordata[0],slen);
//r = NBIOT_QLWULDATASTATUS(&sensordata[0],slen);
if (ACKOK != rly)
{
rly = NBIOT_QLWULDATAEX(&sensordata[0],slen);
printf("Try to send data again... \n\n");
}
if(ACKOK == rly)
{
printf("Send data OK!\n\n");
}
return rly;
}
也可以用AT+NMGS來發布
int8_t NBIOT_NMGS(int8_t* Sendbuf, unsigned int Sendlen)
{
int8_t OK[] = "OK";
int8_t ERROR[] = "ERROR";
NBIOT_ATCmdTypeDef ATCmd;
unsigned int buflen;
buflen = sizeof(data_buf)/2;
if (Sendlen > buflen)
{
Sendlen = buflen;
}
memset (NMGScmd_buf,0,sizeof(NMGScmd_buf));
NBIOT_trans (Sendbuf,data_buf,Sendlen);
sprintf((char *)NMGScmd_buf,"AT+NMGS=%d,%s\r\n",Sendlen,data_buf);
return (NBIOT_ATCMD_SEND(&ATCmd,NMGScmd_buf,strlen((char *)NMGScmd_buf),OK,ERROR,3000));
}
6.接收平臺下發資料AT+NMGR(訂閱)
int8_t NBIOT_NMGR(void)
{
int8_t OK[] = "OK";
int8_t ERROR[] = "ERROR";
NBIOT_ATCmdTypeDef ATCmd;
int rly;
memset (NMGRcmd_buf,0,sizeof(NMGRcmd_buf));
sprintf((char *)NMGRcmd_buf,"AT+NMGR\r\n");
rly = NBIOT_ATCMD_SEND(&ATCmd,NMGRcmd_buf,strlen((char *)NMGRcmd_buf),OK,ERROR,3000);
if(-1 == rly)
{
return rly;
}
return 1;
}
int8_t analyistNetData()
{
int8_t rly = NBIOT_NMGR();
if(rly == -1)
{
return -1;
}
//讀rlynbdata中資料,然后按照約定決議
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/25234.html
標籤:AI
