2016-08-01 36 views
2

在我目前的項目中,我使用RFID徽章向我的Arduino UNO(例如:2700BBA0E8)發送10個字符的ID。該文檔顯示「可打印的ASCII」,但我不知道它是否始終爲[0-9A-F]將10個字符串轉換爲Arduino上的int

在Arduino的,所述存儲器是有限的:

  • char1 byte
  • int2 bytes
  • long4 bytes

一個intlong會比短和更簡單的比較(strcmp() vs ==),所以我想知道我可以如何將一個接一個地(串行)接收的10個字符轉換爲intlong

感謝您的幫助

+2

甚至10個十六進制數字[0-9A-F]將是5個字節,因此更多比一個「長」。 – SpamBot

+0

您可以將2個第一個值合併到一個int中,並將最後8個值合併爲一個long,然後與邏輯和兩個變量進行比較,但我確信額外的代碼會更多不僅僅是一個'strcmp',而且更復雜。 – AntonH

+0

@AntonH同樣,如果你把'int'和'long'放入同一個結構中,由於內存對齊的原因,這可能需要整個8個字節。 (我不知道Arduino的工作原理)。 –

回答

1

前面已經提到,想要把5個字節的long它只能存儲4個字節內。此外,你必須使用結構:

struct RFIDTagId 
{ 
    unsigned long low; 
    unsigned long high; // can also be unsigned char 
}; 

並使用類似的東西:

unsigned int hex2int(char c) 
{ 
    if (c >= 'A' && c <= 'F') 
     return (c - 'A' + 0x0A); 
    if (c >= '0' && c <= '9') 
     return c - '0'; 
    return 0; 
} 

void char2Id(char *src, RFIDTagId *dest) 
{ 
    int i = 0; 

    dest->low = 0; 
    for(i = 0; i < 8; ++i) 
    { 
     dest->low |= hex2int(src[i]) << (i*4); 
    } 

    dest->high = 0; 
    for(i = 8; i < 10; ++i) 
    { 
     dest->high |= hex2int(src[i]) << ((i-8)*4); 
    } 
} 

,並比較2個IDS:

int isRFIDTagIdIsEqual(RFIDTagId * lhs, RFIDTagId * rhs) 
{ 
    return lhs->low == rhs->low && lhs->high == lhs->high; 
} 

,或者如果你真的有C++:

bool operator==(RFIDTagId const & lhs, RFIDTagId const & rhs) 
{ 
    return lhs.low == rhs.low && lhs.high == lhs.high; 
} 
+0

感謝您的回答,我正在尋找這種「按位移」的方法。但是現在,作爲一個概念證明,是否有辦法在10個字符ID中創建一個唯一的「校驗和」? – Max13

+0

也許看看CRC32,它會計算一個數據散列。這個散列存儲在4字節中,所以你保存了一個字節。這是一個相對簡單的算法,易於在嵌入式設備中實現。恕我直言,根據RFID ID的特殊性(根據某些RFID標準,ID的一部分是製造商,另一部分是製造商,另一部分是序列號),碰撞的可能性非常小,因此您可以使用它來識別標籤。但爲了讓您的5字節數據具有完全獨特的散列,您必須至少使用5個字節的散列。 – Garf365

+0

Thx。實際上,我想使用RFID CC製作電子版的壟斷版。最大是4名球員,所以即使我把最後4個字符變成int或long,我認爲碰撞風險幾乎爲0%。所以,要確定,CRC32將是完美的。 – Max13