精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

【筆記】接收不定長串口數據的方式(附代碼)

撞上電子 ? 2023-06-07 10:00 ? 次閱讀


在不定長串口數據接收方面,有多種方式可供選擇。以下是幾種常見的方法:1. 基于幀頭幀尾:通過在數據幀的開頭和結尾添加特定的幀頭和幀尾標識來確定數據的起始和結束。在接收端,通過檢測幀頭和幀尾來截取完整的數據幀。這種方法需要約定好幀頭和幀尾的標識,并在接收端進行相應的處理。例如,可以使用特定的字符或字節序列作為幀頭和幀尾標識。

#define FRAME_HEAD 0xAA#define FRAME_TAIL 0x55
uint8_t rxBuffer[100];uint8_t rxIndex = 0;uint8_t frameStarted = 0;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){ if (huart->Instance == USART1) { if (rxData == FRAME_HEAD) { frameStarted = 1; rxIndex = 0; } else if (rxData == FRAME_TAIL && frameStarted) { // 完整的數據幀接收完成,進行處理 // rxBuffer 中保存了完整的數據幀 // 可以進行后續的數據解析和處理操作 frameStarted = 0; } else if (frameStarted) { rxBuffer[rxIndex++] = rxData; }
HAL_UART_Receive_IT(&huart1, &rxData, 1); }}

2. 基于定長數據:如果數據包的長度是固定的,可以通過設定一個固定的字節數來接收數據。在達到指定的字節數后,即可認為接收到了完整的數據。這種方式適用于數據包長度固定且已知的情況。

#define DATA_LENGTH 10
uint8_t rxBuffer[DATA_LENGTH];
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){ if (huart->Instance == USART1) { // 完整的數據包接收完成,進行處理 // rxBuffer 中保存了完整的數據包 // 可以進行后續的數據解析和處理操作
HAL_UART_Receive_IT(&huart1, rxBuffer, DATA_LENGTH); }}

3. 基于超時機制:在串口接收時,可以設置一個超時時間,如果在規定的時間內沒有接收到數據,即認為當前數據接收結束。通過不斷檢查接收狀態和計時器,可以實現超時機制。這種方式適用于數據包長度不確定且無法使用幀頭幀尾方式的情況。

#define TIMEOUT_MS 100
uint8_t rxBuffer[100];uint8_t rxIndex = 0;uint32_t startTime = 0;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){ if (huart->Instance == USART1) { if (rxIndex == 0) { startTime = HAL_GetTick(); }
rxBuffer[rxIndex++] = rxData;
if (rxIndex >= 2 && HAL_GetTick() - startTime >= TIMEOUT_MS) { // 接收超時,數據接收結束 // 進行數據處理操作 rxIndex = 0; }
HAL_UART_Receive_IT(&huart1, &rxData, 1); }}

4. 基于特定字符:可以通過在數據中插入特定的字符來表示數據的開始和結束。接收端可以根據特定的字符來判斷數據的起始和結束。例如,可以使用換行符('\n')或回車符('\r')作為數據的起始和結束標識。

#define START_CHAR '\n'#define END_CHAR '\r'
uint8_t rxBuffer[100];uint8_t rxIndex = 0;uint8_t frameStarted = 0;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){ if (huart->Instance == USART1) { if (rxData == START_CHAR) { frameStarted = 1; rxIndex = 0; } else if (rxData == END_CHAR && frameStarted) { // 完整的數據接收完成,進行處理 // rxBuffer 中保存了完整的數據 // 可以進行后續的數據解析和處理操作 frameStarted = 0; } else if (frameStarted) { rxBuffer[rxIndex++] = rxData; }
HAL_UART_Receive_IT(&huart1, &rxData, 1); }}

5. 基于計數:可以在接收端設置一個計數器,根據接收到的數據逐步增加計數器的值。當達到指定的計數值時,即認為接收到了完整的數據。這種方式適用于在接收到固定數量的數據后即認為數據接收完成的情況。

#define FRAME_LENGTH 10
uint8_t rxBuffer[FRAME_LENGTH];uint8_t rxIndex = 0;uint8_t frameStarted = 0;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){ if (huart->Instance == USART1) { if (frameStarted) { rxBuffer[rxIndex++] = rxData; if (rxIndex == FRAME_LENGTH) { // 完整的數據接收完成,進行處理 // rxBuffer 中保存了完整的數據 // 可以進行后續的數據解析和處理操作 frameStarted = 0; } } else { // 如果接收到起始字符,則開始計數 if (rxData == START_CHAR) { frameStarted = 1; rxIndex = 0; } }
HAL_UART_Receive_IT(&huart1, &rxData, 1); }}

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據
    +關注

    關注

    8

    文章

    6909

    瀏覽量

    88849
  • 串口
    +關注

    關注

    14

    文章

    1547

    瀏覽量

    76231
收藏 人收藏

    評論

    相關推薦

    代碼分享】基于樂鑫ESP32的串口不定長數據接收方法

    代碼分享】基于樂鑫ESP32的串口不定長數據接收方法
    的頭像 發表于 11-15 01:02 ?179次閱讀
    【<b class='flag-5'>代碼</b>分享】基于樂鑫ESP32的<b class='flag-5'>串口</b><b class='flag-5'>不定長</b><b class='flag-5'>數據</b><b class='flag-5'>接收</b>方法

    【AG32開發板免費試用】+串口不定長收超時設置閾值多少合適?

    串口不定長收發超時設置閾值多少合適?這個和波特率有關系嗎? 考慮最大接收長度嗎?
    發表于 10-31 18:26

    STM32CUBEMX(8)--USART通過定時器中斷方式接收不定長數據

    概述 本文利用中斷實現串口不定長接收(非DMA),使用HAL庫,將接收數據打印出去。 DMA接收
    發表于 09-06 16:48

    STM32CUBEMX(6)--移植雅特力AT32F403AVGT7,雙串口通過DMA方式接收不定長數據

    { printf(\"串口2數據長度=%d\\\\r\\\\n\",Rx_len_usart2);//打印接收到的數據長度 printf(\"
    發表于 09-06 16:37

    STM32CUBEMX(2)--USART通過DMA方式接收不定長數據

    (\"數據內容:\"); for(int i=0;i<Rx_len;i++) { printf(\"%c\",ReceiveBuff);//向串口打印接收
    發表于 09-04 11:48

    esp32如何接收1M以上的數據

    手里有1塊ESP32_WROVER 模組 ,服務器發送不定長數據可能最大會到1M-2M,我不太清楚怎么處理,目前使用recv接收1K左右的數據正常,希望有這方面的思路 ,可以使用PSR
    發表于 06-21 14:56

    請問如何實現ESP32 uart的接收空閑中斷?

    我當前使用的是ESP-IDF.當uart接收不定長數據時,希望通過空閑中斷或者事件的方式來結束一幀uart數據
    發表于 06-05 07:55

    求助,關于串口數據解析疑問求解

    現在手上有一個串口模塊要開發,比較復雜, 功能:接收各種類型不定長度的 字符串,然后解析做出反饋 字符串基本規格: 單條命令 : CMD(X,Y,\'ABC或者中文字符不定長\'
    發表于 04-29 06:34

    stm32f103通過UART_RX空閑中斷服務函數接收不定長數據,運行一段時間后會進入HardFault_Handler的原因?

    UART_RX_DMA接收。 問題:當不使用串口調試助手發送時,系統正常運行(長時間),通過串口調試助手發送不定長數據,剛開始正常運行,運
    發表于 04-26 06:43

    STM32F030串口用IDLE中斷接收不定長度數據包,中斷異常的原因?

    如題,在使用IDLE中斷接收不定長度的數據包,發現程序一直處于IDLE中斷中。程序如下 串口配置程序 void USART_Configuration(void
    發表于 04-12 06:08

    STM32 DMA雙緩沖發送不定長數據怎么解決?

    STM32 DMA雙緩沖發送不定長數據,假如我需要發送100010個數據,開辟了2塊1000數據區,數據長度設置為1000,循環發送,最后一
    發表于 04-11 06:58

    用STM32F030F4串口空閑中斷接收不定長數據,發生中斷后不知道如何計算接收到的字節數?

    我用STM32F030F4串口空閑中斷接收不定長數據,發生中斷后不知道怎樣計算接收到的字節數。
    發表于 04-03 07:12

    stm32f103如何實現spi從機接收不定長數據

    stm32f103 如何實現spi從機接收不定長數據數據首字節說明了數據長度) 求個思路或例程 用的HAL 庫
    發表于 03-28 07:47

    求助,關于stm32l053串口通訊的疑問求解

    請問用L0系列mcu進行串口通訊,接收數據不定長,只能一個一個字節接收,再判斷是否停止接收,這樣
    發表于 03-25 06:57

    Slavefifo模式下的bulk傳輸會有不定長度的亂碼數據是怎么回事?

    Slavefifo模式下的bulk傳輸時候,FPGA向電腦端發送數據的時候,在我的數據前面一直會有不定長度的亂碼數據,很多時候都是0,請問我應該如何對固件操作,在發送我的
    發表于 02-28 08:31