【问题标题】:Porting some arduino code in stm32: problem with word data type在 stm32 中移植一些 arduino 代码:word 数据类型的问题
【发布时间】:2019-08-01 02:29:50
【问题描述】:

我正在将一些 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,但错误仍然存​​在。

【问题讨论】:

    标签: types arduino byte stm32 word


    【解决方案1】:

    正如 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]

    【讨论】:

    • 我还应该定义其他类似的函数:highByte(我认为类似于 lowByte),来自 Arduino 的 bitRead 和 bitWrite 函数。你知道怎么做吗?
    • 你可以试试#define highByte(argA) ((argA) >> (8*(sizeof(argA)-1)))
    • #define bitRead(argA,argB) (((argA) & (1
    • #define bitWrite(argA, argB, argC) ((argC) ? ((argA) |= (1
    【解决方案2】:

    根据 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);
    }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-13
      • 1970-01-01
      相关资源
      最近更新 更多