将 int16_t 变量转换为 uint8_t 以传递给函数
Posted
技术标签:
【中文标题】将 int16_t 变量转换为 uint8_t 以传递给函数【英文标题】:Cast an int16_t variable to uint8_t for passing to function 【发布时间】:2021-12-04 12:10:18 【问题描述】:我想将一个 2 字节的有符号整数传递给一个函数(STM32 USB 传输),该函数接受一个指向 1 字节无符号整数的指针和字节大小。
int16_t some_number;
uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
我在调用函数时尝试过转换数字,但它不起作用。
CDC_Transmit_FS((uint8_t*)some_number,sizeof(some_number));
我也尝试将数据拆分为数组,但函数接收到的数据是乱码。 感谢您的帮助,谢谢。
【问题讨论】:
(uint8_t*)&some_number
您可能想在您最喜欢的 C 书籍中查看指针基础知识。还有字节序。
tstting,在((uint8_t*)&some_number)[0]
中可能是最重要的字节或最少的字节。它取决于实施。
要正确执行此操作,您需要了解CDC_Transmit_FS
的规范/语义。它将向某个接收器传输字节。如果你给它发送字节,而接收者会按照你发送它们的顺序期待字节,那么你可以用CDC_Transmit_FS((uint8_t *) &some_number, sizeof some_number)
来调用它(除了增加视觉混乱之外,你没有做任何额外的括号)......跨度>
… 然而,一些通信协议规定最高有效字节应该在前(称为big endian order)。在这种情况下,您需要确保按该顺序发送字节,方法是确保 int16_t1 is natively big-endian in your C implementation or by using code to convert it to big-endian order before sending it. There are commonly available routines for this, such as
htons 将 Shorts(16 位无符号整数)从主机到网络顺序转换。 (然后考虑int16_t
与uint16_t
。)
【参考方案1】:
我想你想传递some_number
的地址,即:
CDC_Transmit_FS((uint8_t*)(&some_number),sizeof(some_number));
【讨论】:
您确定按要求的顺序发送字节吗? 不,我不确定。以上是关于将 int16_t 变量转换为 uint8_t 以传递给函数的主要内容,如果未能解决你的问题,请参考以下文章
uint8_t uint32_t 类型强制转换出错 以及 unsigned char 类型和 unsigned int 类型相互转化
PHP - unpack() uint8_t 和 uint16_t