STM32串口接收处理数据类型
STM32串口接收处理数据类型
更多
在STM32串口通信中,接收到的原始数据本质上是字节流(uint8_t类型),即每次接收中断或DMA传输完成时,你得到的是 uint8_t(无符号8位整数)数组。处理这些数据的关键在于如何根据通信协议解析这些字节,将其转换成有意义的数据类型。
? 核心处理流程
-
接收原始字节流:
- USART接收到的每个字节(8位)通常存储在
uint8_t类型的缓冲区RxBuffer[]中。 - 无论是使用轮询、中断还是DMA方式,最终得到的数据单元都是
uint8_t。
- USART接收到的每个字节(8位)通常存储在
-
根据协议解析数据:
- 这是最关键的一步!你需要知道发送方发送数据的格式(协议)。
- 协议定义了:
- 数据的组成结构(例如:帧头、命令字、数据长度、有效数据、校验码、帧尾)。
- 有效数据部分中,每个字节或字节组合代表的实际含义(是整数、浮点数、字符、结构体等?)。
- 字节序(大小端):多字节数据(如
int16_t,int32_t,float)的传输顺序(高位在前还是低位在前?STM32是小端模式)。
-
将字节组合成目标数据类型: 拿到代表特定数据的连续字节后,需要将它们转换(解析/重组)成你程序中需要使用的数据类型。常用方法:
-
直接赋值给基本类型变量: (需注意字节序)
// 假设接收缓冲区的第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;
-
? 重要注意事项
- 协议定义: 必须和发送端严格约定好数据格式(帧结构、数据类型、长度、字节序、校验方式)。
- 字节序 (Endianness): STM32使用小端模式。如果发送端是大端模式(如网络传输、某些上位机软件默认),收到多字节数据后必须手动进行字节顺序交换。可使用类似
__REV(),__REV16()(CMSIS) 或自己写的交换函数。 - 数据对齐: 访问非字节类型(
int16_t,int32_t,float)时,地址最好是对齐的(如int32_t地址最好是4的倍数)。使用memcpy通常是处理非对齐访问最安全的方式(虽然效率略低)。使用__packed结构体或联合体可以帮助处理非对齐数据,但访问效率会降低。 - 缓冲区管理: 设计好接收缓冲区,防止溢出(使用循环缓冲区是常见做法)。
- 完整帧判断: 需要有机制判断一帧数据何时接收完整(超时、特定帧尾、长度字段)。
- 校验: 务必对接收到的数据进行校验(如和校验、异或校验、CRC校验)以确保数据正确性。
- 浮点数处理: 浮点数在发送端通常转换为IEEE 754标准的字节表示传输。接收端按约定字节序用上述方法(
memcpy,union)还原成float变量即可。 - 边界处理: 确保解析索引
idx不会超出缓冲区范围。
? 总结
- STM32串口接收到的基本数据类型是
uint8_t(字节)。 - 处理的核心在于按照通信协议解析这些字节流。
- 将连续的若干字节组合成目标数据类型(
int16_t,int32_t,float,char[]等)的关键操作是正确处理字节序和数据对齐。 memcpy和union是两种常用且相对安全可靠的转换方法。- 协议定义、字节序、校验、缓冲区管理和帧完整性判断是串口可靠通信的基础。
根据你的具体应用协议,选择合适的解析方法,并仔细处理字节序和校验,就能将原始的 uint8_t 字节流转换成程序中有意义的各类数据。?
stm32串口
DMA发送缓存区bsp_usart.cbsp_usart.hisr.c基于stm32f103zet6串口发送使用DMA发送大致说明USART_Rx_Sbuffer二维数组 ->
资料下载
h1654155957.9921
2021-12-24 18:55:26
7天热门专题
换一换
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- dtmb信号覆盖城市查询
- EDA是什么?有什么作用?
- 中科院研发成功2nm光刻机
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 如何进行编码器的正确接线?接线方法介绍
- 什么是场效应管?它的作用是什么?
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- amoled屏幕和oled区别
- 苹果nfc功能怎么复制门禁卡
- 单片机和嵌入式的区别是什么
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 苹果笔记本macbookpro18款与19款区别
- 通讯隔离作用
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机