10个字符串到Arduino上的int

时间:2016-08-01 10:00:49

标签: c++ c avr arduino-uno

在我目前的项目中,我有RFID徽章,它会向我的Arduino UNO发送10个字符ID(例如:2700BBA0E8)。该文档说“可打印的ASCII”,但我不知道它是否总是[0-9A-F]

在Arduino上,记忆力有限:

  • char1 byte
  • int2 bytes
  • long4 bytes

intlong会比char[10]短并且比较简单(strcmp() vs ==),所以我想知道我怎么做将收到的10个字符逐个(连续)转换为intlong

感谢您的帮助

1 个答案:

答案 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;
}