在stm32中移植一些arduino代码:word数据类型问题

Porting some arduino code in stm32: problem with word data type

我正在将一些 arduino 库代码移植到 stm32。 我遇到了数据类型这个词的问题,编译器给我“'word' 之前的预期表达式”错误。 这是代码:

uint8_t au8Buffer[MAX_BUFFER];
uint16_t *au16regs;
....
if(i%2)
{
    au16regs[i/2]= word(au8Buffer[i+u8byte],  lowByte(au16regs[i/2]));
}

当然在 Arduino 库上编译器不会报错。 有什么建议吗?

我尝试用 unsigned short 或 uint16_t 替换 word,但错误仍然存​​在。

根据 Arduino 文档,类型 "word" 等同于 stm32 "uint16_t"。因此,您需要将 2 个字节打包成一个 16 位字。 您可以执行以下操作:

uint16_t word = (higherByte << 8) + lowerbyte;

因此您可以实施 "mWord"。您还需要实施 "LowByte" 才能让您的示例正常工作。这是一个可能的实现:

uint16_t mWORD(uint8_t H, uint8_t L)
{
    return (((uint16_t)higherByte) << 8) + lowerbyte;
}

uint8_t lowByte(uint16_t w)
{
    return (w & 0xFF);
}

正如 Martin 所说,代码试图将两个 8 位片段组合成一个 16 位片段,但您的编译器不会那样解释它。您可以按照 Martin 的建议定义函数,或者预处理成编译器可以通过以下方式理解的内容:

#define word(argA,argB) (((argA) << 8) | (argB) )
#define lowByte(argA) ((argA) & 0xFF)

根据您要做的其他事情,使用(和管理)预处理器宏或其他函数可能与更改代码一样麻烦。 所以如果那是你唯一需要它的地方,你可以替换

au16regs[i/2]= word(au8Buffer[i+u8byte], lowByte(au16regs[i/2]));

au16regs[i/2]= (au8Buffer[i+u8byte] << 8) | (au16regs[i/2] & 0xFF);