国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

    文章

    7335

    瀏覽量

    94757
  • 串口
    +關注

    關注

    15

    文章

    1619

    瀏覽量

    82810
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    為什么串口接收數據就會觸發中斷呢?

    為什么串口接收數據就會觸發中斷呢? 串口接收喚醒機制有哪些注意事項?
    發表于 01-08 06:45

    請問CW32L的UART是不是沒有空閑中斷?

    CW32L083的UART是不是沒有空閑中斷?大家一般怎么實現不定長數據接收?是串口中斷+定時器嗎?
    發表于 12-15 07:28

    串口空閑中斷與串口超時中斷介紹

    。 特點 依賴總線物理狀態,而非時間。 常用于檢測不定長數據幀的結束,無需依賴特定結束符。 應用場景 Modbus通信:不定長數據包的接收
    發表于 11-21 08:31

    rt-thread 在使用串口DMA模式的時候,接收數據接收不到00,為什么?

    硬件為STM32F103ZET6: 在使用串口通訊時,在DMA接收模式下,收不到00數據,遇到00數據,好像DMA模式就認為是數據已經結束了
    發表于 10-14 06:20

    串口通信有哪些方式

    串口通信(Serial Communication)是一種通過串行方式逐位傳輸數據的通信方式,廣泛應用于嵌入式系統、工業控制、儀器儀表等領域。其通信
    的頭像 發表于 09-28 18:02 ?1089次閱讀

    串口接收的bufferSize由1024變更為3072后數據接收出錯,為什么?

    所有功能正常的程序,為了在加快OTA下載的速度,將原來的串口接收數組的長度1024變為3072時反而接收不到數據了,后來查看了一下內存具體如下: free total: 45708 u
    發表于 09-17 06:25

    求助,關于串口設備驅動fifo問題

    目前在做高頻數據采集分析,使用串口設備驅動(使用rs485),開啟DMA+空閑中斷,接收不定長數據接收
    發表于 09-12 08:18

    【RA4M2-SENSOR】—— 13.串口實現循環隊列

    ; } } } 主函數中添加核心代碼串口接收到的不定長度的數據發送回去 #include \"hal_data.h\" #incl
    發表于 09-01 11:46

    【RA4M2-SENSOR】—— 12.串口接收不定長度數據

    ;, U1_RxBuff);//打印收到的數據 user_uart_clear();//清空接收緩沖區 } HAL_Delay(10); } 編譯代碼,燒錄到板子 打開串口助手
    發表于 09-01 11:22

    CYT2B7串口接收會漏接數據怎么解決?

    串口中斷方式接收會漏接數據串口工具發送 :1234567芯片接收到 :1357硬件是CYTVI
    發表于 08-14 07:29

    STM32407使用串口閑時中斷+DMA方式接收最大接收字節是多少?

    使用串口閑時中斷+DMA方式接收數據,波特率為460800,DMA接收長度為1024個字節,并開啟串口
    發表于 07-22 08:16

    智嵌物聯串口轉光纖轉換器-延長串口通信距離,增強抗干擾性能

    智嵌物聯研發的串口光纖收發器是將RS-485/422/RS232接口信號轉換為光纖接口傳輸,通信距離可達20Km,大大延長串口的通信距離以及抗干擾性能。設備可自適應串口參數,無需設置,即插即用
    的頭像 發表于 06-27 17:08 ?734次閱讀
    智嵌物聯<b class='flag-5'>串口</b>轉光纖轉換器-延<b class='flag-5'>長串口</b>通信距離,增強抗干擾性能

    【RA-Eco-RA4M2開發板評測】定時器輔助串口不定長數據接收

    assert(status==FSP_SUCCESS); } ??2.定時器輔助串口接收,實現不定長數據接收。定時器回調函數實現如下:
    發表于 04-30 14:44

    【RA-Eco-RA4M2開發板評測】+UART測試實驗

    本篇文章主要介紹如何使用e2studio對瑞薩單片機進行USART通過定時器中斷方式接收不定長數據實驗。 硬件準備:本次實驗要實現使用瑞薩 R7FA4E2B93CFM 進行UART實驗
    發表于 04-19 09:37