PY32F003+RTL8710(AT) 實現獲取天氣情況

一、RTL8710主要AT指令

1、ATSR:模塊重啟

2、ATSE=1:開啟回顯

3、ATPW=1:station模式

4、ATPN=ssid,password,,:連接到AP

5、ATPK=1:設置自動接收

6、ATPC=0,v1.yiketianqi.com,80:與網站建立TCP連接

7、ATPT=125,1:GET /api?unescape=1&version=v61&appid=此處替換成自己的ID&appsecret=此處替換成自己的key?HTTP/1.1\r\nHost: v1.yiketianqi.com:80\r\nConnection: close\r\n

向天氣API網站發送調用API的url請求,以獲取天氣信息

二、PY32F003+RTL8710(AT) 實現

main.c

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "string.h"
#include "Lcd_Driver.h"
#include "LCD_calculate.h"
#include "rtl8710ATcmd.h"/* Private define ------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
UART_HandleTypeDef UartHandle;
uint8_t aTxBuffer[12] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
uint8_t aRxBuffer[2048] = {0xff};
uint8_t recvByte;
int rx_count=0;			//接收計數
uint8_t dataReceived=0;/* Private user code ---------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/void RTL8710_USART_Config(void)
{UartHandle.Instance          = USART2;		//AF9:PA0(TX),PA1(RX)UartHandle.Init.BaudRate     = 38400;UartHandle.Init.WordLength   = UART_WORDLENGTH_8B;UartHandle.Init.StopBits     = UART_STOPBITS_1;UartHandle.Init.Parity       = UART_PARITY_NONE;UartHandle.Init.HwFlowCtl    = UART_HWCONTROL_NONE;UartHandle.Init.Mode         = UART_MODE_TX_RX;if (HAL_UART_Init(&UartHandle) != HAL_OK){APP_ErrorHandler();}
}/**
*
*
*/
void RTL8710_UART_Send(uint8_t *str)
{uint8_t ch;while(*str!=0){ch=*str;HAL_UART_Transmit(&UartHandle, (uint8_t *)&ch, 1, 200);str++;}
}uint8_t* RTL8710_UART_Recieve()
{uint8_t ch;int i=0;if(HAL_UART_Receive(&UartHandle, (uint8_t *)&ch, 1, 1000)==HAL_OK){aRxBuffer[i++]=ch;}aRxBuffer[i]='\0';return aRxBuffer;
}/*處理接收buffer的信息
*/
void processRxBuffer(void)
{printf("接收到的信息:[%s]\r\n",aRxBuffer);extract_all_from_json(aRxBuffer);dataReceived=0;
}
/*** @brief  應用程序入口函數.* @retval int*/
int main(void)
{/* systick初始化 */HAL_Init();Lcd_Init();Lcd_Clear(RED);               //清屏/* USART初始化 */RTL8710_USART_Config();HAL_Delay(1000); /* DEBUG USART初始化 */BSP_USART_Config();HAL_Delay(1000);/*通過中斷方式接收數據*/if (HAL_UART_Receive_IT(&UartHandle, (uint8_t *)&recvByte, 1) != HAL_OK){APP_ErrorHandler();}RTL8710_UART_Send((uint8_t*)"ATSR\r\n");	//restartHAL_Delay(2000); printf("ATSR\r\n");Gui_DrawFont_GBK16(0,0,WHITE,RED,"ATSR");RTL8710_UART_Send((uint8_t*)"ATSE=1\r\n");	//0關閉回顯HAL_Delay(2000); printf("ATSE=1\r\n");Gui_DrawFont_GBK16(0,0,WHITE,RED,"ATSE");RTL8710_UART_Send((uint8_t*)"ATPW=1\r\n");		//1:station ;2:apHAL_Delay(1000); printf("ATPW=1\r\n");				//stationGui_DrawFont_GBK16(0,0,WHITE,RED,"ATPW=1");RTL8710_UART_Send((uint8_t*)"ATPN=lion,sujingliang,,\r\n");	HAL_Delay(10000); printf("ATPN=\"ssid\",password,,\r\n");			//連接到wifi APGui_DrawFont_GBK16(0,0,WHITE,RED,"CONNECT AP");createTCPClient();RTL8710_UART_Send((uint8_t*)"ATPK=1\r\n");HAL_Delay(1000); printf("ATPK=1\r\n");		//建立自動接收Gui_DrawFont_GBK16(0,0,WHITE,RED,"ATPK=1");getDataFromApi();/*通過中斷方式發送數據*/processRxBuffer();while (1){/* 延時500ms */HAL_Delay(500);  }
}/*** @brief  USART錯誤回調執行函數* @param  huart:USART句柄* @retval 無*/
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{if((huart==&UartHandle)&&(huart->ErrorCode!=HAL_UART_ERROR_NONE)){printf("Uart Error, ErrorCode = %d\r\n", huart->ErrorCode);if(__HAL_UART_GET_FLAG(huart,UART_FLAG_ORE) != RESET) {__HAL_UART_CLEAR_OREFLAG(huart);while(HAL_UART_Receive_IT(&UartHandle, &recvByte, 1)!=HAL_OK){UartHandle.RxState = HAL_UART_STATE_READY;__HAL_UNLOCK(&UartHandle);}}}
}/*** @brief  USART發送回調執行函數* @param  huart:USART句柄* @retval 無*/
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *UartHandle)
{if (HAL_UART_Receive_IT(UartHandle, (uint8_t *)aRxBuffer, 12) != HAL_OK){APP_ErrorHandler();}
}/*** @brief  USART接收回調執行函數* @param  huart:USART句柄* @retval 無*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *Handle)
{/*通過中斷方式接收數據*/if(Handle->Instance==USART2){printf("%c", recvByte);if(rx_count<2047){if(dataReceived==0){aRxBuffer[rx_count++]=recvByte;					//rx_count>100丟棄}}if((0x0A==aRxBuffer[rx_count-1])&&(0X0D==aRxBuffer[rx_count-2])){aRxBuffer[rx_count]='\0';if(strstr((char*)aRxBuffer,"{\"cityid\":")){dataReceived=1;}rx_count=0;}while(HAL_UART_Receive_IT(&UartHandle, &recvByte, 1)!=HAL_OK){UartHandle.RxState = HAL_UART_STATE_READY;__HAL_UNLOCK(&UartHandle);}}
}/*** @brief  錯誤執行函數* @param  無* @retval 無*/
void APP_ErrorHandler(void)
{/* 無限循環 */while (1){}
}#ifdef  USE_FULL_ASSERT
/*** @brief  輸出產生斷言錯誤的源文件名及行號* @param  file:源文件名指針* @param  line:發生斷言錯誤的行號* @retval 無*/
void assert_failed(uint8_t *file, uint32_t line)
{/* 用戶可以根據需要添加自己的打印信息,例如: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* 無限循環 */while (1){}
}
#endif /* USE_FULL_ASSERT *//************************ (C) COPYRIGHT Puya *****END OF FILE******************/
#include <main.h>
#include <string.h>
#include "rtl8710ATcmd.h"
#include "Lcd_Driver.h"
#include "LCD_calculate.h"struct CITY_WEATHER{char date[11];char city[20];char	wea[5];char	tem[6];
}city_weather;extern void RTL8710_UART_Send(uint8_t *str);void createTCPClient(void)
{RTL8710_UART_Send((uint8_t*)"ATPC=0,v1.yiketianqi.com,80\r\n");	Gui_DrawFont_GBK16(0,0,WHITE,RED,"createTCPClient");HAL_Delay(2000); 
}void getDataFromApi(void)
{RTL8710_UART_Send((uint8_t*)"ATPT=125,1:GET /api?unescape=1&version=v61&appid=17769781&appsecret=5IbudTJx HTTP/1.1\r\nHost: v1.yiketianqi.com:80\r\nConnection: close\r\n\r\n");	Gui_DrawFont_GBK16(0,0,WHITE,RED,"getDataFromApi");HAL_Delay(5000); //printf("ATPT=125,1:GET /api?unescape=1&version=v61&appid=17769781&appsecret=5IbudTJx HTTP/1.1\r\nHost: v1.yiketianqi.com:80\r\nConnection: close\r\n\r\n");	
}void extract_item_from_json(const char *json_str,char *itemname,char *target)
{char *start = strstr(json_str, itemname); // 查找"cityEn":"  char *end;size_t len=20;char item[20]; // +1 for null terminatorif (start != NULL) {  start += strlen(itemname); // 跳過itemname end = strchr(start, '"'); // 查找下一個雙引號  if (end != NULL) {  // 提取  len = end - start;  strncpy(item, start, len);  item[len] = '\0'; // 添加字符串結束符  printf("Item: %s\n", item);  strncpy(target, item, len);target[len] = '\0'; // 添加字符串結束符 }  } else {  printf("Item[%s] not found in the JSON string.\n",itemname);  }  
}void extract_all_from_json(const char *json_str)
{extract_item_from_json(json_str,"\"cityEn\":\"",city_weather.city);extract_item_from_json(json_str,"\"tem\":\"",city_weather.tem);extract_item_from_json(json_str,"\"date\":\"",city_weather.date);Lcd_Clear(BLACK);  Gui_DrawFont_GBK16(0,0,WHITE,BLACK,"    Weather    ");Gui_DrawFont_GBK16(2,20,BLUE,BLACK,"City:");Gui_DrawFont_GBK16(45,20,YELLOW,BLACK,city_weather.city);Gui_DrawFont_GBK16(2,40,BLUE,BLACK,"Temp:");Gui_DrawFont_GBK16(45,40,YELLOW,BLACK,city_weather.tem);Gui_DrawFont_GBK16(2,60,BLUE,BLACK,"Date:");Gui_DrawFont_GBK16(45,60,YELLOW,BLACK,city_weather.date);
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/15422.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/15422.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/15422.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關于pytorch加載模型報錯問題

load_net[“params”] 報keyerror 加載模型后查看對應參數是什么 model2 torch.load(m1_path "xxx.pth") print(model1.keys())若輸出如下&#xff1a; 已經有相應參數不需要執行 load_net[“params”]若輸出如下 則需要load_net[“params”]

Linux-命令上

at是一次性的任務&#xff0c;crond是循環的定時任務 如果 cron.allow 文件存在&#xff0c;只有在文件中出現其登錄名稱的用戶可以使用 crontab 命令。root 用戶的登錄名必須出現在 cron.allow 文件中&#xff0c;如果這個文件存在的話。系統管理員可以明確的停止一個用戶&am…

3D 生成重建014-Bidiff使用二維和三維先驗的雙向擴散

3D 生成重建014-Bidiff使用二維和三維先驗的雙向擴散 文章目錄 0 論文工作1 論文方法2 效果 0 論文工作 大多數三維生成研究集中在將二維基礎模型向上投影到三維空間中&#xff0c;要么通過最小化二維評分蒸餾采樣&#xff08;SDS&#xff09;損失&#xff0c;要么通過對多視圖…

判斷變量是否為數組的幾種方法

1、isArray 方法 isArray() 方法用于判斷一個對象是否為數組。如果對象是數組返回 true&#xff0c;否則返回 false。 Array.isArray(arr); // true 1 2、對象原型 通過原型鏈判斷是否具有和數組同一原型鏈的頂端。 arr.__proto__ Array.prototype; // true 1 3、instanceof…

[數據結構] -- 雙向循環鏈表

&#x1f308; 個人主頁&#xff1a;白子寰 &#x1f525; 分類專欄&#xff1a;C打怪之路&#xff0c;python從入門到精通&#xff0c;數據結構&#xff0c;C語言&#xff0c;C語言題集&#x1f448; 希望得到您的訂閱和支持~ &#x1f4a1; 堅持創作博文(平均質量分82)&#…

一文理清database/sql包的使用場景和宕機查詢流程

一文理清database/sql包你可能遇到的問題 那么database/sql包實現了什么功能呢&#xff1f;建立數據庫連接檢測連接是否能ping通通過連接進行具體的sql查詢查詢完將連接進行關閉當數據庫宕掉重啟后再次查詢 database/sql包創建的db連接 對于數據庫宕掉后重啟是否仍然有效&#…

AI繪畫工具:創意與技術的完美融合

隨著人工智能技術的飛速發展&#xff0c;我們見證了無數領域的革新與變革。其中&#xff0c;AI繪畫工具的出現&#xff0c;無疑為藝術界帶來了一股清新的風潮。這些工具以其獨特的魅力&#xff0c;吸引了無數藝術家和創意人士的目光&#xff0c;成為他們表達自我、探索未知的重…

Compose在xml中使用滑動沖突處理

一、背景 在現有Android項目中使用Compose可能存在滑動沖突問題&#xff0c;例如 SmartRefreshLayoutCoordinatorLayoutComposeView(ComposeView這里又是一個LazyColumn) 二、解決方案 官方介紹&#xff1a;https://developer.android.google.cn/develop/ui/compose/touch-inp…

huggingface 筆記:device_map

1 基本映射方法 設計設備映射時&#xff0c;可以讓Accelerate庫來處理設備映射的計算通過設置device_map為支持的選項之一&#xff08;"auto"、 "balanced"、 "balanced_low_0"、 "sequential"&#xff09;&#xff1b;或者如果想更精…

golang的context和chan 的使用

1. context 作用 context包的context的接口&#xff0c;主要是控制協程執行上下文的時間&#xff0c;以及取消程序的執行&#xff0c;以及上下文中傳遞數據等作用&#xff0c;golang中耗時或者需要協同的操作都會見到context的身影。 context有幾個常用的方法 1.1 context.B…

用爬山算法解決離散的優化問題

爬山算法&#xff0c;也稱為梯度上升算法或局部搜索算法&#xff0c;是一種簡單有效的優化算法&#xff0c;常用于解決連續或離散的優化問題。爬山算法的基本思想是從一個隨機的初始點開始&#xff0c;通過迭代地向局部最優的方向移動&#xff0c;逐步逼近全局最優解。 爬山算…

git管理Codeup云效平臺

HTTPS方式實現Git命令 1.進入項目路徑&#xff0c;如 cd demo&#xff0c;與此同時&#xff0c;在Codeup平臺創建一個空倉庫repo&#xff0c;獲取空倉庫的https協議地址&#xff0c;例如 https://codeup.aliyun.com/xxxx/xxxx/xxx.git。 2.在demo項目下執行 git init命令初始化…

從反向傳播(BP)到BPTT:詳細數學推導【原理理解】

從反向傳播到BPTT&#xff1a;詳細推導與問題解析 在本文中&#xff0c;我們將從反向傳播算法開始&#xff0c;詳細推導出反向傳播通過時間&#xff08;Backpropagation Through Time, BPTT&#xff09;算法。重點討論BPTT中的梯度消失和梯度爆炸問題&#xff0c;并解釋如何解…

采用LoRA方法微調llama3大語言模型

文章目錄 前言一、Llama3模型簡介1.下載llama3源碼到linux服務器2.安裝依賴3.測試預訓練模型Meta-Llama-3-8B4.測試指令微調模型Meta-Llama3-8B-Instruct5.小結 二、LoRA微調Llama31.引入庫2.編寫配置文件3.LoRA訓練的產物 三、測試新模型效果1.編寫配置文件2.運行配置文件&…

QT教程-一,初識QT

目錄 一,QT是什么&#xff1f;能夠使用它做什么&#xff1f; 二&#xff0c;Qt 能夠使用的語言 三&#xff0c;Qt主要用于什么領域&#xff1f; 四&#xff0c;Qt開發的軟件 一,QT是什么&#xff1f;能夠使用它做什么&#xff1f; Qt是一個跨平臺的 C 開發庫&#xff0c;主…

全球最高點贊記錄,世界點贊第一名是誰?世界點贊第一人名字的由來

世界點贊第一人名字的由來&#xff1a; 起源與概念提出&#xff1a; 二十一世紀東方偉大的思想家哲學家教育家顏廷利教授&#xff0c;一位在中國21世紀早期便以其非凡才華和創新精神著稱的學者&#xff0c;早在互聯網尚未普及的20世紀90年代&#xff0c;就已經提出了“點贊”的…

算法提高之最大數

算法提高之最大數 核心思想&#xff1a;線段樹 添加數 看作原本的數組有數(0) 現在將他修改成另一個值 詢問后l個數的最大值query函數具體實現 #include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N 200010;typed…

python爬蟲登錄到海康相機管理頁面

簡述 1.最近接到個任務是在管理頁面更改相機的某個參數&#xff0c;下載官方的sdk貌似沒有提供這個接口&#xff0c;所以只能自己寫爬蟲登錄發請求了。 1.主要步驟 1.1 發送get請求獲取到salt&#xff0c;sessionID&#xff0c;challenge等信息 http://admin:123456192.168.…

交叉熵損失函數計算過程(tensorflow)

交叉熵損失函數通常用于多類分類損失函數計算。計算公式如下&#xff1a; P為真實值&#xff0c;Q為預測值。 使用tensorflow計算 import tensorflow as tf import keras# 創建一個示例數據集 # 假設有3個樣本&#xff0c;每個樣本有4個特征&#xff0c;共2個類別 # 目標標簽…

Spark Client 配置

前言 記錄Spark Client 配置,這里的 Spark Client 和 HDFS、YARN 不在一個節點,只是一個單節點的 Spark Client,需要能連接其他節點的大數據集群的 Hive 和 能提交到Yarn 。 環境信息 大數據節點(已配置好Spark): 192.168.44.154 192.168.44.155 192.168.44.156 客戶端…