如何在TMS320F28x上将STM32发送的16字节数据拆分为两个8字节数据?
解决TMS320F28x接收STM32 16字节结构体并拆分的问题
一、先排查数据接收异常的问题
接收是核心前提,先确保链路通了再处理拆分逻辑:
确认通信参数完全匹配
不管用UART/SPI/CAN哪种通信方式,两边核心参数必须严格一致:- UART:波特率、数据位(8位/9位)、停止位(1位/2位)、奇偶校验(无/奇/偶)
- SPI:时钟极性(CPOL)、时钟相位(CPHA)、主从模式、数据位宽
- CAN:波特率、滤波配置
比如STM32用115200波特率8N1,F28x必须完全对应,参数错一个就收不到有效数据。
检查硬件连接与信号质量
- 交叉连接通信引脚(UART的TX接对方RX,反之亦然);SPI的SCK/MOSI/MISO/CS一一对应
- 确保两块板子共地,避免信号干扰;用示波器抓通信引脚波形,验证STM32是否真的发送了符合协议的信号。
验证F28x的外设配置与接收逻辑
- 如果用中断接收:确认中断已开启,中断服务函数(ISR)中正确读取接收寄存器,写入缓冲区时无溢出;检查中断优先级配置,确保接收中断能被及时响应。
- 如果用轮询接收:正确判断接收完成标志位(比如UART的
SCIRXST.bit.RXRDY),每收到一个字节就计数,满16字节再处理,不要提前操作。 - 先做最简测试:让STM32循环发送固定16字节(比如0x00~0x0F),在F28x仿真中查看接收缓冲区
rx_buf的内容,确认是否能完整收到这组固定值。
解决结构体内存对齐问题
STM32(Keil)和F28x(CCS)的默认内存对齐规则可能不同,会导致结构体实际大小超过16字节,或者成员偏移错位。必须强制两边结构体的内存布局一致:
示例(两边都要加打包指令):// STM32 侧 #pragma pack(1) typedef struct { uint32_t param1; uint16_t param2; uint8_t param3[6]; uint32_t param4; } SendStruct_t; // 确保总大小为16字节 #pragma pack() // F28x 侧 #pragma pack(1) typedef struct { uint32_t param1; uint16_t param2; uint8_t param3[6]; uint32_t param4; } RecvStruct_t; #pragma pack()用
sizeof(SendStruct_t)和sizeof(RecvStruct_t)验证,确保都是16字节,没有额外填充字节。
二、正确拆分16字节数据为两个8字节部分
确认接收的16字节数据正确后,有两种可靠的拆分方式:
方式1:直接按字节数组拆分
最直观,不受数据类型和字节序影响:
uint8_t rx_buf[16]; // 已存好接收的16字节结构体数据 uint8_t part1[8]; // 前8字节部分 uint8_t part2[8]; // 后8字节部分 // 复制数据 memcpy(part1, rx_buf, 8); memcpy(part2, rx_buf + 8, 8);
方式2:按64位数据类型强转拆分
如果需要将8字节作为一个整体处理(比如转成uint64_t),可以用这种方式(F28x是32位MCU,但支持64位数据操作):
uint8_t rx_buf[16]; uint64_t *data_ptr = (uint64_t *)rx_buf; uint64_t part1_64 = data_ptr[0]; // 前8字节转成64位整数 uint64_t part2_64 = data_ptr[1]; // 后8字节转成64位整数 // 如需转回字节数组 uint8_t part1[8], part2[8]; memcpy(part1, &part1_64, 8); memcpy(part2, &part2_64, 8);
注意字节序:STM32和F28x都是小端模式,强转不会有字节序问题;如果是其他组合,需要手动调整字节顺序。
三、仿真调试技巧
- 在F28x仿真中,在接收完成的代码处设置断点,查看
rx_buf的每个字节值,对比STM32发送的原始数据,定位是接收链路问题还是拆分逻辑问题。 - 如果
rx_buf全为0或乱码,优先排查通信参数、硬件连接和中断配置;如果rx_buf内容和发送的部分匹配,检查接收计数逻辑或缓冲区溢出问题。
内容的提问来源于stack exchange,提问作者SerdarSoylemez
相关产品推荐
相关产品推荐

