如何将int16_t变量转换为uint8_t指针传入STM32 CDC_Transmit_FS发送函数
问题根因
- 原有调用代码的核心错误是缺失取地址符
&:(uint8_t*)some_number是将some_number的数值直接强制转换为内存地址,相当于让发送函数去读取以这个数值为起始地址的内存,大概率触发非法内存访问导致运行失败。 - 拆分数组后出现乱码,通常是两个原因:一是拆分时字节顺序和接收端的解析字节序不匹配,二是调用
CDC_Transmit_FS时没有判断返回值,USB发送缓冲区满导致数据丢包。
正确实现方案
方案1:直接传址发送(无需手动拆分)
如果接收端可以适配STM32的默认小端字节序,直接对变量取地址强制转换即可,代码最简洁:
// 对some_number取地址,再转为uint8_t类型指针 CDC_Transmit_FS((uint8_t*)&some_number, sizeof(some_number));
方案2:手动组包发送(适配自定义字节序)
如果需要统一收发两端的字节序(比如规定大端传输),手动拆分变量到数组再发送,避免不同平台大小端差异导致的乱码:
uint8_t tx_buf[2]; // 示例为小端传输:低字节在前,高字节在后 tx_buf[0] = (uint8_t)(some_number & 0xFF); tx_buf[1] = (uint8_t)((some_number >> 8) & 0xFF); // 如果需要大端传输,交换两行赋值顺序即可 // tx_buf[0] = (uint8_t)((some_number >> 8) & 0xFF); // tx_buf[1] = (uint8_t)(some_number & 0xFF); // 建议增加发送成功判断,避免缓冲区满丢包 while(CDC_Transmit_FS(tx_buf, 2) != USBD_OK);
内容的提问来源于stack exchange,提问作者tstting
相关产品推荐
相关产品推荐

