2013-12-20 66 views
-1

我正在为微控制器(mbed LPC1768)制作一个程序,并且有几个问题需要解码uint8_t的串行输入。十六进制字符数组2由2个字符到uint8_t

我得到一个充满来自外部设备输入的char ackBuffer[20];。 我们得到的是,例如:F040A34B6785121\r

我想要做的是得到一个uint8_t数组,其中每个数字是由2个字符的十六进制值的符号。 F将显示来自外部设备的消息已启动,并且回车是每条消息的结尾。

所以我想uint8_t数组是:

0x04 
0x0A 
0x34 
... 

为了使它更难它可以是ackBuffer是一个更小的尺寸,因此,例如仅F04004A\r(如果这可以很容易固定的,那么它的很漂亮,但我可以解决此问题我自己。

谢谢!

+0

如何将字符串“04”转换为整数0x04? –

+0

@OliCharlesworth这样做的一个旧方法是'scanf(“%2.2x”,&val)'。 –

+0

ackBuffer [0] ='0'; ackBuffer [16] = 0;/*空终止* /然后按照http://stackoverflow.com/questions/1070497/c-convert-hex-string-to-signed-integer – IdeaHat

回答

0

所以我假设的ackMessage必须'F'开始和结束'\r',而且我甚至假设塔t,因为你在微控制器上工作,任何超出要求的东西(例如,库函数)应该被避免。既然你只需要遍历缓冲区:

uint8_t charToHex(unsigned char value) 
{ 
    if (value >= '0' && value <= '9') return value - '0'; 
    else if (value >= 'A' && value <= 'F') return value - 'A' + 10; 
    else if (value >= 'a' && value <= 'f') return value - 'a' + 10; 
    assert(false); 
} 

#define BUFFER_SIZE (20) 

int main(void) 
{ 
    char ackBuffer[BUFFER_SIZE] = "F12345890AB\r"; 
    uint8_t result[(BUFFER_SIZE-2)/2]; // at most 9 bytes since it's 20 - 2/2 

    char* ptr = ackBuffer; 

    assert(*ptr == 'F'); 
    ++ptr; 

    int count = 0; 
    while(*ptr != '\r') 
    { 
    uint8_t value = charToHex(*ptr) << 4 | charToHex(*(ptr+1)); 
    result[count++] = value; 
    ptr += 2; 
    } 

    int i; 
    for (i = 0; i < count; ++i) 
    printf("%x\n", result[i]); 

    return 0; 
} 

记住,你必须与使用的编码一个charToHex一致,或许你可以需要周围代码中的一些更理智的检查。

+1

授人以鱼... –

+0

@OliCharlesworth:我很无聊:( – Jack

+0

感谢队友为快答案会努力做到这 – Jannes