在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);
我正在将一些 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);