1

使用“Arduino 语言”(C++ 包装器)的 Arduino 项目 -

我有一个 8 字符数组,它以 24Hr 的形式提供时钟,{'H','H',':','M','M',':','S,'S'}我需要将其转换为 BCD。我以为我很好地理解了这个想法,但我得到了意想不到的结果。

作为一个基本示例,我想转换{'1','2'}为 BCD - 理论在左侧,我的代码结果在下图的右侧。我怀疑问题出buff[0]在 a 上'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 字符中的数据,而不是单个二进制数字。'0'在转换为 BCD 之前,您需要从每个数字中减去:

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

请注意,每个元素都有自己的字节,因此您不需要屏蔽任何内容。

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

另请注意,由于数字是从零到九,您需要做的就是将高位数字移动四位以获得有效的 BCD 表示。

于 2014-03-16T16:31:10.077 回答