C ++ из массива char в BCD

Проект Arduino, использующий язык Arduino (оболочка C ++) —

У меня есть массив из 8 символов, который дает 24-часовые часы в виде {'H','H',':','M','M',':','S,'S'} и мне нужно преобразовать это в BCD. Я думал, что понял идею достаточно хорошо, но получаю неожиданный результат.

В качестве базового примера я хотел бы преобразовать {'1','2'} в BCD — теория слева, а мой кодовый результат — справа на изображении ниже. Я подозреваю, что проблема с buff[0] быть 'number char', Я старался atoi(buff[0]) но это все равно не удалось (у меня был тот же результат):

Как я могу сделать это правильно? Мой базовый код:

char buff[8] = {'1','2',':','3','4',':','5','5'};
uint8_t HourTens  = buff[0] && 0b11110000; // && 0xF0, should be 1
uint8_t HourUnits = buff[1] && 0b00001111; // && 0x0F, should be 2
uint8_t HourBCD   = HourTens + HourUnits;

Serial.println( buff );
Serial.print("'"); Serial.print( buff[0] ); Serial.print( "', HourTens:  " );   Serial.println( HourTens );
Serial.print("'"); Serial.print( buff[1] ); Serial.print( "', HourUnits: " ); Serial.println( HourUnits );
Serial.print( "HourBCD: " ); Serial.println( HourBCD );
Serial.println("***");

введите описание изображения здесь

1

Решение

Проблема с вашим кодом в том, что данные в buff это символы ASCII, а не отдельные двоичные цифры. Вы должны вычесть '0' от каждой цифры до выполнения преобразования в BCD:

uint8_t HourTens  = (buff[0] - '0'); // && 0xF0, will be 1

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

uint8_t HourBCD = ((buff[0] - '0') << 4) | (buff[1] - '0');

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

1

Другие решения

Других решений пока нет …