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

    文章

    6842

    浏览量

    88758
  • 串口
    +关注

    关注

    14

    文章

    1540

    浏览量

    76099
收藏 人收藏

    评论

    相关推荐

    【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

    stm32虚拟串口接收数据处理

    在STM32中使用虚拟串口时,我们需要处理接收数据接收到的数据可能是来自其他设备的传感器数据
    的头像 发表于 12-20 11:22 2147次阅读