将 little endian 的位转换并屏蔽为 big endian
Convert and mask bits of little endian to big endian
我正在开发 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 收到的数字中是否设置了相应的位。我确信我得到了正确的数字,当我将它显示为整数时它很好。但是将它分解成 3 位到三个标签我失败了,因为它只显示 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 问题...但我不知道如何解决它
如果可以的话,我建议你使用 Boost C++
库:在 this link 中你可以找到你需要的一切。
如果您使用 GCC,您可以使用 int32_t __builtin_bswap32 (int32_t x)
或者您可以编写自己的函数...这很简单,在 this post
也许添加一些括号:
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
我正在开发 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 收到的数字中是否设置了相应的位。我确信我得到了正确的数字,当我将它显示为整数时它很好。但是将它分解成 3 位到三个标签我失败了,因为它只显示 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 问题...但我不知道如何解决它
如果可以的话,我建议你使用 Boost C++
库:在 this link 中你可以找到你需要的一切。
如果您使用 GCC,您可以使用 int32_t __builtin_bswap32 (int32_t x)
或者您可以编写自己的函数...这很简单,在 this post
也许添加一些括号:
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