一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

撞上電子 ? 2023-06-07 10:00 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群


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

#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) { // 完整的數(shù)據(jù)幀接收完成,進(jìn)行處理 // rxBuffer 中保存了完整的數(shù)據(jù)幀 // 可以進(jìn)行后續(xù)的數(shù)據(jù)解析和處理操作 frameStarted = 0; } else if (frameStarted) { rxBuffer[rxIndex++] = rxData; }
HAL_UART_Receive_IT(&huart1, &rxData, 1); }}

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

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

3. 基于超時機(jī)制:在串口接收時,可以設(shè)置一個超時時間,如果在規(guī)定的時間內(nèi)沒有接收到數(shù)據(jù),即認(rèn)為當(dāng)前數(shù)據(jù)接收結(jié)束。通過不斷檢查接收狀態(tài)和計時器,可以實現(xiàn)超時機(jī)制。這種方式適用于數(shù)據(jù)包長度不確定且無法使用幀頭幀尾方式的情況。

#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) { // 接收超時,數(shù)據(jù)接收結(jié)束 // 進(jìn)行數(shù)據(jù)處理操作 rxIndex = 0; }
HAL_UART_Receive_IT(&huart1, &rxData, 1); }}

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

#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) { // 完整的數(shù)據(jù)接收完成,進(jìn)行處理 // rxBuffer 中保存了完整的數(shù)據(jù) // 可以進(jìn)行后續(xù)的數(shù)據(jù)解析和處理操作 frameStarted = 0; } else if (frameStarted) { rxBuffer[rxIndex++] = rxData; }
HAL_UART_Receive_IT(&huart1, &rxData, 1); }}

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

#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) { // 完整的數(shù)據(jù)接收完成,進(jìn)行處理 // rxBuffer 中保存了完整的數(shù)據(jù) // 可以進(jìn)行后續(xù)的數(shù)據(jù)解析和處理操作 frameStarted = 0; } } else { // 如果接收到起始字符,則開始計數(shù) if (rxData == START_CHAR) { frameStarted = 1; rxIndex = 0; } }
HAL_UART_Receive_IT(&huart1, &rxData, 1); }}

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7250

    瀏覽量

    91562
  • 串口
    +關(guān)注

    關(guān)注

    15

    文章

    1586

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    智嵌物聯(lián)串口轉(zhuǎn)光纖轉(zhuǎn)換器-延長串口通信距離,增強(qiáng)抗干擾性能

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

    【RA-Eco-RA4M2開發(fā)板評測】使用RA4M2的串口實現(xiàn)任意任意類型任意長度的數(shù)據(jù)接收,并將接收到的數(shù)據(jù)顯示在串口助手上

    一幀完整的數(shù)據(jù)? 串口發(fā)送的數(shù)據(jù)有長有短,如果沒有接收完整,肯定會影響后續(xù)業(yè)務(wù)的處理。為了接收不定長
    發(fā)表于 05-04 14:11

    【RA-Eco-RA4M2開發(fā)板評測】定時器輔助串口不定長數(shù)據(jù)接收

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

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

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

    如何使用DMA進(jìn)行USART不定長接收

    在上一講中,我們對USART進(jìn)行了簡單介紹,并講解了如何在不使用DMA的情況下進(jìn)行不定長度數(shù)據(jù)接收,本講將著重講解如何使用DMA進(jìn)行USART不定長接收。
    的頭像 發(fā)表于 02-18 17:01 ?876次閱讀
    如何使用DMA進(jìn)行USART<b class='flag-5'>不定長</b>度<b class='flag-5'>接收</b>

    ads1298使用內(nèi)部測試信號,連續(xù)讀數(shù)據(jù)方式,獲取的數(shù)據(jù)不定時的出現(xiàn)異常數(shù)據(jù),是哪里出了問題?

    ads1298 使用內(nèi)部 測試信號,連續(xù)讀數(shù)據(jù)方式,獲取的數(shù)據(jù)不定時的出現(xiàn)異常數(shù)據(jù),不知道哪里出問題。
    發(fā)表于 01-23 07:56

    串口與Wi-Fi的連接方式

    中被廣泛采用。 串口通信基礎(chǔ) 串口通信是一種點對點的通信方式,它通過兩條線(發(fā)送線和接收線)傳輸數(shù)據(jù)
    的頭像 發(fā)表于 12-27 10:10 ?1314次閱讀

    串口通訊異常處理方法 串口設(shè)備連接方式

    串口通信異常處理方法 1. 異常檢測 在串口通信中,首先需要能夠檢測到異常情況。異常檢測可以通過以下幾種方式實現(xiàn): 硬件檢測 :利用串口硬件的中斷和狀態(tài)寄存器來檢測異常,如
    的頭像 發(fā)表于 12-27 09:53 ?3909次閱讀

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

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

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

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

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

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

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

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

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

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

    在GD32F407跑了freeRTOS,中斷調(diào)用xEventGroupSetBitsFromISR函數(shù)后就會死機(jī),為什么?

    在GD32F407跑了freeRTOS,串口接收使用了DMA+IDLE中斷來實現(xiàn)不定長接收串口的IDLE中斷中
    發(fā)表于 07-26 06:37

    STM32G030F6用串口中斷函數(shù)接收數(shù)據(jù),發(fā)送數(shù)據(jù)就死機(jī)怎么解決?

    rtthread+cubemx創(chuàng)建的一個新項目,已經(jīng)打開了UART1的全局中斷,下面是main.c文件的代碼,只做最簡單的串口收發(fā)數(shù)據(jù)的動作,其中USART1_IRQHandler函數(shù)cubemx生成的
    發(fā)表于 07-11 06:44