This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR2355:联合体指针--不断出现错误#39;必须具有整型#39;尝试移位时

Guru**** 2524460 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1122463/msp430fr2355-pointer-to-union-----keep-getting-error-must-have-integral-type-when-trying-to-shift

器件型号:MSP430FR2355

我有一个类型 为 t_rtnVals 的 union 和一个指针。    在一个状态机中,我对 UNION 进行分配,然后希望将它们推出 UART 。

在这里可以看到几个赋值...val 是 volatile uint8_t、pFram 是 volatile uint16_t

我的问题是在 TX ISR 中、我想将每个半字节移出为显示字符、因此我要执行以下操作: 我不断收到 以下错误:

说明资源路径位置类型
#31表达式必须具有整型  

有人能告诉我如何解决这个问题,因为我必须转移到运输每个半字节……有时我将发送4个半字节的块,而其他时间它将是2个半字节的块

  if (charToSend)
  {
      applicationUART.pSysCommsA->UCAxTXBUF = (*(&prtnVals) >> (4*charToSend - 4) & 0x0F);
      charToSend--;
  }

prtnVals->i2cValues = val[byteSentCntr];



for (no_ConfPts = 0; no_ConfPts < REGISTER_DUMP; no_ConfPts++)
{
    prtnVals->memRecall = *(pFRAM + no_ConfPts);
    applicationUART.pSysCommsA->UCAxIE |= UCTXIE;
}

union rtnVals
{
    uint16_t moisture; //a/d moisture data
    uint16_t memRecall; //msp configuration data
    uint8_t i2cValues; //C02 sensor data
    uint16_t temperature; //a/d temp data
};

union rtnVals t_rtnVals = {0};
union rtnVals *prtnVals = &t_rtnVals;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您不能移动 UNION、但可以移动 UNION 的成员。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    > applicationUART.pSysCommsA->UCAxTXBUF =(*(&prtnVals)>>(4*charToSend - 4)& 0x0F);

    不、您不能移动指针。 我怀疑你要做的是移动 rtnVals 的内容(在* prtnVals),但我认为你也不能这样做。 为此、请声明另一个 UNION 成员类似于"uint16_t rawbits;"、然后将其移动:

    > applicationUART.pSysCommsA->UCAxTXBUF = prtnVals->rawbits >>(4*charToSend -4)& 0x0F;

    [编辑:固定取消引用]

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你是对的,我试图移动指针指向的内容。。。我的工作(如果我错了,请纠正我的错误,但它似乎起作用)是我创建了一个指针, 然后我分配了它  。。。

    在上面的例子中 ,我还尝试了以下方法:  (*(&prtnVals))>> 4...。这也不起作用...您能解释吗?  这意味着第一个推理应该给我解联合体的地址,第二个推理应该给我该地址的值……我仍然得到错误,我不明白为什么?

    uint16_t * PTX

    pTx = (uint16_t *)(*(&prtnVals));

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您的第一个示例仅包含一个推理。 它会创建 指向指针(指向 rtnVals)的指针("&"),然后使用"*"降额,为您提供指向 rtnVals 的指针(指向 rtnVals)。

    您可以(如第二个示例中所示)将此指针转换为不同类型的指针、然后取消引用该指针。 我为您提供了以这种方式使用联合体的"标准习惯"、这在类型上更安全、而且从现在开始6个月可能更容易理解。