2013-12-20 104 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