免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

深耕商務建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

單片機AT指令響應處理:從輪詢到DMA+狀態(tài)機的健壯通信方案

單片機AT指令響應處理:從輪詢到DMA+狀態(tài)機的健壯通信方案 1. 項目概述為什么單片機處理AT指令響應是個“技術活”搞過單片機串口通信的朋友尤其是做過GSM、GPS、藍牙、Wi-Fi這類模塊開發(fā)的肯定對AT指令不陌生。簡單來說AT指令就是咱們單片機主控通過串口給這些“智能”模塊發(fā)送的文本命令模塊執(zhí)行后再通過串口把結果文本返回給單片機。聽起來挺簡單不就是“發(fā)命令-等回復”嗎但實際做起來尤其是穩(wěn)定、高效地接收和處理那些不定長、可能帶延遲、還夾雜著回車換行符的響應數(shù)據(jù)絕對是嵌入式開發(fā)里一個經(jīng)典的“坑點”。新手最容易掉進的陷阱就是“死等”或“亂收”。比如用while循環(huán)一直查詢串口接收標志位直到收到特定字符如\n才退出。這在模塊響應及時、沒有干擾的實驗室環(huán)境下可能跑得好好的但一到實際應用模塊偶爾卡頓、數(shù)據(jù)包被干擾出現(xiàn)錯誤你的主程序就卡死在那兒了整個系統(tǒng)“心跳”停止。另一種常見做法是開一個大的緩沖區(qū)在串口接收中斷里無腦存數(shù)據(jù)然后在主循環(huán)里判斷是否接收完成。這方法稍好但如果響應數(shù)據(jù)很長比如GPRS模塊返回的網(wǎng)頁數(shù)據(jù)或者連續(xù)快速發(fā)送多條指令緩沖區(qū)很容易溢出或者數(shù)據(jù)幀粘連在一起導致解析徹底混亂。所以一個健壯的AT指令響應接收機制核心目標就三個不阻塞主程序、能處理不定長數(shù)據(jù)、能應對復雜通信場景。圍繞這三點衍生出了幾種主流的實現(xiàn)方法各有各的適用場景和“脾氣”。今天我就結合自己踩過的坑和項目經(jīng)驗把這幾種方法的里里外外、優(yōu)劣取舍以及關鍵實現(xiàn)細節(jié)給大家掰開揉碎了講清楚。2. 核心思路拆解從“輪詢等待”到“事件驅動”的進化在深入具體方法前我們得先建立正確的認知框架。處理AT指令響應本質上是一個異步串口數(shù)據(jù)流處理問題。數(shù)據(jù)什么時候來、來多長、分幾次來都是不確定的。我們的處理思路也隨著單片機資源和對實時性要求的不同而演進。2.1 基礎方案輪詢查詢法及其致命缺陷這是最直觀也最不推薦在正式項目中使用的方法。其偽代碼邏輯通常是這樣的void send_at_command_and_wait(char* cmd) { uart_send_string(cmd); // 發(fā)送AT指令 delay_ms(100); // “保守”地等待一下 char buffer[100]; int index 0; while(1) { if (uart_data_ready()) { // 查詢是否有數(shù)據(jù) buffer[index] uart_read_byte(); if (buffer[index-1] \n) { // 假設以換行符結束 buffer[index] \0; parse_response(buffer); // 解析響應 break; } } // 這里可能還會加一個超時退出機制但依然很被動 } }為什么說它有致命缺陷阻塞式等待while循環(huán)死死地盯住串口占用了CPU全部時間。在這期間單片機無法執(zhí)行任何其他任務如掃描按鍵、刷新顯示、處理傳感器數(shù)據(jù)系統(tǒng)實時性蕩然無存。脆弱的超時機制為了不死等你可能會加一個超時計數(shù)器。但超時時間設多長50ms500ms不同模塊、不同網(wǎng)絡狀態(tài)下的響應時間差異巨大。設短了容易誤判超時設長了依然阻塞很久。無法處理復雜響應很多AT指令的響應是多行的例如ATCSQ查詢信號強度返回CSQ: 24,0和OK兩行。簡單的\n判斷邏輯會錯誤地將第一行當作完整響應處理或者需要更復雜的多行狀態(tài)機讓輪詢代碼變得極其臃腫且難以維護。注意輪詢法僅適用于對實時性毫無要求、功能極其簡單的演示或測試程序。在任何需要處理多任務或對可靠性有要求的項目中都應避免將其作為核心通信方案。2.2 進階核心中斷驅動與狀態(tài)機思想要解決阻塞問題必須引入中斷。串口接收中斷UART RX Interrupt是絕大多數(shù)現(xiàn)代單片機如STM32、GD32、ESP32系列的標準配置。其核心思想是數(shù)據(jù)到達的“事件”來驅動處理流程而非主程序主動去“查詢”。一旦使能接收中斷每當串口收到一個字節(jié)硬件會自動跳轉到中斷服務函數(shù)。此時我們的核心任務變得清晰在中斷里以最快速度將收到的字節(jié)存入一個緩沖區(qū)通常是一個數(shù)組。在中斷里對接收到的字節(jié)進行初步分析和狀態(tài)標記例如判斷是否收到結束符\n。然后立即退出中斷主程序完全不受影響。主程序在空閑時例如在main函數(shù)的while(1)循環(huán)中去檢查是否有“接收完成”的標志如果有則處理緩沖區(qū)內的完整數(shù)據(jù)。這就引入了第二個關鍵思想狀態(tài)機State Machine。AT指令的響應過程可以看作一個狀態(tài)遷移過程空閑態(tài)等待指令發(fā)送或響應開始。接收態(tài)正在接收響應數(shù)據(jù)。完成態(tài)收到完整的結束標志如\n或\r\n。錯誤態(tài)接收超時或發(fā)生格式錯誤。狀態(tài)機讓我們的代碼邏輯變得清晰能夠優(yōu)雅地處理多行響應、錯誤重發(fā)等復雜情況。接下來要介紹的幾種高級方法都是“中斷驅動”和“狀態(tài)機思想”在不同維度上的具體實現(xiàn)和優(yōu)化。3. 方法一串口接收中斷 環(huán)形緩沖區(qū) 超時判定這是最經(jīng)典、最通用也是我個人在資源受限的8位/16位單片機如STM32F103、51單片機上最常用的方法。它平衡了實現(xiàn)復雜度、資源消耗和可靠性。3.1 核心組件解析1. 環(huán)形緩沖區(qū)Ring Buffer / Circular Buffer這是此方法的“心臟”。為什么不用普通數(shù)組因為串口中斷可能在任何時候發(fā)生而主程序處理數(shù)據(jù)的速度可能跟不上中斷接收的速度。環(huán)形緩沖區(qū)解決了數(shù)據(jù)覆蓋和順序處理的問題。結構通常是一個char數(shù)組加上兩個索引head和tail或一個索引加一個長度計數(shù)器。寫入在串口接收中斷中將數(shù)據(jù)寫入head指向的位置然后head加1取模緩沖區(qū)長度。讀取在主程序中從tail指向的位置讀取數(shù)據(jù)然后tail加1取模緩沖區(qū)長度。優(yōu)勢實現(xiàn)了生產(chǎn)者中斷-消費者主程序的解耦。即使主程序偶爾忙只要緩沖區(qū)沒滿數(shù)據(jù)就不會丟失。緩沖區(qū)滿了怎么辦這是一個設計權衡點可以丟棄最舊數(shù)據(jù)或設置錯誤標志通常應根據(jù)通信波特率和主程序最壞處理時間來設置足夠大的緩沖區(qū)。2. 超時判定機制這是判斷“一條響應是否接收完畢”的關鍵。AT指令響應雖然不定長但一條完整的響應數(shù)據(jù)幀內部字節(jié)之間的間隔是非常短的取決于波特率。當一幀數(shù)據(jù)發(fā)送完畢后串口線會保持空閑狀態(tài)。我們可以利用一個定時器來檢測這種“空閑”狀態(tài)。原理每收到一個字節(jié)就重置一個定時器計數(shù)器。如果超過一定時間例如10ms或20ms沒有再收到新字節(jié)就認為當前幀已經(jīng)接收完畢。實現(xiàn)可以在串口中斷里重置計數(shù)器在定時器中斷或主循環(huán)中檢查計數(shù)器是否超時。超時后設置“幀接收完成”標志。3.2 具體實現(xiàn)步驟與代碼要點假設我們使用STM32的HAL庫思路通用以STM32F103為例。步驟1定義數(shù)據(jù)結構#define UART_RX_BUF_SIZE 256 // 緩沖區(qū)大小根據(jù)最大響應長度調整 typedef struct { uint8_t buffer[UART_RX_BUF_SIZE]; volatile uint16_t head; // 寫入索引中斷中修改必須加volatile volatile uint16_t tail; // 讀取索引中斷中修改必須加volatile volatile uint8_t frame_ready_flag; // 幀接收完成標志 } uart_ring_buffer_t; uart_ring_buffer_t uart1_rx_buf {0};步驟2串口接收中斷服務函數(shù)// 在stm32f1xx_it.c中或你自己的中斷文件里 void USART1_IRQHandler(void) { // 判斷是否是接收中斷 if(__HAL_UART_GET_FLAG(huart1, UART_FLAG_RXNE) ! RESET) { uint8_t recv_char (uint8_t)(huart1.Instance-DR 0xFF); // 讀取數(shù)據(jù)清除標志 uint16_t next_head (uart1_rx_buf.head 1) % UART_RX_BUF_SIZE; // 判斷緩沖區(qū)是否已滿tail追上head if (next_head ! uart1_rx_buf.tail) { uart1_rx_buf.buffer[uart1_rx_buf.head] recv_char; uart1_rx_buf.head next_head; } else { // 緩沖區(qū)滿處理錯誤如丟棄或標志錯誤 // uart1_rx_buf.buffer_overrun 1; } // 重置空閑超時定時器假設使用一個基本定時器這里重置其計數(shù)器 __HAL_TIM_SET_COUNTER(htim3, 0); // 定時器3用于超時判定 HAL_TIM_Base_Start_IT(htim3); // 確保定時器在運行 } // ... 可能還有其他中斷標志處理 }步驟3定時器超時中斷// 定時器3中斷服務函數(shù) void TIM3_IRQHandler(void) { if (__HAL_TIM_GET_FLAG(htim3, TIM_FLAG_UPDATE) ! RESET) { __HAL_TIM_CLEAR_FLAG(htim3, TIM_FLAG_UPDATE); // 定時器更新說明自上次收到字符后已經(jīng)過了定時周期比如10ms HAL_TIM_Base_Stop_IT(htim3); // 停止定時器等待下次接收再開啟 uart1_rx_buf.frame_ready_flag 1; // 設置幀完成標志 } }步驟4主程序處理int main(void) { // 初始化硬件、串口、定時器等... HAL_UART_Receive_IT(huart1, dummy, 1); // 啟動串口接收中斷HAL庫方式 while (1) { // 其他任務... // 檢查是否有完整的AT響應幀待處理 if (uart1_rx_buf.frame_ready_flag) { uart1_rx_buf.frame_ready_flag 0; process_at_response(); // 處理響應 } // 更多其他任務... } } void process_at_response(void) { char line_buffer[128]; int index 0; // 從環(huán)形緩沖區(qū)中讀取數(shù)據(jù)直到遇到換行符或緩沖區(qū)空 while (uart1_rx_buf.tail ! uart1_rx_buf.head index sizeof(line_buffer)-1) { char c uart1_rx_buf.buffer[uart1_rx_buf.tail]; uart1_rx_buf.tail (uart1_rx_buf.tail 1) % UART_RX_BUF_SIZE; line_buffer[index] c; if (c \n) { // 假設以\n作為行結束 line_buffer[index] \0; // 解析這一行響應例如判斷是OK, ERROR, 還是CMD格式的數(shù)據(jù) parse_at_line(line_buffer); index 0; // 重置準備讀取下一行 } } // 注意這里可能一幀里有多個\n所以用while循環(huán)逐行處理 }實操心得超時時間的選擇是關鍵。太短如3ms在高波特率下可能一幀數(shù)據(jù)還沒發(fā)完就被誤判為結束太長如100ms則會降低系統(tǒng)響應速度。對于常見的9600~115200波特率的AT模塊15ms到30ms是一個比較安全的范圍。最好查閱模塊手冊看其字節(jié)間最大間隔承諾。4. 方法二串口空閑中斷IDLE Interrupt接收不定長數(shù)據(jù)如果你的單片機是STM32F0/F1/F4/H7等系列或者GD32等兼容產(chǎn)品那么恭喜你你有一個更強大的硬件武器串口空閑中斷。它可以完美替代“定時器超時判定”更精準、更高效地檢測一幀數(shù)據(jù)的結束。4.1 什么是空閑中斷串口在檢測到總線上超過一個字節(jié)時間的空閑狀態(tài)即沒有接收到任何數(shù)據(jù)后會觸發(fā)一個空閑中斷標志。注意這個“一個字節(jié)時間”是根據(jù)當前波特率計算出來的是硬件自動檢測的比軟件定時器更精確、更及時。優(yōu)勢對比更精準硬件檢測與程序運行狀態(tài)無關避免了因為主程序繁忙導致定時器中斷響應延遲從而誤判超時的問題。更高效省去了一個定時器硬件資源也簡化了軟件邏輯不需要在串口中斷里頻繁啟停定時器。更及時一旦總線空閑立即觸發(fā)中斷響應延遲極低。4.2 基于空閑中斷的實現(xiàn)流程以STM32 HAL庫為例步驟1串口與空閑中斷初始化// 在串口初始化函數(shù)后開啟接收和空閑中斷 HAL_UART_Receive_DMA(huart1, rx_dma_buffer, RX_DMA_BUFFER_SIZE); // 使用DMA接收效率最高 // 或者使用中斷接收HAL_UART_Receive_IT(huart1, temp, 1); // 關鍵使能空閑中斷 __HAL_UART_ENABLE_IT(huart1, UART_IT_IDLE);步驟2修改串口中斷服務函數(shù)void USART1_IRQHandler(void) { /* 處理空閑中斷 */ if(__HAL_UART_GET_FLAG(huart1, UART_FLAG_IDLE) ! RESET) { __HAL_UART_CLEAR_IDLEFLAG(huart1); // 清除空閑中斷標志非常重要 // 數(shù)據(jù)接收完成處理數(shù)據(jù) // 如果是DMA方式可以通過 __HAL_DMA_GET_COUNTER 計算接收到的數(shù)據(jù)長度 // 如果是中斷方式需要結合自己的緩沖區(qū)索引 uart_rx_idle_callback(); // 調用空閑回調函數(shù) } // 調用HAL庫的通用中斷處理如果用了HAL_UART_Receive_IT HAL_UART_IRQHandler(huart1); }步驟3空閑回調函數(shù)中處理數(shù)據(jù)// 假設使用DMA接收 #define RX_DMA_BUFFER_SIZE 512 uint8_t rx_dma_buffer[RX_DMA_BUFFER_SIZE]; volatile uint16_t rx_len 0; void uart_rx_idle_callback(void) { // 停止DMA傳輸防止處理過程中被修改 HAL_UART_DMAStop(huart1); // 計算本次接收到的數(shù)據(jù)長度 // DMA_BUFFER_SIZE - 剩余未傳輸?shù)臄?shù)據(jù)量 已傳輸?shù)臄?shù)據(jù)量 rx_len RX_DMA_BUFFER_SIZE - __HAL_DMA_GET_COUNTER(huart1.hdmarx); if (rx_len 0) { // 此時rx_dma_buffer[0] 到 rx_dma_buffer[rx_len-1] 就是完整的一幀數(shù)據(jù) process_received_frame(rx_dma_buffer, rx_len); } // 重新設置DMA傳輸準備接收下一幀 // 需要先重置DMA的CNDTR寄存器為緩沖區(qū)長度 __HAL_DMA_SET_COUNTER(huart1.hdmarx, RX_DMA_BUFFER_SIZE); // 重新啟動DMA和UART接收 HAL_UART_Receive_DMA(huart1, rx_dma_buffer, RX_DMA_BUFFER_SIZE); }關鍵細節(jié)與避坑指南清除空閑標志__HAL_UART_CLEAR_IDLEFLAG(huart1)這一步絕對不能少否則會連續(xù)進入空閑中斷。DMA與空閑中斷的黃金組合這是處理高速、大數(shù)據(jù)量串口通信的“王牌方案”。DMA負責將數(shù)據(jù)自動搬運到緩沖區(qū)完全不消耗CPU空閑中斷負責通知CPU“這一批數(shù)據(jù)搬完了”。CPU只在幀結束時被喚醒處理效率極高。緩沖區(qū)管理對于DMA空閑中斷模式通常使用雙緩沖區(qū)Ping-Pong Buffer或線性緩沖區(qū)偏移計算來避免處理數(shù)據(jù)時被新數(shù)據(jù)覆蓋。上面的例子是單緩沖區(qū)在process_received_frame函數(shù)必須盡快處理完數(shù)據(jù)否則下一幀數(shù)據(jù)會覆蓋它。更穩(wěn)健的做法是在空閑中斷回調中將數(shù)據(jù)快速拷貝到另一個應用層緩沖區(qū)然后立即重啟DMA。數(shù)據(jù)粘包處理空閑中斷檢測的是總線空閑。如果主機快速連續(xù)發(fā)送兩幀AT指令而模塊也快速連續(xù)回復中間的空閑時間可能短于一個字節(jié)時間導致兩幀響應被合并成一幀接收。解決方法在應用層協(xié)議上確保每幀數(shù)據(jù)有明確的、唯一的幀頭幀尾或長度信息或者在軟件上根據(jù)AT指令響應格式通常以\r\n結尾來分割。5. 方法三有限狀態(tài)機FSM解析AT響應流前面兩種方法解決了“如何完整地收完一幀數(shù)據(jù)”的問題。接下來我們要解決“如何理解這一幀數(shù)據(jù)”的問題。AT指令的響應不是簡單的“OK”或“ERROR”它可能包含直接結果OK,ERROR,NO CARRIER等。帶信息的響應CSQ: 24,0信號強度,CCID: xxxxSIM卡號等格式為命令: 參數(shù)。主動上報模塊主動發(fā)送的信息如來電顯示RING, 收到短信CMTI: SM,1等。多行響應例如查詢短信內容ATCMGR1可能會返回多行信息。面對這種復雜的、格式化的文本流有限狀態(tài)機FSM是最優(yōu)雅的解決方案。它將解析過程分解成幾個明確的狀態(tài)每個狀態(tài)根據(jù)當前輸入的字符決定下一個狀態(tài)和動作。5.1 設計AT響應解析狀態(tài)機我們可以設計一個簡單的狀態(tài)機專注于解析一行響應以\r\n結尾。狀態(tài)定義STATE_IDLE空閑狀態(tài)等待響應開始。STATE_PLUS收到了字符可能是一條帶前綴的響應如CSQ。STATE_TEXT正在接收之后的文本命令字如CSQ。STATE_COLON收到了:字符表示后面是參數(shù)。STATE_PARAM正在接收參數(shù)。STATE_CR收到了\r一行即將結束。STATE_LF收到了\n一行結束進行最終處理。狀態(tài)遷移圖文字描述從STATE_IDLE開始。收到- 進入STATE_PLUS并開始記錄命令字。在STATE_PLUS后收到字母/數(shù)字 - 進入STATE_TEXT繼續(xù)記錄命令字。在STATE_TEXT收到:- 進入STATE_COLON命令字記錄完成準備記錄參數(shù)。在STATE_COLON后收到非\r字符 - 進入STATE_PARAM開始記錄參數(shù)。在STATE_PARAM或STATE_TEXT對于無參數(shù)響應如CREG: 0,1收到\r- 進入STATE_CR。在STATE_CR收到\n- 進入STATE_LF一行解析完成根據(jù)記錄的命令字和參數(shù)執(zhí)行相應操作如更新信號強度變量然后狀態(tài)重置為STATE_IDLE。在任何狀態(tài)收到\r且之前沒有即普通響應如OK - 可以直接遷移到STATE_CR然后STATE_LF按普通響應處理。5.2 代碼實現(xiàn)示例這個狀態(tài)機可以實現(xiàn)在字符接收中斷中也可以實現(xiàn)在主循環(huán)處理完整幀數(shù)據(jù)時。這里展示在字符中斷中實現(xiàn)的思路它更實時。typedef enum { AT_IDLE, AT_PLUS, AT_TEXT, AT_COLON, AT_PARAM, AT_CR, AT_LF } at_parser_state_t; typedef struct { at_parser_state_t state; char cmd[16]; // 存儲命令字如CSQ char param[64]; // 存儲參數(shù) uint8_t cmd_idx; uint8_t param_idx; } at_parser_t; at_parser_t at_parser {AT_IDLE}; void uart_rx_byte_handler(uint8_t ch) { // 在串口中斷中調用此函數(shù) switch (at_parser.state) { case AT_IDLE: if (ch ) { at_parser.state AT_PLUS; at_parser.cmd_idx 0; at_parser.cmd[0] \0; } else if (ch \r) { at_parser.state AT_CR; } // 其他字符如O,E等可能是普通響應的開始可以擴展狀態(tài)機 break; case AT_PLUS: if (isalnum(ch)) { // 是字母或數(shù)字 at_parser.cmd[at_parser.cmd_idx] ch; at_parser.state AT_TEXT; } else { // 非預期字符重置狀態(tài)錯誤處理 at_parser.state AT_IDLE; } break; case AT_TEXT: if (ch :) { at_parser.cmd[at_parser.cmd_idx] \0; // 命令字結束 at_parser.param_idx 0; at_parser.param[0] \0; at_parser.state AT_COLON; } else if (ch \r) { at_parser.cmd[at_parser.cmd_idx] \0; // 沒有參數(shù)的命令行例如收到 CREG: 0,1 后下一行是空行 // 這里需要根據(jù)具體命令處理可以先存儲命令等遇到\r\n再處理 at_parser.state AT_CR; } else if (isalnum(ch)) { if (at_parser.cmd_idx sizeof(at_parser.cmd)-1) { at_parser.cmd[at_parser.cmd_idx] ch; } } else { // 其他字符可能是空格等忽略或作為狀態(tài)機錯誤 } break; case AT_COLON: // 跳過可能存在的空格 if (ch ) { break; } at_parser.state AT_PARAM; // 注意這里沒有break直接落入AT_PARAM狀態(tài)處理第一個參數(shù)字符 case AT_PARAM: if (ch \r) { at_parser.param[at_parser.param_idx] \0; at_parser.state AT_CR; } else { if (at_parser.param_idx sizeof(at_parser.param)-1) { at_parser.param[at_parser.param_idx] ch; } } break; case AT_CR: if (ch \n) { at_parser.state AT_LF; // 一行完整解析完成在這里進行最終處理 handle_at_line_complete(at_parser); // 重置解析器準備下一行 at_parser.state AT_IDLE; at_parser.cmd_idx 0; at_parser.param_idx 0; } else { // 預期是\n收到其他字符協(xié)議錯誤重置 at_parser.state AT_IDLE; } break; case AT_LF: // 正常情況下不應直接進入此狀態(tài)重置 at_parser.state AT_IDLE; break; } } void handle_at_line_complete(at_parser_t *parser) { if (parser-cmd[0] ! \0) { // 這是一條 CMD: PARAM 格式的響應 printf(CMD: %s, PARAM: %s\n, parser-cmd, parser-param); if (strcmp(parser-cmd, CSQ) 0) { // 解析參數(shù)例如24,0 int rssi, ber; sscanf(parser-param, %d,%d, rssi, ber); g_signal_strength rssi; } // 可以添加更多命令處理... } else { // 這可能是一條普通響應如OKERROR。 // 我們需要結合之前的上下文比如最后發(fā)送的AT命令來判斷。 // 通常需要另一個狀態(tài)機來管理AT命令會話。 } }實操心得狀態(tài)機解析器的強大之處在于其可擴展性。當需要支持新的AT響應格式時通常只需要增加或修改幾個狀態(tài)和遷移條件而不用重寫整個解析邏輯。例如要支持帶雙引號的字符串參數(shù)如CMGR: REC READ,8613800100500,,22/10/05,16:28:1132只需要在AT_PARAM狀態(tài)中增加對引號的處理子狀態(tài)即可。這使得代碼非常易于維護和調試。6. 方法四DMA雙緩沖區(qū) 高級解析器應對高速數(shù)據(jù)流對于STM32H7、GD32H7等高性能單片機或者需要以高波特率如921600與模塊通信的場景我們需要追求極致的效率和穩(wěn)定性。這時可以將DMA雙緩沖區(qū)或循環(huán)DMA、串口空閑中斷和一個強大的、與協(xié)議無關的解析器結合起來。6.1 DMA雙緩沖區(qū)Ping-Pong Buffer機制原理是配置DMA在填充完緩沖區(qū)A后自動切換到緩沖區(qū)B繼續(xù)接收同時觸發(fā)一個中斷如DMA半傳輸完成中斷和傳輸完成中斷通知CPU處理已滿的緩沖區(qū)。這樣CPU處理緩沖區(qū)A的數(shù)據(jù)時DMA正在向緩沖區(qū)B寫入新數(shù)據(jù)實現(xiàn)了無縫銜接徹底避免了數(shù)據(jù)覆蓋風險。HAL庫配置示例使用循環(huán)DMA模式// 定義兩個緩沖區(qū) uint8_t dma_buf_a[256]; uint8_t dma_buf_b[256]; volatile uint8_t *current_active_buf dma_buf_a; volatile uint32_t last_ndtr 256; // 記錄上次的DMA計數(shù)器值 // 啟動DMA接收循環(huán)模式 HAL_UART_Receive_DMA(huart1, dma_buf_a, 256); // 實際上HAL庫此函數(shù)在循環(huán)模式下會一直運行 // 在空閑中斷中 void uart_idle_callback(void) { uint32_t current_ndtr __HAL_DMA_GET_COUNTER(huart1.hdmarx); uint32_t received_len 256 - current_ndtr; // 本次空閑前接收到的數(shù)據(jù)長度 // 計算本次接收的數(shù)據(jù)在緩沖區(qū)中的位置 // 由于是循環(huán)DMA需要結合上次的位置計算 static uint32_t last_pos 0; uint32_t current_pos 256 - current_ndtr; if(current_pos last_pos) { // 發(fā)生了回卷數(shù)據(jù)分布在緩沖區(qū)末尾和開頭 process_data(dma_buf_a[last_pos], 256 - last_pos); // 處理末尾一段 process_data(dma_buf_a[0], current_pos); // 處理開頭一段 } else { // 數(shù)據(jù)是連續(xù)的一段 process_data(dma_buf_a[last_pos], current_pos - last_pos); } last_pos current_pos; }注意直接操作循環(huán)DMA的緩沖區(qū)索引需要非常小心計算容易出錯。更常用的方法是使用DMA在普通模式下的雙緩沖區(qū)并通過HAL_UARTEx_ReceiveToIdle_DMA這類高級函數(shù)如果HAL庫版本支持它能直接返回空閑中斷時接收到的數(shù)據(jù)長度和指針大大簡化了編程。6.2 結合解析器庫如AT Parser對于復雜的AT通信如HTTP、MQTT over AT手動寫狀態(tài)機可能仍然繁瑣??梢钥紤]使用更抽象的AT Parser庫如ARM Mbed OS中的ATParser類或開源項目libat。這類庫通常提供如下接口at_parser_t parser; at_init(parser, send_func, recv_func); // 初始化注冊發(fā)送和底層接收函數(shù) // 發(fā)送命令并等待響應 int rssi; if (at_send_command(parser, ATCSQ, CSQ: %d,%*d, rssi) AT_OK) { printf(Signal strength: %d\n, rssi); } // 或者解析主動上報 at_set_urc_handler(parser, CMTI, handle_new_sms); // 設置“CMTI”上報的回調函數(shù)它的內部封裝了緩沖區(qū)管理、超時重試、響應解析基于sscanf風格的格式匹配和URCUnsolicited Result Code主動上報處理。使用這樣的庫開發(fā)者可以更專注于業(yè)務邏輯而不是通信細節(jié)。7. 常見問題排查與實戰(zhàn)技巧實錄在實際項目中無論采用哪種方法都會遇到一些共性問題。這里把我踩過的坑和解決方案匯總一下。7.1 數(shù)據(jù)接收不完整或隨機出錯問題現(xiàn)象有時能收到完整響應有時少幾個字節(jié)有時數(shù)據(jù)亂碼。排查思路檢查波特率這是最常見的原因。確保單片機與模塊的波特率、數(shù)據(jù)位、停止位、校驗位完全一致。哪怕都是“9600”也要檢查晶振精度是否導致實際波特率有偏差??梢杂眠壿嫹治鰞x抓取波形測量位時間。檢查中斷優(yōu)先級如果串口接收中斷被更高優(yōu)先級的中斷長時間阻塞可能導致數(shù)據(jù)丟失。確保串口中斷有足夠高的優(yōu)先級或者確保高優(yōu)先級中斷的執(zhí)行時間非常短。檢查緩沖區(qū)溢出在中斷接收法中如果主程序處理速度太慢緩沖區(qū)寫滿后新數(shù)據(jù)會丟失。增加緩沖區(qū)大小或者優(yōu)化主程序處理邏輯。在DMA法中檢查是否在數(shù)據(jù)被處理前DMA就寫滿了緩沖區(qū)并覆蓋了舊數(shù)據(jù)。檢查電源與地線通信線路較長或環(huán)境干擾大時電源噪聲可能導致數(shù)據(jù)錯誤。確保電源干凈穩(wěn)定串口線路尤其是GND連接良好必要時在TX/RX線上串聯(lián)小電阻如22Ω-100Ω并加對地電容進行濾波。7.2 空閑中斷不觸發(fā)或頻繁觸發(fā)問題現(xiàn)象使用了空閑中斷但數(shù)據(jù)收完后標志沒起來或者莫名其妙一直進空閑中斷。解決方案確認硬件支持不是所有STM32系列的所有串口都支持空閑中斷查閱芯片參考手冊。正確清除標志必須在空閑中斷服務函數(shù)中先讀取SR寄存器通過__HAL_UART_GET_FLAG再讀取DR寄存器通過__HAL_UART_CLEAR_IDLEFLAG或手動操作來清除空閑標志。順序錯了可能導致標志無法清除。注意電平空閑空閑中斷檢測的是“總線空閑”即高電平狀態(tài)持續(xù)一個字節(jié)時間。確保你的模塊在發(fā)送完數(shù)據(jù)后TX線確實回到了高電平空閑態(tài)。有些模塊設計不好發(fā)送完最后一個字節(jié)的停止位后電平不拉高可能導致空閑中斷無法觸發(fā)。7.3 AT指令發(fā)送后收不到任何響應問題現(xiàn)象發(fā)送AT\r\n后沒有任何數(shù)據(jù)返回。排查步驟環(huán)回測試將單片機的TX和RX短接發(fā)送數(shù)據(jù)看是否能收到自己發(fā)出的內容。這可以排除單片機串口本身的問題。檢查模塊供電與使能確保模塊電源電壓正確且電流充足。檢查模塊的使能引腳如果有是否拉到了正確電平。檢查命令格式AT指令通常以\r\n回車換行結束。有些模塊只需要\r有些需要\r\n。務必查閱模塊的最新版數(shù)據(jù)手冊??梢杂肁T\r、AT\n、AT\r\n分別嘗試。監(jiān)聽通信使用USB轉TTL工具連接到模塊的串口用串口助手軟件如Putty、SecureCRT直接發(fā)送AT指令看模塊是否有響應。這能確定是模塊問題還是單片機程序問題。7.4 多線程/RTOS環(huán)境下的共享資源沖突問題場景在FreeRTOS、RT-Thread等系統(tǒng)中一個任務在發(fā)送AT指令另一個任務或中斷在解析響應它們共享解析狀態(tài)機或緩沖區(qū)。解決方案關中斷保護對于簡單的全局變量如接收完成標志在任務中操作前可以先taskENTER_CRITICAL()FreeRTOS或關全局中斷。使用信號量/隊列這是更優(yōu)雅的方式。將接收中斷服務函數(shù)或DMA空閑回調作為“生產(chǎn)者”將接收到的原始數(shù)據(jù)幀通過隊列Queue發(fā)送給一個專用的“AT解析任務”。解析任務作為“消費者”從隊列中取出數(shù)據(jù)幀進行解析。這樣解析狀態(tài)機只在一個任務中運行徹底避免了沖突。使用互斥鎖如果解析器本身是共享資源在訪問前獲取互斥鎖Mutex。7.5 提高通信可靠性的小技巧指令重發(fā)與超時發(fā)送一條AT指令后啟動一個重發(fā)定時器。如果在規(guī)定時間內如3秒沒有收到預期響應如OK則重發(fā)指令。重發(fā)次數(shù)如3次達到后判定通信失敗進行錯誤處理如復位模塊。響應預期匹配不要只等待OK。為每條指令定義預期的響應前綴。例如發(fā)送ATCSQ后應該等待CSQ:然后再是OK。解析時先匹配前綴確認是當前指令的響應而不是其他指令的殘留或主動上報。清空接收緩沖區(qū)在發(fā)送一條新指令前先讀取并清空串口接收緩沖區(qū)FIFO和軟件緩沖區(qū)避免舊數(shù)據(jù)干擾新響應的解析。添加通信日志在開發(fā)階段將單片機收發(fā)到的所有字節(jié)以16進制或字符形式打印到另一個串口或存儲到SD卡。當通信出錯時這些日志是無可替代的“黑匣子”能幫你精準定位是發(fā)送的問題、接收的問題還是模塊響應異常的問題。選擇哪種方法沒有絕對的最好只有最合適。對于簡單的51單片機項目“中斷環(huán)形緩沖區(qū)超時”足以應對。對于資源豐富的STM32項目追求高性能和簡潔“DMA空閑中斷”是首選。如果AT指令交互邏輯非常復雜引入一個狀態(tài)機解析器會讓你的代碼層次清晰后期維護輕松。而如果是在RTOS中開發(fā)復雜應用“DMA隊列解析任務”的架構能提供最好的穩(wěn)定性和可維護性。理解每種方法的原理和優(yōu)劣根據(jù)你的項目需求和手頭芯片的資源做出最合適的選擇這才是資深工程師的價值所在。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
婷婷五月影院| 九九99热久久精品66中文字幕| 九九热婷婷| 四色永久成人网站| 五月丁香中文字幕| 日日操,天天操| 97干欧美| 综合激情在线| 在线资源av-超碰中文在线-成人AV| 欧美精品999| 久久天天| 思思热久热| 激情五月天在线| 九色91国产| 日日夜夜亚洲一区| 激情五月黄色| www99精品日韩| www.狠狠| 丁香六月婷婷综合麻豆| 第二色AⅤ| 九色自拍| 色噜噜婷婷| 超碰在线播放免费观看| 激情婷婷五月社区| 婷婷综合天堂| 婷婷五月天六点丁香五月| 99热超碰人| 无码操B| 五月婷婷天天| 九九这里有精品| 91大屁股| 99色 色| 激情综合五月激情XXXX| 五月激情丁香久久综合网| 无码橾| 日韩色五月| 色婷婷丁香五月综合| 第2色五月婷| 成人丁香五月| 国产激情综合五月| 五月天开心成人网| www.sezonghe| 99热这里只有精品2| 深爱开心激情网| 婷婷丁香亚洲色综合91| 综合色五月| 海外网站专业操老外| 新激情婷婷| www.婷婷| 99婷婷综合| 九九热9| 婷婷综合中文| 激情五月份婷婷| 五月丁香中文婷婷中文| 五月天狠狠色| 中文字幕无线久必| 丁香婷婷五月综合欧美另类| 亚洲视频无| 婷婷情色五月天| 最新国产AV| 97超级碰人人| 91无码高清| 日本人人草草| 激情五月天在线观看婷婷| 91超碰在线播放| 亚洲中文字幕av| 天天插天天狠| 影音先锋 婷婷| 婷婷久久六月费| 色六月天| 91婷婷丁香五月| 久久婷婷色| 超碰在线人妻| 婷婷丁香五月社区亚洲| 伊人www22综合色| 超碰在线成人| 久久丁香婷婷五月| 婷婷精品| 91色情播放| 亚洲va在线∨a天堂va欧美va| 色婷婷狠狠18| 五月丁香色色网| 色色色婷婷五月天| 成人做爰高潮A片免费视频| 人妻体体内射精一区二区| 香蕉97碰碰碰欧美| 激情熟女网| AV动漫不卡无码免费| …亚洲黄色在线播放日韩、av中文a…| 天堂色色色| 久久婷婷五月综合精品蜜芽| 婷婷九月激情| 婷婷 色 丁香 夜| 精品在线网站| 大香蕉综合视频在线| 97操碰在线97| 99ER热精品视频| 色.五月综合网| 色色综合网。| 日日噜人人人做人| 久久激情五月网| 色XX综合网| 欧美日本黄色| 婷婷五月激情欧美大胆视频| 99日本黄站| 五月丁香亭亭成人电影| 色婷婷成人| 五月婷婷性爱| 九九re视频在线视频| 丁香婷婷五月六月久久| 激情网综合| 婷婷婷久久久| 丁香五月停停av| 91超级碰在线视频| 天天免费日日夜夜夜夜| 99热这里只有精品23| 97色色综合| 色香欲综合| 色www99| 99久久精品国产色欲| 538午夜激情| 日韩AV色色色| 婷色五月| 9操在线| 国产精品-第3页-91JQ就要激情网91JQ5.JQJQ926.XYZ | 婷婷婷狠狠| www.99精品视频| 丁香五月 综合| 亚州色色色| 激情五月婷婷五月| 色九月婷婷丁香| 插插五月天| 激情综合国产| 99热婷婷| 9月色婷婷| 丁香五月综合在线| 激情综合五月天| 久久九九九九| 狠狠操狠狠干综合| 丰满少妇猛烈A片免费看观看| 97极品在线| 日日操夜夜操狠狠操| 99热这里全都是精品| 色噜噜狠狠色综无码久久合欧美| 丁香五月天AV在线| 99精品久久久| 看全色黄大色大片| 青青热视频| 天天日天天干天天天| 免费黄色片子| 色狠狠狠干| 超碰99资源站| 热久久色| 99综合网| 99久久久久久www| 99色热视频| 欧美激情五月天| 日韩 中文 欧美| 丁香婷婷色五月| 狠狠精品干练久久久无码中文字幕| 久久久久亚洲AV无码网影音先锋| 99A片| 一级操逼内射在线视频| 欧美三级A做爰在线观看| 成人做爰A片免费看网站找不到了| 久色大| 激情99| 亚洲婷婷视频| 日韩在线99| 丁香五月天亚洲综合| 狠狠色狠狠色综合日日91| 欧美性爱五月天| 国产精品电影网| 天天舔天天爽| 五月婷婷色播| 激情久久久| 色噜噜夜夜夜综合网| 色播播五月| 色9999综合久久| 婷婷激情五月天视频在线| 成人.在线日韩| 99热视| 丁香六月婷婷综合在线| 开心五月婷婷伊人| 丁香五月婷婷在线| 美欧日韩国产成人在战| 国产精品大香蕉| 91狠狠色| 91狠狠色丁香婷婷综合久久精品| 日本五月丁香| 色99色| site:esunnet.com| 99热综合在线观看| 97热在线精品| 337p大胆噜噜噜噜噜91Av| 婷婷色色网站| 日韩AAAAA| 九九婷婷综合| 欧美三级巜人妻互换| 第一区久久网站| 亚洲啪啪精品| 国产99久久久国产精品免费看| 丁香伊人激情| 婷婷中文无码| 九九综合网| 婷婷天堂综合| 夜夜操天天爽| 日韩好吊操| 国产亚洲成人综合| 欧美肉大捧一进一出免费视频| 丁香五月婷婷天| 亚洲操B视频| 色综合婷婷| 成人视频婷婷| 乱女乱妇熟女熟妇综合网站| 97五月婷婷| 97色色视频| 天天日夜夜曹| 91人妻视频| 五月丁香激情综合啪啪| 香蕉AV777XXX色综合一区| 天天草天天摸| 蜜臀av在线成人电影| 色五月婷婷在线| 中文字幕乱码亚洲精品一区| 特黄三级片| www,五月丁,com| www、丁香五月天| 99re在线播放| 色欲久久综合| 五月天桃色深爱网| 色色狼人综合| 男人天堂99| 五月丁香色狠狠干大屄| 色婷婷丁香五月| 亚洲激情区| 色色综合激情| www.金莲av| 天天插天天插| 狠狠五月天婷婷激情网。| 成人在线综合| 久久综合五月情| 七七九色| 婷婷五月激情视频| 久久激情综合| 九九热最新| 九一99| 色青青五月| 久久综合五月天| 成人色图情色成人网 www.5b5b5bcom 五月天 | 国产成人网| 色婷婷a v| www.99热. com这里只有精品| 久久久久久久五月婷婷六月丁香综合,开心激情综合网 | 99综合网| 丁香六月在线| 五月婷在线观看| 久久婷五月综合| www,超碰| 欧美久久婷婷| 九九视频这里只有精品| 亚洲热综合| 欧美日韩成人一区二区| 丁香五月综合婷婷| 涩五月婷婷| 亚洲黄色影视| 综合婷婷| 激情 久久 婷婷| 怎么样可以看免费的一级av| 婷婷色综合网日韩国产| 强伦轩人妻一区二区电影| 狠狠色狠狠爱| 91狠狠综合久久| 九九色中文| 午夜成人天堂久久无码日韩久久| 99啪| 天天干天天干天天干天天干天天| 国产午夜精品久久久观看| 思思久热6| 婷婷激情六月天视频| 韩国久久少妇视屏| 极品人妻VideOssS人妻| 啊V视频在线观看| 婷婷五月天Av| CHINESE熟女老女人HD视频| 丁香五月婷婷基地| 影音先锋AV男人站| 亚洲精品国产setv| 色五月亚洲五月天| 国产美女视频久| 激情视频综合| 丁香网站| 婷婷激情五月天激情小说| 9 9热这里有精品| 91无码高清| 最新久久网址| 五月天性色| 99日这里只有精品| 九九热欧美| 天天插天天插| www.99热这里精品| 激情五月第四色| 婷婷草| 97AV在线视频| 97操资源婷婷| AA丁香综合激情| 97色伦另类图片小说视频 | 亚州精品成人片| 9久国产| 久久色五月天| 91成人性爱视频| 色婷婷亚洲精品天天综| 日本97人人| WWW,五月| 综合色综合| 日韩综合天堂| 青青草婷婷五月天| 97人人干人人操| 欧美丁香六月在线观看视频| 夜色综合网| 超碰国产在线| 婷婷丁香激情综合色情| 美英法精品无码免费视频| 九九精品自拍| 玖玖热99| AV国产有码| 久久伊人婷婷| 成人短视频免费| 激情 五月 婷婷 丁香| 久久思思热视频| 99久.| 99re资源在线视频导航| 99热精品少| 蜜桃人妻无码AV天堂三区| 五月天色色网站| 伊人激情网| 婷婷五月天激情四射五月天激情| 999激情视频| 熟女强人妻一区二区三区四区无| 精品五月视频婷婷在线观看| 激情九色| Caop在线| 人妻操逼视频| 亚洲色亚洲精品| 婷婷射丁香| 最新国产AV| 夜夜躁狠狠| 97人凄人人操人人爽| 狠狠婷婷日韩| 99久久99热这里只有精品| 婷婷精品在线| 99在线视频播放| 婷婷狠狠色| 色色五月婷婷网| 丁香五月天偷拍| 超碰成人av| 玖玖@三月天天丁香婷婷| 色五月婷婷丁香婷婷| www.婷婷五月天| 无码人妻激情| 国产无套精品一区二区| 婷婷激情中文综合| 99热久| 色综合久久88色综合天天99| 婷婷在线综合| 色五月综合激情| 免费观看大片视频 丁香婷婷 六月欧美| 琪琪色综合网站| AV 3P| 五月天激情网站| 亚洲色情久久| 婷婷99狠狠躁天天躁| 97操操| 在线中文av| 五月天综合久久| 丁香五月婷婷AV| 色情五月天。| 熟女人妻一区二区三区免费看 | 伊人久久综合| 久久精典| 婷婷激情五月天7| 婷婷五月天av| 337p午夜影院| 狠狠爱丁香婷| 99啪啪网| 人人色婷婷五月天| 狠狠爱婷婷五月天| 五月天激情久久| 婷婷午夜激情| 国产又黄又爽又色的免费| 69五月天视频| 色色五月天网站| 棕合影院色色| 国产精品18久久久| 噜噜噜久久亚洲精品国产品91| 97成人视频| 日韩精品一区二区亚洲AV观看 | 亚洲成人中文字幕| 色噜噜97视频在线观看| 热这里| 成人无码精品1区2区3区免费看| 成人视频在线免费播放| 成年人看Va免费视频| 最近中文字幕大全免费版在线 | 丁香五月成人| 五月天大香蕉| 99热精品在这里| 91chinese 在线| 亚洲天天综合| 天天肏天天肏| 五月天色社区| www网站在线观看| 五月丁香婷庭在线| 九九精品9| 青青草护士中出内射-欧美电影在线天堂新版 | 五月丁香综合在线| 梁铮版《蜘蛛女侠》在线| 狠狠插.com| 人人摸人人摸| 玖玖在线资源视频| 五月丁香综合成人社区| 最近中文字幕2019视频1| 五月天婷婷免费视频| a色色色色色| 丁香六月在线综合| 五月亭亭开心网| 色综合天天天天做夜夜| 欧美激情五月天婷婷| 成人va在线| 夜夜干 夜夜操| 激情五月丁香综合网站| 思思热国产视频| 婷综合六月| 五月天成人综合| 99免费| 99热 在线观看| 欧美、日韩、中文、制服、人妻| 国产精品第一国产精品| 色综合色| 91婷婷色五月| 丁香五月伊人| 色婷婷亚洲五月天| 人人摸人人干人人做| 欧美天天草人人草| 丁香婷婷五月六月久久| 色五月婷婷天堂| 欧洲色| 91丨九色丨熟女|老版| 三十路磁力链接| www.99色| 色婷婷九月| 99碰网站| 超碰93在线观看| 丁香婷婷综合影院| 激情五月天婷婷播播久久综合91 | 51精品国自产在线| 综合激情五月丁香| 天天肏夜夜肏| 久9视频| 亭亭色色五月天| 99热思思| 亚洲av日韩无码| 99热在线只有精品| 婷婷婷婷婷婷婷五月丁香| 亚洲人妻av| 九月丁香亭亭| 99综合| 五月婷中文字幕| 狠狠情色| 综合99久久天天综合| 91操女| 最新无码专区| 久久女伦| 狠干综合| 毛片九九九九九九| 91丁香五月| 婷婷内射视频在线| 97操视频| 久色视频在线| 月婷婷亚洲| 六月婷婷无码| 超碰renrenai| 五月婷婷啪啪啪啪| 99热综合网| 毛片新网地| 射久久丁香五月| 色五月成人在线| 欧美97p| 另类综合网| 丁香激情综合| 91碰超| 色五月激情综合网| 丁香五月婷婷基地| 五月天小说激情| 99在线热视频| 熟女色专区| 色色综合日韩| 婷婷无码视频| 日韩操逼大片| 97色婷婷| 99精品综合在线| 狠狠色狠狠爱| 公的粗大挺进了我的密道| 激情AV| 欧美成人在线观看| 成人网在线视频| 久久婷婷亚洲| 久久婷婷五月天激情| 都市激情五月婷婷综合| 思思热在线视频精品| 97碰| AⅤ网站在线看| 99在线免费视频播放| 99五月婷| 色狠狠999综合网| 亚洲VA在线| 婷婷综合网| 五月开心激情| 欧美日韩国产成人在线| 九九成人电影婷婷| 大香线蕉伊人| 激情五月丁香激情综合网| 可以看的AV| 综合久久婷婷| 久久免费高| 久久婷婷五月综合色奶水99啪| 天天拍夜夜撸| 五月天婷婷久久视频| 99热精品无码| 色婷婷国产精品综合在线观看| 色五月婷婷激情综合网| 激情五月天 婷婷| 一级黄色影片| 婷婷涩五月天综合| 99热视精品| 激情综合激情五月| 天天成人综合| 亚洲国产网站| 国产黄色大片| 亚洲色频| 亚洲国产网站| 久久玖玖综合| 97碰成超视频免费视频| 精品久久婷婷| 免费黄色AV| 超碰国产AV| www.com色播五月天| 毛v一区二区视频| 五月婷视频在线观看| 一级视频网址| 久热伊人在91| 五月天丁香综合久久国产| 五月婷婷草| 182TV大香蕉| 一月婷婷色色| 99激情网| 六月丁香婷婷天堂| 国产,欧美,日韩,性爱| 天天爽夜夜爽天天爽夜夜爽| 激情深爱综合网| 亚洲最大视频| 五月激情综合网| 99热这里只有精品3| 色婷婷亚洲精品天天综| 国产精品美女久久久久AV超清| 国产午夜成人免费看片无遮挡| 九九操屄| 日本九九网| 9精品在线| 99色6爱9热| 桃色激情婷婷伊人网| 伊人婷婷色激情丁香| 久久色吧| 九九99久久| 日本精品。999| 狠狠插狠狠| 思思热精品在线视频| 激情深爱五月天| 婷婷伊人网| 少妇高潮呻吟A片免费看软件| 青草视频在线播放| 大香蕉久久视频久久视频 | 国产成人综合在线| 香蕉久久国产AV一区二区| 中文字幕无码AV| 九九九九无码| 婷婷五月天综合网| 97久久综合网| 婷婷狠狠五月综合| 久久成人亚洲欧美电影| 丁香桃色网| 久久影视婷婷五月| 美女网黄| 亚洲婷婷五月天综合| 国产做爰视频免费播放| 精品皮股午夜AV| 一本婷婷丁香久久| 亚洲色热| 狠狠综合| 亚洲电影在线观看| 婷婷婷婷色| 久久999久久999久久999久久| 亚洲无码11| 色婷操逼| 五月婷婷播| 伊人丁香在线| 五月婷婷成人| 台湾综合丁香五月蜜桃| 大香蕉在线99热| 婷婷丁香五月婷婷| 婷婷免费精品视频| 婷婷五月丁香综合桃花色网| 六月色色| 日日操,天天操| www激情网站| 五月婷婷之综合激情| 丁香六月亚洲| 婷婷综合另类| 亚洲天堂热| 丁香六月久久| 一區四區歐美日韓| 97色操| 久色| 日本婷色| 婷婷开心青青草| 综合亚洲AV| 亚洲精品国产setv| 丁香五月区| 久久久www| 99久操视频| 婷婷久久99| tingtingzonghewang| 亚洲狠狠婷婷| 久久在线视频免费观看| 婷婷 色 丁香 夜| 狠狠五月激情在线| 无码A片一区二区免费| 五月天久久久| www.99热精品| 久99热| jiujiu热在线视频| 亚洲色图日韩网址| 色综合99无码 | 五月丁香色婷婷| 99热在线成人网站| 全国最新疫情| 俺来也综合网精品一区 | 欧美日韩中国| 五月丁香综合精品欧美| 婷婷亚洲综合| 九色PORNY自拍成人精彩视频| 五月婷婷免费在线观看| 性爱AV天堂| 涩涩婷婷五月| 九 九九九AV| 成人国产欧美大片一区| 九九色色| 五月激情综合网| 色五月成人在线| 美女天天艹人人爽| 五月婷婷色情| 狠狠爱婷婷爱| 淫荡A片| 婷婷丁香五月天操逼| 亚洲日韩乱码一区二区三区四区| 五月天久久婷婷| 97人人操| 91凹凸在线| 婷婷五月天中文字幕| 99热首页在线30| 婷婷五月天影视网址| 色色五月天婷婷| 亚洲成人高清在线| 色婷婷88| www.黄色片-久久成人国产精品在线播放-999AV | 色域五月婷婷丁香| 99久久婷| 九色婷婷| 99久视频| 99久久综合| 免费观看亚洲AV片| 操碰99| 日本精品干| 97自拍99| 99热1| 久久久久亚洲AV无码网影音先锋| 欧美色97| 操97| 久久色在线视频| 国产色色网址网站| 五月伊人视频在线看| 97涩涩丁香五月天| 精品久久久久久久人妻| 九九99视频| 欧美α√| 九九热99免费视频| 三级三久久线久久99久目本WW| 色爱亚洲| 开心五月色婷婷综合开心网| 丁香综合日产精品久久| 婷婷丁香黄色| 婷婷射图| 电影蜘蛛女| 婷婷丁香五月天中文字幕| 97婷婷五月| 人人爽天天爽| 97超碰综合| 日韩无码专区| 久综合九综合99| 丁香花操逼| 婷婷天堂综合| 亚洲综合五月天综合| 国产精品婷婷午夜在线观看| 国产va视频| 色婷婷香蕉| 五月天婷婷基地| 97超级碰人人| 五月天综合在线| 美女婷婷六月色| 欧洲第一久色| 日本三级日本三级99| 亚洲激情综合| 1024在线视频| 婷婷五月深情丁香深爱日韩| 久久久久久五月天| 99热9| 色婷婷伊人激情在线观看| 婷婷中文网站| 欧美丁香六月在线观看视频| 99热首页| 日韩免费视频| www狠狠com| AV在线中文| 天天摸日日舔狠狠添婷婷婷| 国产精品色婷婷久久久精品| 亚洲亚洲人成综合网络| www.色九月| 婷婷五月天AV激情| 婷婷五月六| 久久AAAA片一区二区| 99久热精品在线| 婷婷伊人激情婷婷| 五月婷婷啪啪啪| 婷婷五月丁香基| 五月天色图| 丁香六月欧美| 一二线视频 另类| 久久久精品AV| 26uuu亚洲欧美日本| 久色| 婷婷五月综激情| 久久偷拍综合五月天| 日本色色网| 色五月偷偷| 久久五月婷天天干| 91精品久久久久久77777| 新激情综合| 99视频这里只有久久精品 | 久久综合爱| se婷97| 日韩精品色| 色色com| 丁香五月色五月| 狠狠色噜噜色狠狠狠综合久久成人波| 激情五月综合| 婷婷中文字幕| 激情婷婷五月| 婷婷五月色惰| 丁香色五月婷婷| 91操人人操| 久久这有这里精品| 久久久久久人妻| 婷婷在线精品| 亚洲婷婷91丁香| 4399欧美另类视频| 九九热在线99| 色五月美女| 狠狠狠五月婷婷六月丁香| 欧美大片| 久久这里只有精品07| 日日夜夜天天综合| 欧美在线干| 99热在线观看精品| 成人婷婷| 九九99在线免费在线观看视频| 婷婷五月天久久综合88| 激情小说婷婷| 五月色激情综合网| www.日日夜夜.com| www久久久久久| 九九热最新| 五月丁香成年黄色| 狠狠干在线| 大香蕉免费9| 天天综合五月天| 色色丁香婷婷综合| 99精在线| 五月激情婷婷图片基地| 能看的AV| 亚洲AAA| 婷婷综合仓库中文| 夜夜爱网站| 97色色综合| 久久婷婷啪啪视频| 色热久资源| 色婷婷小说| 影音先锋女人av鲁色资源网小说免费| 日日躁夜夜躁狠狠久久AV| 五月丁香激情综合六月涩涩爱| 色狠狠色噜噜AV天堂五区 | 五月播播| 狠狠色噜噜狠狠| 99ri国产在线| 亚洲婷婷五月天在线激情综合网| 激情四射五月天| 色吧五月婷婷六月丁香| 另类五月激情| 色色色综合色| 六月丁香大香蕉| 久久丁香五月天| 婷婷五月天激情综合深爱| 国内自拍97在线| 五月天桃色深爱网| 色婷婷久久| 99国产精品久久久久久久久久久| 五月激情基地| 91精品在线看| 少妇人妻人伦A片| 色婷婷色婷婷五月| 五月丁香啪啪婷婷| 亚洲国产精品二二三三区| 热99在线| 99热国品免费| 97婷婷五月| 超碰91在线| 丁香五月天殴美激情| 五月婷婷综合天天操| 91丨九色丨国产打屁股| 激情五月开心五月在线视频| 97碰碰草| 大香蕉综合| 久久五月网| 在线另类视频| 夜色五月天| 五月丁香婷婷中文| 综合综合网| 9久国产精品| 亚洲欧美综合7777色亭亭| 色丁香五月天| 色五月综合网| 97天堂| 婷婷六月天| 久久久国产精品黄毛片| 99热在线精品观看| 欧美丁香五月天| 五月婷婷色情| 亚洲天堂玖玖| 丰满少妇乱A片无码| 五月花婷婷| 欧美婷| 五月婷视频久久| 亚洲成人综合网在线免费观看| 日日日日日| 婷婷色在线播放| 色99综合视频| 色婷婷丁香网| 亚洲免费观看高清完整版AV线| 99热 日韩| 亚洲精品99| 久久综合影院 | 激情五月天婷婷| 毛片蕉地一二| 婷婷91| 狠狠色婷婷777| 这里只有精品1| 欧洲激情五月天| 亚洲黄色影视| 九月色婷婷婷| 久操香蕉| 免费做A爰片77777| 亚洲九九夜夜| 久操97| 天天色综合色| 广东99色在线| 婷婷午夜| 91婷婷色五月| 成人资源在线| 天天色凹凸| 久久丁香综合精品综合| 校花娇喘呻吟校长陈若雪视频| 久99热| 开心五月综合激情网| 4399亚洲视频| 久久婷婷五月综合色丁香| 伊人啪啪网| 99久久九九| 色五月婷婷天天操夜夜操| 黄页大全十八禁| 色九月激情综合网| ji'qing'luan'ren'lun| 天天拍天天做视频| 99热6这里只有精品6| 综合久久丁香婷婷,五月婷婷六月丁香,开心激情综合网,六月丁香在线观看,婷婷丁 | 色婷婷小说网| 天天爽天天干| 五月天另类激情在线| 久99热| 五月天开心网| 成人午夜视频精品一区| 青青草国产亚洲精品久久| 26uuu亚洲| h在线看免费版在线看| 亚洲六月婷婷| 日日夜夜干| 国产成人精品一区二三区熟女在线| 无人区码一码二码三码医生系列| 97久久人人人干| 五月婷婷电影院| 午夜成人av在线| 美女视频图片久久91| 激情五月婷婷视频一区二区三区| 偷拍九九五月丁香婷婷| 99热新网址| 91爱啪啪| 99热99日…..| 思思 热 99| 99九九在线视频| 91色久| 婷婷啪啪| 国产精品成人网址| 亚洲午夜Av| 99久久综合网| 爱爱色五月天| 色五月天激情| 先锋资源91| wwwss在线观看| 色婷婷成人做爰A片免费看网站| 一区二区成人电影免费播放| 五月激情天| 丁香婷婷午夜| 天天情天天狠天天透| 5月色亭亭视频| 亚洲五月天婷婷在线| 五月丁香久久网| 国产精品久久久久久久久久| 婷婷五月天国产性感美女演员久久久久| 亚洲免费电影2| 色~性~乱~伦~噜| 丁香五月 六月婷婷首页| 五月天国产| 噜噜狠狠色综合久| 日日日天天干| 国产黄色在线| 婷婷免费无视频| www.五月婷| 99在线观看| 9久热在线精品| xxxx久| 婷婷五月丁香婷婷| 99啪| 亚洲AV无码成人电影| 五月婷婷在线丁香| 99热这里只有国产精品| 激情视频网址| 久久一伦| 梁铮版蜘蛛女在线观看| 丁香五月情| 日韩乱轮AV| 五月婷视频久久| 夜夜夜夜夜操| 九九热最新| 99九九精品视频| 婷婷综合五月色播| 欧美久热| 欧美日韩日韩成人| 四色女婷婷| 淫视馆aV二区一区| 久久天堂色| www.五月激情.com| 热99这就是精品视频| 色色综合热| 婷婷五月俺要去| 人妻久热| 大香蕉伊在| www.minyis.com【JT】币址百万U预算可预付QQ2101460746 | 综合一区二区三区| 欧美啄木乌丝袜人妻系列| 亚洲综合婷婷| 久久久久8888| 色五月综合在线| 美女久久天堂| 欧美色播综合在线观看| 久久激情五月| 五月丁香婷婷啪啪网| 色五狠狠| 亚洲第一成人无码A片| 成人日韩欧美| 丁XX 成人| www一起操在线观看| 丁香婷婷色五月合集| 六月丁香网| 午夜成人AV在线| 91碰在线| 色婷另类| 五月天啪啪啪| 第1影院之五月婷婷| 亚洲激情综合五月婷婷啪啪| 五月丁香六月激情| 久久亚洲A| 91久久99久久91熟女精品| 亚洲综合色婷婷| 久操福利| 久久综合伊人77777蜜臀| 狠狠插狠狠插| 日本专区久久| 五月婷婷六月丁香在线| 亚洲色99综合天堂| 79色色色色| 婷婷五月丁香综合瑟瑟| 九九综合久久| 热996精品在线观看| 综合色五月| 亚州精品成人片| 欧美日韩AAAA| 色婷婷精品视频| 狠狠干综合| 色色五月天丁香婷婷| 超碰男人色| 玖玖在线视频福利| 26uuu成人网| 激情综合五月激情| 婷婷中合| 丁香月六月| 亚洲另类AV| 五月婷婷六月色| 日韩成人av在线| 99精品在线| 五月丁香六月婷婷亚洲激情综合| 丁香五月色情| 99热这里只有精品无码| 色婷婷aV四虎| 久久综合五月天| 激情五月丁香五月| 超碰国产在线| 亚洲国产精品综合色区| 欲求不满的人妻| 色伊人婷婷| 狠狠做六月爱婷婷综合aⅴ| 五月丁香六月婷| 亚洲五月天综合| 激情精品久久| 亚洲色夜| 综合丁香婷婷五月天| 丁香五月婷婷社区| 人人爱人人草| 五月丁香激情综合| 99视频| 狠狠色噜噜狠狠狠狠综合| 九色91视频| 被强行糟蹋的女人A片| 日日夜夜天天综合| 日本啪啪天堂| 日本欧美成人片AAAA| 欧美婷婷综合| 国产超碰在线| 97超碰,人人舔,人人操,人人摸 | 2016日日夜夜操| 91超级碰| 五月天狠狠草| 变态另类9| 九九在线精品| 久久婷婷六月综合综合色| 久99久在线| 超碰只有精品在线| 色综合综合色| 欧美天天性| 国产av基地| 久久99热网| 色丁香影院| 玖玖无码中文| 免费观看全黄做爰的视频| 六月激情久久| 激情婷婷亚洲五月| 99超碰在线观看| 婷婷综合激情| 99视频久久| 五月香蕉婷婷| 99热免费精品| 精品国产a| 色色色综合| 婷婷淫淫狠狠六月| 五月社区婷婷激情| 亚洲综合1024| 狠狠爱丁香婷| 少妇搡BBBB搡BBB搡毛茸茸| 91丨九色丨熟女|老版| 开心五月丁香啪| 密黄站| 久久婷视频| 日本色色影片| 99视频这里有精品| 婷婷五月天资源| 婷婷丁香五月天综合AV| 婷婷五月激情四射手| 久久人人看| 狠狠爱婷婷| 婷婷六月五月| 操逼123网| 欧美极品999| 99碰视频| 永久热91| 超91热| 国产99久久久国产精品免费看| 大香蕉人妻| 婷婷五月天激情小说| 一级A片天天操夜夜操| 婷婷五月天日逼| 色区久久| 国产97色在线| 日韩在线99| 免费成片在线观看| www.久99| 99碰碰。| 江苏少妇性BBB搡BBB爽爽爽 | 婷婷五月天VI| 亚洲乱码日产精品BD在线观看| 五月婷婷99热| 99自拍网| 婷婷综合精品| 先锋资源91| 久久色五月| 停婷丁五月在线| 激情五月天小说| xxx.色婷婷| 婷婷色丁香六月| 婷婷五月天激情视频| 毛片新网地| 四色女婷婷| 婷婷五月丁香婷婷| VA婷婷亚洲| 小视频一区 | 久久九九爽| 久久五月丁香婷婷| 99啪啪| 色婷婷基地在线| 亚洲色色色色色| 五月婷婷少妇之| 五月婷婷就去色| 人妻内射麻豆视频| 婷婷五月天com| 色婷婷九月综合| 日本五月婷| 99精品免费视频| 婷婷五月天综合网| 五月丁香婷婷在线| 99热这里只有精品66| 综合五月婷婷| 一本道在线电影| 亚洲欧美在线观看| 日韩ww| 色噜噜五月丁香婷婷| 九九色色色| 另类图片天天影视在线观看| 天天爽成人综合网站| 99er免费在线观看| 狠狠色婷婷六月激情网| 看久久性爱99视频| 夜夜大香蕉婷婷丁香| 丁香六月婷婷| 爱久久小说下载网| 婷婷五月综合基地| av在线免费网站 | 丁香五月 性爱| 大香AV| 久久66er久久| 操逼123网| 这里只有精品免费视频| 色五月大香蕉| 中国女人内射6XXXXX| 天堂网色婷婷| 久久婷婷亚洲| 噜色精品| 激情五月婷黄版| 五月综合无码| 91无码一区人妻A片蜜| 日本色色网站| 激情久久四色| 99热a片免| 五月丁香黄色视频| 欧美特大片黄| 五月婷在线影院| 五月综合激情图片| 五月草影视| 激情五月五月婷婷| 大操人妻| 色色色色热热| 狠狠操性爱av| 夜夜资源站| 色欲五月丁香| 日本色天堂| 婷婷精品性性性性性性性| 色色丁香婷婷综合| 亚洲无AV在线中文字幕| 色婷婷9| 9999热这里只有精品| 激情五月天丁香| 五月天另类小说久久小说网| 91玖玖| 色色色无码| 激情开心五月天| 超碰在线国产9| 六月天六月婷| 九九九热精品| www.99热精品99.com| 婷婷激情五月天网站| 五月婷婷偷拍| 婷婷六月激情综合| 五月天婷婷久久| 很很干天天干| 双性美人被调教到喷水A片| 男女99免费视频| 色狠狠色噜噜AV天堂五区消防| 极品人妻VideOssS人妻| 伊人九九热| 久噜久噜| 99在线精品免费视频| 色你久久| 深爱激情五月婷婷| 麻豆观看夏晴子| 97干在线| 九热...av| 色色热日| 热99久久这里只有精品| 激情五月天影院| 婷婷五月天AV在线| 五月激情婷婷在线| 日韩限制级大尺度黑料泄密大尺度视频一区二区在线观看 | 婷婷久久久久久久| 婷婷情色五月| 日韩 mm 不卡| 日本成人噜噜| www.久久爱| 婷婷五月天丁香成人社区| 激情五月四色| 国产精产国品一二三在观看| 婷婷色色狠狠| 激情丁香婷婷| 97人妻碰碰碰碰碰久久久久久| 天天日天天操天天干| 1024人妻| 操操操av| 久久这里只有精品热在99| www色色色com| 婷婷综合亚洲| 亚洲国产色婷婷| 色五月天在线观看| 大香蕉视频99| 五月天婷婷婷| 色激情网| 天天插,天天射| 色九九九综合| www.成人婷婷综合| 欧美日本99| 终合激情网| 9九色首页| 日本WWW九九九|