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

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

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

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

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


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

#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è)定一個(gè)固定的字節(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. 基于超時(shí)機(jī)制:在串口接收時(shí),可以設(shè)置一個(gè)超時(shí)時(shí)間,如果在規(guī)定的時(shí)間內(nèi)沒有接收到數(shù)據(jù),即認(rèn)為當(dāng)前數(shù)據(jù)接收結(jié)束。通過不斷檢查接收狀態(tài)和計(jì)時(shí)器,可以實(shí)現(xiàn)超時(shí)機(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í),數(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)識(shí)。

#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. 基于計(jì)數(shù):可以在接收端設(shè)置一個(gè)計(jì)數(shù)器,根據(jù)接收到的數(shù)據(jù)逐步增加計(jì)數(shù)器的值。當(dāng)達(dá)到指定的計(jì)數(shù)值時(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 { // 如果接收到起始字符,則開始計(jì)數(shù) if (rxData == START_CHAR) { frameStarted = 1; rxIndex = 0; } }
HAL_UART_Receive_IT(&huart1, &rxData, 1); }}

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

    關(guān)注

    8

    文章

    6715

    瀏覽量

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

    關(guān)注

    14

    文章

    1533

    瀏覽量

    75457
收藏 人收藏

    評論

    相關(guān)推薦

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

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

    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

    求助,關(guān)于串口數(shù)據(jù)解析疑問求解

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

    stm32f103通過UART_RX空閑中斷服務(wù)函數(shù)接收不定長數(shù)據(jù),運(yùn)行一段時(shí)間后會(huì)進(jìn)入HardFault_Handler的原因?

    UART_RX_DMA接收。 問題:當(dāng)不使用串口調(diào)試助手發(fā)送時(shí),系統(tǒng)正常運(yùn)行(長時(shí)間),通過串口調(diào)試助手發(fā)送不定長數(shù)據(jù),剛開始正常運(yùn)行,運(yùn)
    發(fā)表于 04-26 06:43

    STM32 DMA雙緩沖發(fā)送不定長數(shù)據(jù)怎么解決?

    STM32 DMA雙緩沖發(fā)送不定長數(shù)據(jù),假如我需要發(fā)送100010個(gè)數(shù)據(jù),開辟了2塊1000數(shù)據(jù)區(qū),數(shù)據(jù)長度設(shè)置為1000,循環(huán)發(fā)送,最后一
    發(fā)表于 04-11 06:58

    用STM32F030F4串口空閑中斷接收不定長數(shù)據(jù),發(fā)生中斷后不知道如何計(jì)算接收到的字節(jié)數(shù)?

    我用STM32F030F4串口空閑中斷接收不定長數(shù)據(jù),發(fā)生中斷后不知道怎樣計(jì)算接收到的字節(jié)數(shù)。
    發(fā)表于 04-03 07:12

    stm32f103如何實(shí)現(xiàn)spi從機(jī)接收不定長數(shù)據(jù)

    stm32f103 如何實(shí)現(xiàn)spi從機(jī)接收不定長數(shù)據(jù)數(shù)據(jù)首字節(jié)說明了數(shù)據(jù)長度) 求個(gè)思路或例程 用的HAL 庫
    發(fā)表于 03-28 07:47

    求助,關(guān)于stm32l053串口通訊的疑問求解

    請問用L0系列mcu進(jìn)行串口通訊,接收數(shù)據(jù)不定長,只能一個(gè)一個(gè)字節(jié)接收,再判斷是否停止接收,這樣
    發(fā)表于 03-25 06:57

    Slavefifo模式下的bulk傳輸會(huì)有不定長度的亂碼數(shù)據(jù)是怎么回事?

    Slavefifo模式下的bulk傳輸時(shí)候,F(xiàn)PGA向電腦端發(fā)送數(shù)據(jù)的時(shí)候,在我的數(shù)據(jù)前面一直會(huì)有不定長度的亂碼數(shù)據(jù),很多時(shí)候都是0,請問我應(yīng)該如何對固件操作,在發(fā)送我的
    發(fā)表于 02-28 08:31

    串口接收數(shù)據(jù)的兩種方式是什么

    上方是發(fā)送數(shù)據(jù)的例子,那么串口接收又該如何配置,又要在串口發(fā)送的例子上做哪些更改呢? 這里我們可以通過查詢或者中斷的方式來進(jìn)行
    的頭像 發(fā)表于 11-10 16:20 ?1917次閱讀
    <b class='flag-5'>串口</b><b class='flag-5'>接收</b><b class='flag-5'>數(shù)據(jù)</b>的兩種<b class='flag-5'>方式</b>是什么

    GD32串口dma接收空閑中斷配置流程是怎樣的?

    GD32串口dma接收空閑中斷配置流程是怎樣的,用過的朋友分享下經(jīng)驗(yàn)?,F(xiàn)在已經(jīng)實(shí)現(xiàn)串口+DMA的發(fā)送和接收,都沒有問題,并且使用查詢idle方式
    發(fā)表于 11-03 07:51

    STM32串口中斷接收不定長報(bào)文介紹

    本項(xiàng)目中,需要使用STM32的USART6串口與FPGA板(下位機(jī))通信,需要發(fā)送和接收數(shù)據(jù),有報(bào)文應(yīng)答機(jī)制。
    的頭像 發(fā)表于 10-26 11:01 ?865次閱讀
    STM32<b class='flag-5'>串口</b>中斷<b class='flag-5'>接收</b><b class='flag-5'>不定長</b>報(bào)文介紹

    串口怎么才能實(shí)現(xiàn)接收不定長數(shù)據(jù)?

    大家都是怎么處理不定長數(shù)據(jù)
    發(fā)表于 10-24 06:43

    如何把接收不定長的字符串到指定結(jié)構(gòu)體內(nèi)?

    發(fā)送命令,然后串口會(huì)接收不定長的字符串,想存到指定的結(jié)構(gòu)體內(nèi),組成設(shè)備信息
    發(fā)表于 10-16 08:04

    STM32如何把接收不定長的字符串到指定結(jié)構(gòu)體內(nèi)?

    STM32如何把接收不定長的字符串到指定結(jié)構(gòu)體內(nèi)
    發(fā)表于 10-15 07:20