我正在尝试在 STM32 上运行专为 Arduino 设计的磁力计代码。为 Arduino 编译时,我没有收到任何错误,并且从传感器读取的值已签名。为 STM 编译时出现错误:“参数 1 没有已知的从 'int*' 到 'uint16_t* {aka short unsigned int*}' 的转换”。
这是完全有道理的,但从哪里开始呢?
目标是获得与常规 Arduino 板相同的结果。
这是因为 stm32 上的 int 是 32 位,而 AVR 上的 int 是 16 位长。当您将指向 int 的指针传递给采用指向 uint16_t 的指针的函数时,无法进行转换。为什么?
当您取消引用指针时,对取消引用的任何分配只写入 2 个字节,原始类型为 4 个字节。所以2个字节不受影响。
例子
void foo(uint16_t *ptr) {
*ptr = 0x1122
}
int val = 0x0feeddcc;
foo((uint16_t *)&val);
结果将是 0x0fee1122 而不是 0x00001122;- 如果你用隐式强制转换来强制它。但它是一个UB
将代码中的 int 更改为 short 以使其大小相同。
另一个解决方案 - 保持 int 和 unsigned 不变,只需重写方法;
#define PACKED __attribute__((__packed__))
void MechaQMC5883::read(int* x,int* y,int* z){
PACKED union {
short xs;
uint8_t xu[2];
}xunion;
Wire.beginTransmission(address);
Wire.write(0x00);
Wire.endTransmission();
Wire.requestFrom(address, 6);
xunion.xu[0] = Wire.read();
xunion.xu[1] = Wire.read();
*x = (int)xunion.xs;
xunion.xu[0] = Wire.read();
xunion.xu[1] = Wire.read();
*y = (int)xunion.xs;
xunion.xu[0] = Wire.read();
xunion.xu[1] = Wire.read();
*z = (int)xunion.xs;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句