在我目前的项目中,我有RFID徽章,它会向我的Arduino UNO
发送10个字符ID(例如:2700BBA0E8
)。该文档说“可打印的ASCII”,但我不知道它是否总是[0-9A-F]
。
在Arduino上,记忆力有限:
char
是1 byte
int
是2 bytes
long
是4 bytes
int
或long
会比char[10]
短并且比较简单(strcmp()
vs ==
),所以我想知道我怎么做将收到的10个字符逐个(连续)转换为int
或long
?
感谢您的帮助
答案 0 :(得分:1)
如前所述,您希望在long
内放置5个字节,只能存储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个ID:
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;
}