登录/注册

STM32串口接收处理数据类型

STM32串口接收处理数据类型

更多

在STM32串口通信中,接收到的原始数据本质上是字节流(uint8_t类型),即每次接收中断或DMA传输完成时,你得到的是 uint8_t(无符号8位整数)数组。处理这些数据的关键在于如何根据通信协议解析这些字节,将其转换成有意义的数据类型。

? 核心处理流程

  1. 接收原始字节流

    • USART接收到的每个字节(8位)通常存储在 uint8_t 类型的缓冲区 RxBuffer[] 中。
    • 无论是使用轮询、中断还是DMA方式,最终得到的数据单元都是 uint8_t
  2. 根据协议解析数据

    • 这是最关键的一步!你需要知道发送方发送数据的格式(协议)。
    • 协议定义了:
      • 数据的组成结构(例如:帧头、命令字、数据长度、有效数据、校验码、帧尾)。
      • 有效数据部分中,每个字节或字节组合代表的实际含义(是整数、浮点数、字符、结构体等?)。
      • 字节序(大小端):多字节数据(如int16_t, int32_t, float)的传输顺序(高位在前还是低位在前?STM32是小端模式)。
  3. 将字节组合成目标数据类型: 拿到代表特定数据的连续字节后,需要将它们转换(解析/重组)成你程序中需要使用的数据类型。常用方法:

    • 直接赋值给基本类型变量: (需注意字节序)

      // 假设接收缓冲区的第idx和idx+1位置存储了一个小端的int16_t
      int16_t value;
      value = (int16_t)(RxBuffer[idx] | (RxBuffer[idx + 1] << 8)); // 小端:低字节在前
      // 等价于:value = *((int16_t*)&RxBuffer[idx]); // 指针强制转换(需注意字节序对齐)
    • 使用联合体 (Union): (方便且清晰)

      typedef union {
          uint8_t data[4];
          int32_t intValue;
          float floatValue;
      } myDataUnion_t;
      myDataUnion_t converter;
      // 复制接收到的4个字节到联合体的数组
      memcpy(converter.data, &RxBuffer[idx], 4);
      // 现在可以通过converter.intValue或converter.floatValue访问数据(注意类型匹配和字节序!)
      int32_t myInt = converter.intValue;
      float myFloat = converter.floatValue;
    • 使用 memcpy 复制: (安全通用,避免对齐问题)

      int32_t value;
      memcpy(&value, &RxBuffer[idx], sizeof(value)); // 将缓冲区指定位置字节复制到目标变量
      // 注意:直接这样复制也要确保发送方的字节序和接收方(STM32小端)一致!
    • 手动解析字符串: (如接收ASCII字符)

      // 假设RxBuffer接收的是以回车换行("\r\n")结尾的ASCII字符串
      if (接收到结束符) {
          RxBuffer[bytesReceived] = '\0'; // 添加字符串结束符
          char* receivedString = (char*)RxBuffer; // 现在可以当字符串用了
          // 或者使用字符串处理函数(sscanf, atoi, atof, strtok等)
          int num = atoi(receivedString);
          float fnum = atof(receivedString);
      }
    • 强制类型转换指针: (简洁但需谨慎)

      // 前提:确保指针指向的地址是访问该类型对齐的(否则可能触发硬件错误)
      // 确保字节序正确!
      int32_t* pValue = (int32_t*)&RxBuffer[idx];
      int32_t value = *pValue;

? 重要注意事项

  1. 协议定义: 必须和发送端严格约定好数据格式(帧结构、数据类型、长度、字节序、校验方式)。
  2. 字节序 (Endianness): STM32使用小端模式。如果发送端是大端模式(如网络传输、某些上位机软件默认),收到多字节数据后必须手动进行字节顺序交换。可使用类似 __REV(), __REV16() (CMSIS) 或自己写的交换函数。
  3. 数据对齐: 访问非字节类型(int16_t, int32_t, float)时,地址最好是对齐的(如int32_t地址最好是4的倍数)。使用 memcpy 通常是处理非对齐访问最安全的方式(虽然效率略低)。使用 __packed 结构体或联合体可以帮助处理非对齐数据,但访问效率会降低。
  4. 缓冲区管理: 设计好接收缓冲区,防止溢出(使用循环缓冲区是常见做法)。
  5. 完整帧判断: 需要有机制判断一帧数据何时接收完整(超时、特定帧尾、长度字段)。
  6. 校验: 务必对接收到的数据进行校验(如和校验、异或校验、CRC校验)以确保数据正确性。
  7. 浮点数处理: 浮点数在发送端通常转换为IEEE 754标准的字节表示传输。接收端按约定字节序用上述方法(memcpy, union)还原成float变量即可。
  8. 边界处理: 确保解析索引 idx 不会超出缓冲区范围。

? 总结

根据你的具体应用协议,选择合适的解析方法,并仔细处理字节序和校验,就能将原始的 uint8_t 字节流转换成程序中有意义的各类数据。?

STM32串口中断接收不定长报文介绍

本项目中,需要使用STM32的USART6串口与FPGA板(下位机)通信,需要发送和接收

2023-10-26 11:01:55

STM32串口发送数据接收数据方式总结

STM32串口发送数据和接收

2023-09-19 09:14:52

STM32串口发送数据接收数据浅析

STM32串口发送数据最直接的方式是什么呢?STM32

2022-02-18 06:09:52

STM32串口1通讯实验程序下载

STM32串口1通讯实验程序下载

资料下载 郑兵 2021-12-30 10:34:29

stm32串口

DMA发送缓存区bsp_usart.cbsp_usart.hisr.c基于stm32f103zet6串口发送使用DMA发送大致说明USART_Rx_Sbuffer二维数组 ->

资料下载 h1654155957.9921 2021-12-24 18:55:26

stm32串口代码详解

stm32串口

资料下载 佚名 2021-12-24 18:38:26

STM32串口接收不定长数据的程序免费下载

本文档的主要内容详细介绍的是STM32串口接收不定长数据的程序免费下载。

资料下载 如梦之梦1 2020-08-26 08:00:00

ZigBee CC2530串口数据接收处理机制详细资料讲解

本文档的主要内容详细介绍的是ZigBee CC2530串口的数据接收处理

资料下载 李鸿洋 2019-08-01 17:34:00

STM32串口数据接收与发送处理的几种模式分别是哪些

STM32串口发送数据为什么会丢失呢?怎样去解决?STM32

2021-12-10 07:37:53

STM32串口是如何去实现数据发送与接收

什么是串口复位呢?STM32串口是如何去实现数据发送与

2021-12-10 06:16:42

STM32串口接收数据处理方法是什么

STM32串口接收数据处理方法是什么

2021-12-03 06:35:41

STM32串口发送数据接收数据的方式有哪些?

STM32串口发送数据和接收

2021-12-02 07:15:02

STM32有哪几种类型串口?怎样去设置STM32串口

STM32有哪几种类型串口?怎样去设置STM32

2021-11-26 07:35:22

知道STM32串口通信乱码要怎么处理

STM32串口通信以及温度采集搞定,其中主要遇到STM32系列单片机时钟树的问题,串口

2021-06-16 15:35:22

STM32串口发送数据接收数据方式

STM32串口发送数据和接收

2021-01-25 06:54:03
7天热门专题 换一换
相关标签