ESP8266+STM32 AT驅動程序,心知天氣API 記錄時間: 2025年5月26日13:24:11

?接線為 串口2 接入ESP8266

esp8266.c


#include "stm32f10x.h"//8266預處理文件
#include "esp8266.h"//硬件驅動
#include "delay.h"
#include "usart.h"//用得到的庫
#include <string.h>
#include <stdio.h>
#include <cJSON.h>
#include <stdlib.h>
#include <ctype.h>   // for isspace
#include <string.h>  // for strlen
#include <stddef.h>
#include <stdarg.h>char city_name[32]="beijing"; //用于存儲你要獲取的城市名字(拼音或地址碼)
char wifi_ssid[32]="0000"; //用于存儲你要連接的熱點名字
char wifi_pass[32]="0000"; //用于存儲你要連接的熱點密碼
int is_wifi_connected;//聯網標志位
const char *blacklist[] = {
//過濾顯示設置"Host:","Date:","Connection:","Content-Type:","access-control-allow-origin:","Content-Length:","etag:","x-powered-by:","x-ratelimit-limit:","x-ratelimit-remaining:","x-ratelimit-reset:","x-request-id:","x-tenant-id:",NULL // 結束標志
};
//用于在雜亂的數據中找到關鍵詞
const char *ExtractField(const char *buf, const char *key, char *out, size_t out_size);
//用于屏蔽關鍵詞輸出 
void Filtered_Usart_Printf(const char *line);//======================
//      初始化ESP8266
//======================
void ESP8266_Init(void)
{is_wifi_connected=0;//初始化聯網標志位Usart_Printf(USART1, "Send AT\r\n"); //輸出到串口一// 查詢AT指令有效度ESP8266_SendCmd("AT\r\n","OK");Usart_Printf(USART1, "Send AT+CWJAP?\r\n");// 查詢是否已經連上網絡if(ESP8266_SendCmd("AT+CWJAP?\r\n",wifi_ssid)) {is_wifi_connected=1;} else {if(ConnectToWiFi()) {is_wifi_connected=1;//表示已經連上網絡} else {Usart_Printf(USART_DEBUG, "No Connect  WiFi\r\n");}}}//判斷聯網是否成功
_Bool ConnectToWiFi(void)
{char cmd[64];Usart_Printf(USART1, "Send AT\r\n");// 啟動8266 客戶端模式 嘗試聯網ESP8266_SendCmd("AT\r\n","OK");Usart_Printf(USART1, "Send AT+CWMODE=1\r\n");//嘗試連接到網絡ESP8266_SendCmd("AT+CWMODE=1\r\n","OK");if(sizeof(wifi_ssid)!=0 &&sizeof(wifi_pass)!=0) {//網絡信息沒設置不執行聯網程序sprintf(cmd, "AT+CWJAP=\"%s\",\"%s\"\r\n", wifi_ssid, wifi_pass);Usart_Printf(USART_DEBUG, "Try to connect WiFi: %s pass:%s\r\n", wifi_ssid,wifi_pass);ESP8266_SendCmd(cmd,"CONNECTED");Usart_Printf(USART_DEBUG, "connected %s\r\n", wifi_ssid);return 1;//不設置邏輯運行成功即返回1表聯網成功}}//=================================
//  cmd:命令 res:需要檢查的返回指令
// 傳遞字符串從串口2打印
//=================================
int ESP8266_SendCmd( char *cmd,char *res)
{Usart_Printf(USART2, cmd);char uart_buf[128];//數據緩存機制while(1) {if (USART2_GetLine(uart_buf, sizeof(uart_buf)) > 0) {// 緩沖數據中查找對應的關鍵詞if (strstr(uart_buf, res) != NULL) {// 判斷成功才打印(節約資源),收到的內容到串口1Usart_Printf(USART_DEBUG, "Recv: ");Usart_Printf(USART_DEBUG, uart_buf);Usart_Printf(USART_DEBUG, "\r\n");break;}if (strstr(uart_buf, "ERROR") != NULL) {// 判斷成功才打印(節約資源),收到的內容到串口1Usart_Printf(USART_DEBUG, "ERROR Recv: ");Usart_Printf(USART_DEBUG, uart_buf);Usart_Printf(USART_DEBUG, "\r\n");}}delay(500);}return 1;//返回1表執行成功
}//=================================
//發送給服務端以獲取數據的 GET/POST
//=================================
void GetWeatherAPI(void)
{Usart_Printf(USART_DEBUG, "AT+CIPMUX=0\r\n");ESP8266_SendCmd("AT+CIPMUX=0\r\n", "OK");  // 單連接模式Usart_Printf(USART_DEBUG, "AT+CIPSTART=\"TCP\",\"api.seniverse.com\",80\r\n");ESP8266_SendCmd("AT+CIPSTART=\"TCP\",\"api.seniverse.com\",80\r\n", "CONNECT");Usart_Printf(USART_DEBUG, "AT+CIPMODE=0\r\n");  // 確保是非透傳模式ESP8266_SendCmd("AT+CIPMODE=0\r\n", "OK");httpget();}void httpget(void)
{// 計算 GET 請求長度(根據你構造的 redata)char redata[256];char key[] = "心知天氣密匙";sprintf(redata,"GET /v3/weather/now.json?key=%s&location=%s&language=zh-Hans&unit=c HTTP/1.1\r\n""Host: api.seniverse.com\r\n""Connection: close\r\n""\r\n",key, city_name);char cmd[64];sprintf(cmd, "AT+CIPSEND=%d\r\n", strlen(redata));  // 指定長度Usart_Printf(USART_DEBUG, "%d", strlen(redata));ESP8266_SendCmd(cmd, ">");  // 等待 > 提示符// 發送實際內容Usart_Printf(USART_DEBUG, "%s", redata);Usart_Printf(USART2,redata);  // 直接發送原始數據,不帶 \r\n 請求體內部已經定義好了char uart_buf[256];//數據緩存機制char temperature_str[16];char text_str[16];while(1) {if (USART2_GetLine(uart_buf, sizeof(uart_buf)) > 0) {Filtered_Usart_Printf(uart_buf);if (ExtractField(uart_buf, "text", text_str, sizeof(text_str)))
{Usart_Printf(USART_DEBUG,"\r\n城市:%s\r\n",city_name);Usart_Printf(USART_DEBUG,"\r\n當前天氣:%s\r\n",text_str);
} if (ExtractField(uart_buf, "temperature", temperature_str, sizeof(temperature_str))) {int temperature = atoi(temperature_str);Usart_Printf(USART_DEBUG,"temperature:%d\r\n",temperature);}}Usart_Printf(USART2,"AT+CIPCLOSE\r\n");//關閉服務器
}const char *ExtractField(const char *buf, const char *key, char *out, size_t out_size)
{char search_key[64];snprintf(search_key, sizeof(search_key), "\"%s\":\"", key);const char *start = strstr(buf, search_key);if (!start) return NULL;start += strlen(search_key);const char *end = strchr(start, '"');if (!end) return NULL;size_t len = end - start;if (len >= out_size) len = out_size - 1;strncpy(out, start, len);out[len] = '\0';return out;
}
//屏蔽輸出函數
void Filtered_Usart_Printf(const char *line) {for (int i = 0; blacklist[i] != NULL; i++) {if (strstr(line, blacklist[i])) {return;}}Usart_Printf(USART_DEBUG, "%s", line);
}

esp8266.h

#ifndef __ESP8266_H
#define __ESP8266_H
#define USART_DEBUG   USART1// 全局變量聲明(外部可見)extern  int is_wifi_connected;void ESP8266_Init(void); //初始化操作
void httpget(void);
int ESP8266_SendCmd( char *cmd,char *res);
void GetWeatherAPI(void);
_Bool ConnectToWiFi(void); #endif

?usart.c

#include "usart.h"
#include <stdarg.h>
#include <string.h>
#include <stdio.h>#include "stm32f10x_usart.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "misc.h"
#include "esp8266.h"uint16_t usart2_index = 0;
uint8_t usart2_rx_buffer[USART2_RX_BUFFER_SIZE];
volatile uint16_t usart2_rx_head = 0;  // 寫指針
volatile uint16_t usart2_rx_tail = 0;  // 讀指針uint8_t usart1_buf[USART1_BUF_SIZE];
uint8_t usart2_buf[USART2_BUF_SIZE];
// 串口1接收緩沖及狀態
u8 USART1_RX_BUF[USART1_REC_LEN];
u16 USART1_RX_STA = 0;// 串口2接收緩沖及狀態
u8 USART2_RX_BUF[USART2_REC_LEN];
u16 USART2_RX_STA = 0;
void USART1_Init(u32 bound) {GPIO_InitTypeDef GPIO_InitStruct;USART_InitTypeDef USART_InitStruct;NVIC_InitTypeDef NVIC_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);// PA9 - TXDGPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStruct);// PA10 - RXDGPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStruct);// 配置串口1USART_InitStruct.USART_BaudRate = bound;USART_InitStruct.USART_WordLength = USART_WordLength_8b;USART_InitStruct.USART_StopBits = USART_StopBits_1;USART_InitStruct.USART_Parity = USART_Parity_No;USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_Init(USART1, &USART_InitStruct);// 中斷配置USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);USART_Cmd(USART1, ENABLE);// NVIC配置NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 3;NVIC_InitStruct.NVIC_IRQChannelSubPriority = 3;NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStruct);
}
void USART2_Init(u32 bound) {GPIO_InitTypeDef GPIO_InitStruct;USART_InitTypeDef USART_InitStruct;NVIC_InitTypeDef NVIC_InitStruct;// 使能時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // PA2/PA3RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);// PA2 - TXDGPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStruct);// PA3 - RXDGPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStruct);// 配置串口2USART_InitStruct.USART_BaudRate = bound;USART_InitStruct.USART_WordLength = USART_WordLength_8b;USART_InitStruct.USART_StopBits = USART_StopBits_1;USART_InitStruct.USART_Parity = USART_Parity_No;USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_Init(USART2, &USART_InitStruct);// 中斷配置USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);USART_Cmd(USART2, ENABLE);// NVIC中斷配置NVIC_InitStruct.NVIC_IRQChannel = USART2_IRQn;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 3;NVIC_InitStruct.NVIC_IRQChannelSubPriority = 3;NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStruct);
}
void Usart_SendString(USART_TypeDef *USARTx, const char *str) {while (*str) {USART_SendData(USARTx, (uint8_t)*str++);while (USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);}
}void Usart_Printf(USART_TypeDef *USARTx, const char *fmt, ...) {while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);//等待空閑char buffer[256];va_list ap;va_start(ap, fmt);vsnprintf(buffer, sizeof(buffer), fmt, ap);va_end(ap);Usart_SendString(USARTx, buffer);
}
void USART1_IRQHandler(void) {if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {uint8_t ch = USART_ReceiveData(USART1);if ((USART1_RX_STA & 0x8000) == 0) {if ((USART1_RX_STA & 0x4000) != 0) {if (ch == '\n') {USART1_RX_STA |= 0x8000; // 完整幀接收完成} else {USART1_RX_STA = 0; // 出錯重置}} else {if (ch == '\r') {USART1_RX_STA |= 0x4000;} else {USART1_RX_BUF[USART1_RX_STA++ & 0x7FFF] = ch;if (USART1_RX_STA >= USART1_REC_LEN)USART1_RX_STA = 0;}}}}
}
void USART2_IRQHandler(void) {if (USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) {uint8_t data = USART_ReceiveData(USART2);uint16_t next_head = (usart2_rx_head + 1) % USART2_RX_BUFFER_SIZE;if (next_head != usart2_rx_tail) {  // 如果沒有發生緩沖區滿的情況usart2_rx_buffer[usart2_rx_head] = data;  // 存入數據usart2_rx_head = next_head;               // 更新寫指針return;
}   if (next_head == usart2_rx_tail) {// 緩沖區滿,允許覆蓋usart2_rx_tail = (usart2_rx_tail + 1) % USART2_RX_BUFFER_SIZE;}
usart2_rx_buffer[usart2_rx_head] = data;usart2_rx_head = next_head;}  }
/*** @brief  從 USART2 的 Ring Buffer 中讀取一個字節* @param  data: 用于保存讀取到的數據* @retval 1: 成功讀取, 0: 緩沖區為空*/int USART2_GetLine(char *buf, int max_len) {int i = 0;while (i < max_len - 1) {if (usart2_rx_tail == usart2_rx_head) {break; // 緩沖區為空}char ch = usart2_rx_buffer[usart2_rx_tail];usart2_rx_tail = (usart2_rx_tail + 1) % USART2_RX_BUFFER_SIZE;buf[i++] = ch;if (ch == '\n') { // 遇到換行符結束buf[i] = '\0';return i;}}buf[i] = '\0'; // 補上字符串結束符return i;
}int USART1_WaitRecive(void) {u32 timeout = 0xFFFFF;while ((USART1_RX_STA & 0x8000) == 0) {if (--timeout == 0) return -1;}memcpy(usart1_buf, USART1_RX_BUF, USART1_RX_STA & 0x7FFF);usart1_buf[USART1_RX_STA & 0x7FFF] = '\0';USART1_ClearRxBuffer();return 0;
}void USART1_ClearRxBuffer(void) {memset(USART1_RX_BUF, 0, USART1_REC_LEN);USART1_RX_STA = 0;
}int USART2_WaitRecive(char *res) {u32 timeout = 0xFFFFF;while ((USART2_RX_STA & 0x8000) == 0) {if (--timeout == 0) return -1;}memcpy(usart2_buf, USART2_RX_BUF, USART2_RX_STA & 0x7FFF);usart1_buf[USART2_RX_STA & 0x7FFF] = '\0';USART1_ClearRxBuffer();return 0;}void USART2_ClearRxBuffer(void) {memset(USART2_RX_BUF, 0, USART2_REC_LEN);USART2_RX_STA = 0;
}
#pragma import(__use_no_semihosting)struct __FILE { int handle; };
FILE __stdout;void _sys_exit(int x) { x = x; }
void _ttywrch(int ch) { ch = ch; }int __io_putchar(int ch) {USART_SendData(USART1, (uint8_t)ch);while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);return ch;
}int __io_getchar(FILE *f) {f = f;while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);return USART_ReceiveData(USART1);
}

?usart.h?

?

#ifndef __USART_H__
#define __USART_H__#include "stm32f10x.h"// 接收緩沖大小#define USART1_REC_LEN    256
#define USART2_REC_LEN    256
// 主程序訪問接收數據用的緩沖區
#define USART1_BUF_SIZE   256
#define USART2_BUF_SIZE   256
#define USART2_RX_BUFFER_SIZE 2048
// 接收緩沖和狀態變量
extern u8 USART1_RX_BUF[USART1_REC_LEN];
extern u16 USART1_RX_STA;extern u8 USART2_RX_BUF[USART2_REC_LEN];
extern u16 USART2_RX_STA;// 數據緩沖(供主程序讀取)
extern u8 usart1_buf[USART1_BUF_SIZE];
extern u8 usart2_buf[USART2_BUF_SIZE];// 初始化函數
void USART1_Init(u32 bound);
void USART2_Init(u32 bound);// 發送函數
void Usart_SendString(USART_TypeDef *USARTx, const char *str);
void Usart_Printf(USART_TypeDef *USARTx, const char *fmt, ...);// 接收處理函數
int USART1_WaitRecive(void);
void USART1_ClearRxBuffer(void);
int USART2_GetLine(char *buf, int max_len);int USART2_WaitRecive(char *res);
void USART2_ClearRxBuffer(void);#endif // __USART_H__

main.c?

//頭文件
#include "stm32f10x.h"
#include "GPIOLIKE51.h"
#include "usart.h"
#include "esp8266.h"
int main(void)
{    USART1_Init(9600);USART2_Init(115200);Usart_Printf(USART1, "Connect  WiFi\r\n");ESP8266_Init();if(is_wifi_connected==1){GetWeatherAPI();  //更新天氣}else{Usart_Printf(USART1,"No connect to");}
}

調試信息展示?

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

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

相關文章

CDN安全加速:HTTPS加密最佳配置方案

CDN安全加速的HTTPS加密最佳配置方案需從證書管理、協議優化、安全策略到性能調優進行全鏈路設計&#xff0c;以下是核心實施步驟與注意事項&#xff1a; ??一、證書配置與管理?? ??證書選擇與格式?? ??證書類型??&#xff1a;優先使用受信任CA機構頒發的DV/OV/EV證…

【前端】Twemoji(Twitter Emoji)

目錄 注意使用Vue / React 項目 驗證 Twemoji 的作用&#xff1a; Twemoji 會把你網頁/應用中的 Emoji 字符&#xff08;如 &#x1f604;&#xff09;自動替換為 Twitter 風格的圖片&#xff08;SVG/PNG&#xff09;&#xff1b; 它不依賴系統字體&#xff0c;因此在 Android、…

GCN圖神經網絡的光伏功率預測

一、GCN圖神經網絡的核心優勢 圖結構建模能力 GCN通過鄰接矩陣&#xff08;表示節點間關系&#xff09;和節點特征矩陣&#xff08;如氣象數據、歷史功率&#xff09;進行特征傳播&#xff0c;能夠有效捕捉光伏電站間的空間相關性。其核心公式為&#xff1a; H ( l 1 ) σ (…

按照狀態實現自定義排序的方法

方法一&#xff1a;使用 MyBatis-Plus 的 QueryWrapper 自定義排序 在查詢時動態構建排序規則&#xff0c;通過 CASE WHEN 語句實現優先級排序&#xff1a; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.springframework.stereotype.Ser…

【計算機網絡】IPv6和NAT網絡地址轉換

IPv6 IPv6協議使用由單/雙冒號分隔一組數字和字母&#xff0c;例如2001:0db8:85a3:0000:0000:8a2e:0370:7334&#xff0c;分成8段。IPv6 使用 128 位互聯網地址&#xff0c;有 2 128 2^{128} 2128個IP地址無狀態地址自動配置&#xff0c;主機可以通過接口標識和網絡前綴生成全…

【Redis】string

String 字符串 字符串類型是 Redis 最基礎的數據類型&#xff0c;關于字符串需要特別注意&#xff1a; 首先 Redis 中所有的鍵的類型都是字符串類型&#xff0c;而且其他幾種數據結構也都是在字符串的基礎上構建的。字符串類型的值實際可以是字符串&#xff0c;包含一般格式的…

基于ELK的分布式日志實時分析與可視化系統設計

目錄 一、ELK平臺介紹 1.ELK概述 2.Elasticsearch 3.Logstash 4.Kibana 二、部署ES群集 1.資源清單 2.基本配置 3.安裝Elasticsearch&#xff08;elk1上、elk2上、elk3上&#xff09; 4.安裝logstash&#xff08;elk1上&#xff09; 5.Filebeat 6.安裝Kibana&#x…

電機控制選 STM32 還是 DSP?技術選型背后的現實博弈

現在搞電機控制&#xff0c;圈里人都門兒清 —— 主流方案早就被 STM32 這些 Cortex-M 單片機給拿捏了。可要是撞上系統里的老甲方&#xff0c;技術認知還停留在諾基亞砸核桃的年代&#xff0c;非揪著 DSP 不放&#xff0c;咱也只能賠笑臉&#xff1a;“您老說的對&#xff0c;…

【案例分享】藍牙紅外線影音遙控鍵盤:瑞昱RTL8752CJF

藍牙紅外線影音遙控鍵盤 Remotec的無線控制鍵盤采用瑞昱藍牙RTL8752CJF解決方案&#xff0c;透過藍牙5.0與手機配對后&#xff0c;連線至 Remotec 紅外 code server 取得對應影音視覺設備的紅外 code后&#xff0c;即可控制多達2個以上的影音視覺設備&#xff0c;像是智能電視…

PostgreSQL如何更新和刪除表數據

這節說下怎樣更新和刪除表數據&#xff0c;當然認識命令了&#xff0c;可以問AI幫忙寫。 接上節先看下天氣表weather的數據&#xff0c;增加了杭州和西安的數據&#xff1a; 一.UPDATE更新命令 用UPDATE命令更新現有的行。 假設所有 杭州 5月12日的溫度低了兩度&#xff0c;用…

簡單三步FastAdmin 開源框架的安裝

簡單三步FastAdmin 開源框架的安裝 第一步&#xff1a;新建站點1&#xff0c;在寶塔面板中&#xff0c;創建一個新的站點&#xff0c;并填寫項目域名。 第二步&#xff1a;上傳框架1&#xff0c;框架下載2&#xff0c;上傳解壓縮 第三步&#xff1a;配置并安裝1&#xff0c;進入…

使用 pytesseract 構建一個簡單 OCR demo

簡介 pytesseract 庫是 Google Tesseract OCR &#xff08;光學字符識別&#xff09;引擎的一個 Python 封裝庫&#xff0c;使用廣泛且功能強大。 構建 使用 pytesseract 構建一個簡單 OCR demo。 步驟一&#xff1a;安裝必要的庫 您需要在您的 Python 環境中安裝 pytessera…

十三: 神經網絡的學習

這里所說的“學習”是指從訓練數據中自動獲取最優權重參數的過程。為了使神經網絡能進行學習&#xff0c;將導入損失函數這一指標。而學習的目的就是以該損失函數為基準&#xff0c;找出能使它的值達到最小的權重參數。為了找出盡可能小的損失函數的值&#xff0c;我們將介紹利…

AWS 創建VPC 并且添加權限控制

AWS 創建VPC 并且添加權限控制 以下是完整的從0到1在AWS中創建VPC并配置權限的步驟&#xff08;包含網絡配置、安全組權限和實例訪問&#xff09;&#xff1a; 1. 創建VPC 步驟&#xff1a; 登錄AWS控制臺 訪問 AWS VPC控制臺&#xff0c;點擊 創建VPC。 配置基礎信息 名稱…

ICASSP2025丨融合語音停頓信息與語言模型的阿爾茲海默病檢測

阿爾茲海默病&#xff08;Alzheimers Disease, AD&#xff09;是一種以認知能力下降和記憶喪失為特征的漸進性神經退行性疾病&#xff0c;及早發現對于其干預和治療至關重要。近期&#xff0c;清華大學語音與音頻技術實驗室&#xff08;SATLab&#xff09;提出了一種將停頓信息…

C# 導出word 插入公式問題

最近遇到了一個問題&#xff0c;下載一個文檔時需要下載word可編輯的公式。找了很久終于找到了一種解決辦法。下面是以C#代碼來實現在Word中插入公式的功能。 目錄 一、引入dll程序集文件1、通過 NuGet 引入dll&#xff08;2種方法&#xff09;的方法&#xff1a;2、手動添加d…

智匯云舟攜最新無人機2D地圖快速重建技術亮相廣西國際礦業展覽會

5月22至25日&#xff0c;廣西國際礦業展覽會&#xff08;以下簡稱 “礦業展”&#xff09;在南寧國際會展中心成功舉辦。智匯云舟與合作伙伴廣西空馭數智信息技術有限公司攜無人機 2D地圖快速重建技術&#xff0c;以及視頻孿生智慧礦山解決方案參會&#xff0c;為礦山行業數字化…

OpenSSL 簽名驗證詳解:PKCS7* p7、cafile 與 RSA 驗簽實現

OpenSSL 簽名驗證詳解&#xff1a;PKCS7* p7、cafile 與 RSA 驗簽實現 摘要 本文深入剖析 OpenSSL 中 PKCS7* p7 數據結構和 cafile 的作用及相互關系&#xff0c;詳細講解基于 OpenSSL 的 RSA 驗簽字符串的 C 語言實現&#xff0c;涵蓋簽名解析、證書加載、驗證流程及關鍵要…

9:OpenCV—模板匹配

模版匹配 1、模板匹配概念 模板匹配是一項在一副圖像中尋找與另一幅模板圖像最匹配&#xff08;相似&#xff09;部分的技術。模板匹配不是基于直方圖的&#xff0c;而是通過在輸入圖像上滑動圖像塊&#xff08;模板&#xff09;同時對比相似度&#xff0c;來對模板和輸入圖像…

Composer 常規操作說明與問題處理

目錄 一、 Composer 簡介&#xff0c;安裝二、全局配置三、項目配置&#xff08;composer.json&#xff09;3.1 composer.json 文件1. 基礎字段信息2. **require&#xff08;生產環境依賴&#xff09;**3. **require-dev&#xff08;開發環境依賴&#xff09;** 3.2 composer.l…