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

    文章

    7357

    浏览量

    95108
  • 串口
    +关注

    关注

    15

    文章

    1628

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    单片机中的串口通讯串行同步通信与串行异步通信

    中始终保持精确的同步时钟,即发送时钟和接收时钟要严格的同步。常用的做法是两个设备使用同一个时钟源。 在串口通信与编程中应用最多的是异步通信方式。STM32中串口通信的实例:学习ST
    发表于 01-15 08:06

    为什么串口接收数据就会触发中断呢?

    为什么串口接收数据就会触发中断呢? 串口接收唤醒机制有哪些注意事项?
    发表于 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

    串口DMA接收数据包丢失怎么解决?

    RTT串口DMA接收数据,超过缓冲区后为什么会吞掉一个数据包呢,不能每次处理完后清除缓冲区数据吗,感觉
    发表于 09-29 07:50

    串口通信有哪些方式

    串口通信(Serial Communication)是一种通过串行方式逐位传输数据的通信方式,广泛应用于嵌入式系统、工业控制、仪器仪表等领域。其通信
    的头像 发表于 09-28 18:02 1370次阅读

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