1

「Arduino 言語」を使用する Arduino プロジェクト (C++ ラッパー) -

フォームに 24 時間クロックを与える 8 文字の配列があり{'H','H',':','M','M',':','S,'S'}、これを BCD に変換する必要があります。考え方は十分理解できたと思っていたのですが、予想外の結果が得られました。

基本的な例として、BCD に変換したいと思い{'1','2'}ます。理論は左側にあり、コードの結果は下の画像の右側にあります。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("***");

ここに画像の説明を入力

4

1 に答える 1

1

コードの問題は、 のデータbuffが ASCII 文字であり、個々の 2 進数ではないことです。'0'BCD への変換を実行する前に、各桁から減算する必要があります。

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

各要素は独自のバイトを取るため、何もマスクする必要がないことに注意してください。

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

また、数字は 0 ~ 9 であるため、有効な BCD 表現を取得するには、上位の数字を 4 シフトするだけでよいことに注意してください。

于 2014-03-16T16:31:10.077 に答える