NB-IoT串口通信
- NB-IoT簡單介紹
- NB-IoT串口通信介紹
- NB-IoT上報和下發指令方式
- 實驗環境
- 硬體環境
- 軟體環境
- 實驗步驟
- 硬體連接,使用CubeMx生成初始化代碼
- 使用KEIL5撰寫業務代碼
- main.c中添加重定向函式、全域變數:
- main.c中添加uart2接收中斷使能
- main.c中添加串口接識訓呼函式
- 在main.c的main函式的while(1)中添加開燈、關燈代碼
- 使用VS Code 撰寫python代碼,呼叫API介面
- 測驗
- 初始化云連接測驗
- 開燈、關燈測驗
- Python呼叫API測驗
- 總結
NB-IoT簡單介紹
NB-Iot(窄帶物聯網),本次實驗用到的型號是stm32F051 + NB86-G,NB-IOT 節點控制模塊是有 1.44 寸 LCD 液晶屏、NB-IOT 模塊、和傳感器節點介面組成,底部有 miniUSB 轉串口,方便單獨就一個底板進行除錯,
下圖為 NB-IOT 一鍵還原+溫濕度模塊的硬體圖片:
NB-IoT串口通信介紹
其他不做介紹,這里只介紹NB串口通信,stm32有兩個uart,分別為uart1和uart2,其中uart1用作stm32與串口除錯助手通信的,uart2用作stm32與NB86-G進行通信的,所以如果想要在串口除錯助手看到uart2 的資料資訊,就需要進行資料透傳,也就是,從uart2接收的資料發給uart1,uart1接收到的資料再發給uart2,這樣就可以在串口除錯助手看到資料資訊,
NB-IoT上報和下發指令方式
本文章實作的是通過ctwing電信云平臺下發指令給開發板,開發板接收到指令之后,分別進行開燈和關燈,
電信云平臺提供了python、go、Java等語言的SDK,所以我們除了在平臺下發指令界面點擊下發指令完成指令的下發,還可以通過平臺提供的API介面完成指令的上報和下發功能(當然SDK包提供了多個API介面,根據需求進行使用),
實驗環境
硬體環境
NB-IOT 一鍵還原板(開發板,包括stm32F051)
ST-Link 下載器
USB 轉串口線
軟體環境
STM32CubeMX
MDK-Keil5
串口除錯助手
電信云平臺
VS Code(用python呼叫API介面)
實驗步驟
在實驗開始之前,要先搭建好環境,保證開發板啟動之后自動上云,云平臺產品、設備、應用提前搭建好,本文章不做介紹,
硬體連接,使用CubeMx生成初始化代碼
CubeMx配置如下:

把PB1 GPIO口設定為輸出模式,用于LED燈,uart1和uart2設為異步通信模式,波特率為9600,
uart1基本引數,改下波特率,其他默認:

uart1使能中斷:

uart2基本引數,改下波特率,其他默認:

uart2使能中斷:

配置完成之后,點擊GENERATE CODE生成初始化代碼,
使用KEIL5撰寫業務代碼
main.c中添加重定向函式、全域變數:
int fputc(int c, FILE *stream)
{
unsigned char ch = c;
HAL_UART_Transmit(&huart1, &ch, 1, HAL_MAX_DELAY);
return ch;
}
unsigned char uart_recv_char[20];
unsigned char buf[1024];
unsigned int i=0;
這樣就可以直接使用printf函式,往串口上發送資料,
main.c中添加uart2接收中斷使能
HAL_UART_Receive_IT(&huart2,uart_recv_char,1);//使能接收中斷
main.c中添加串口接識訓呼函式
這里一邊把接收到的資料發給uart1串口顯示,一邊把字符一個一個保存到buf中,大小為1024,如果大于這個了,就清空重新存,
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *uartHandle)
{
HAL_UART_Transmit(&huart1,uart_recv_char,1,100);
if(i>1023)
{
memset(buf,0,1024);
i=0;
}
buf[i++]=uart_recv_char[0];
HAL_UART_Receive_IT(&huart2,uart_recv_char,1);
}
在main.c的main函式的while(1)中添加開燈、關燈代碼
if(buf[strlen((char *)buf)-3]=='1')
{
HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,0);
}
else if(buf[strlen((char *)buf)-3]=='2')
{
HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,1);
}
這里我用16進制01命令代表開燈,02命令代表關燈,命令是在云連接完成之后下發的,所以,命令始終存在buf的最后幾位,接收到的命令格式:’’+NNMI:1,02’’,最后兩位就為發送的16進制,這里只需要對最后一位進行判斷是1還是2就ok,那么為什么是strlen(buf)-3呢,原因是字串后自跟了\r\n,
這就完成了指令下發并控制LED燈的功能,
使用VS Code 撰寫python代碼,呼叫API介面
首先下載python的SDK包,在電信云應用界面可以下載,
def send_cmd(cmd):
result = aep_device_command.CreateCommand('4ywcD78fdig', 'aFBjbqD2xc', '59d8fa3ce589413cb353204b34f735ba', '{"productId":10095853,"deviceId":"2cd6f0cf603d4efea480592e896264c3","operator":"wyy","content":{"dataType":2,"payload":'+'\"'+cmd+'\"'+'}}')
print('result='+str(result))
引數:(App Key,App Secret,MasterKey,(產品ID,設備ID,操作者,下發指令的內容)
其中cmd命令通過傳參形式進行設定,
測驗
初始化云連接測驗
開發板上電,編譯代碼,把代碼燒進開發板,復位:

出現此界面即為初始化成功,并且成功連接云,
開燈、關燈測驗
現在下發一個01指令用于開燈:

查看串口接收到的指令:+NNMI:1,01

現在下發一個02指令用于關燈:

查看串口接收到的指令:+NNMI:1,02

此時可以看到開發板的LED燈亮滅了,如果云平臺顯示下發指令成功,而串口助手并沒有列印出來命令,可能有延時,這時候復位開發板,就可以看到命令輸出到串口了,
Python呼叫API測驗
點擊開燈按鈕執行下發指令01的函式,點擊關燈按鈕執行下發指令02的函式,這兩個函式為同一個函式,只是傳參不同,

現在點擊開燈:

可以看到command的值為01,即為下發指令成功,對應燈也會亮,并且可以在云平臺查看下發指令日志,
現在點擊關燈:

可以看到command的值為02,即為下發指令成功,對應燈也會滅,并且可以在云平臺查看下發指令日志,
總結
本文章主要介紹如何使用uart2和uart1進行通信以及如何下發指令,如何使用SDK包呼叫API介面完成指令的下發,其他部分沒有詳細介紹,你,學會了嗎???
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/142124.html
標籤:其他
