我正在研究Qt / C ++应用程序。我想显示3个霍尔传感器的状态,所以我用这种方式从微控制器读取它:
uint8_t state = getState(whichMotor);
int numChars = sprintf(sBuff, "%d", state);
HAL_UART_Transmit_DMA(&huart3, sBuff, numChars);
州可以是任何1,5,4,6,2或3。
然后在我的Qt应用程序中,我有3个标签,并想显示我从UART收到的号码中是否设置了相应的位。我确信我得到了正确的数字,当我把它显示为整数时它很好。但是要把它分成三个标签分成三个标签,我失败了,因为它只显示1 1 1或0 0 0。
这是我在PC上的代码:
const void MotorWidget::setHallState(const QString& s)
{
int hallState = s.toInt();
ui->lbValueHallC->setText(hallState & 0b100 > 0 ? "1" : "0");
ui->lbValueHallB->setText(hallState & 0b010 > 0 ? "1" : "0");
ui->lbValueHallA->setText(hallState & 0b001 > 0 ? "1" : "0");
}
例如,如果我收到hallState
为5,则标签C应显示" 1",标签B应显示" 0"和标签A应该显示" 1" ...但正如我所说,不管我收到什么,我只得到111或000。
我怀疑这可能是big-endian little-endian的事情......但我不知道如何修复它
答案 0 :(得分:2)
也许添加一些括号:
const void MotorWidget::setHallState(const QString& s)
{
int hallState = s.toInt();
ui->lbValueHallC->setText((hallState & 0b100) > 0 ? "1" : "0");
ui->lbValueHallB->setText((hallState & 0b010) > 0 ? "1" : "0");
ui->lbValueHallA->setText((hallState & 0b001) > 0 ? "1" : "0");
}
另请看这里: http://en.cppreference.com/w/cpp/language/operator_precedence
答案 1 :(得分:0)