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

    文章

    7264

    浏览量

    92373
  • 串口
    +关注

    关注

    15

    文章

    1592

    浏览量

    80412
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    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 ?174次阅读
    智嵌物联<b class='flag-5'>串口</b>转光纤转换器-延<b class='flag-5'>长串口</b>通信距离,增强抗干扰性能

    【RA-Eco-RA4M2开发板评测】使用RA4M2的串口实现任意任意类型任意长度的数据接收,并将接收到的数据显示在串口助手上

    一帧完整的数据串口发送的数据有长有短,如果没有接收完整,肯定会影响后续业务的处理。为了接收不定长
    发表于 05-04 14:11

    【RA-Eco-RA4M2开发板评测】定时器辅助串口不定长数据接收

    assert(status==FSP_SUCCESS); } ??2.定时器辅助串口接收,实现不定长数据接收。定时器回调函数实现如下:
    发表于 04-30 14:44

    【RA-Eco-RA4M2开发板评测】+UART测试实验

    本篇文章主要介绍如何使用e2studio对瑞萨单片机进行USART通过定时器中断方式接收不定长数据实验。 硬件准备:本次实验要实现使用瑞萨 R7FA4E2B93CFM 进行UART实验
    发表于 04-19 09:37

    如何使用DMA进行USART不定长接收

    在上一讲中,我们对USART进行了简单介绍,并讲解了如何在不使用DMA的情况下进行不定长度数据接收,本讲将着重讲解如何使用DMA进行USART不定长接收
    的头像 发表于 02-18 17:01 ?998次阅读
    如何使用DMA进行USART<b class='flag-5'>不定长</b>度<b class='flag-5'>接收</b>

    ads1298使用内部测试信号,连续读数据方式,获取的数据不定时的出现异常数据,是哪里出了问题?

    ads1298 使用内部 测试信号,连续读数据方式,获取的数据不定时的出现异常数据,不知道哪里出问题。
    发表于 01-23 07:56

    串口与Wi-Fi的连接方式

    中被广泛采用。 串口通信基础 串口通信是一种点对点的通信方式,它通过两条线(发送线和接收线)传输数据
    的头像 发表于 12-27 10:10 ?1491次阅读

    串口通讯异常处理方法 串口设备连接方式

    串口通信异常处理方法 1. 异常检测 在串口通信中,首先需要能够检测到异常情况。异常检测可以通过以下几种方式实现: 硬件检测 :利用串口硬件的中断和状态寄存器来检测异常,如
    的头像 发表于 12-27 09:53 ?4349次阅读

    代码分享】基于乐鑫ESP32的串口不定长数据接收方法

    代码分享】基于乐鑫ESP32的串口不定长数据接收方法
    的头像 发表于 11-15 01:02 ?1557次阅读
    【<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