Конвертировать и маскировать биты с прямым порядком байтов в старший - PullRequest
0 голосов
/ 30 мая 2018

Я работаю над приложением Qt / C ++.Я хочу показать состояние трех датчиков Холла, поэтому я читаю его с микроконтроллера следующим образом:

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.

Вот мой код на ПК:

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 независимо от того, что я получаю.

Я подозреваю, что это может быть последовательность байтов с прямым порядком байтов ... но я понятия не имею, как это исправить

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Может быть, добавить несколько скобок:

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

0 голосов
/ 30 мая 2018

Если вы можете, я предлагаю вам использовать Boost C++ библиотеки: в по этой ссылке вы можете найти все, что вам нужно.

Если вы используете GCC Вы можете использовать int32_t __builtin_bswap32 (int32_t x)

Альтернатива, вы можете написать свою собственную функцию ... это довольно просто, на этот пост

...