【问题标题】:10 char string to int on Arduino在 Arduino 上将 10 个字符字符串转换为 int
【发布时间】:2016-08-01 10:00:49
【问题描述】:

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

在 Arduino 上,内存是有限的:

  • char1 byte
  • int2 bytes
  • long4 bytes

intlong 会比 char[10] 更短并且更易于比较(strcmp()==),所以我想知道如何将收到的 10 个字符一一转换(在串行)到intlong

感谢您的帮助

【问题讨论】:

  • 即使 10 个十六进制数字 [0-9A-F] 也是 5 个字节,因此不止一个 long
  • 您可以将前 2 个值放入一个 int 中,将后 8 个值放入一个 long 中,并与逻辑和两个变量进行比较,但我很确定额外的这样做的代码不仅仅是做一个strcmp,而且更复杂。
  • @AntonH 此外,如果您将 intlong 放入同一个结构中,由于内存对齐,这可能需要整个 8 个字节。 (我不知道这对 Arduino 到底是如何工作的)。
  • @MarkusLaire 可能,是的。有一些方法可以绕过内存对齐,例如使用 pragma pack,但我不知道它们与 Arduino 的配合情况如何(尽管我看不出它不应该这样做的原因)。
  • 说到“比较简单”,AVR是一个8位处理器,它只有8位寄存器。因此,您不会像在 32 位处理器上那样获得字比较的好处。

标签: c++ c avr arduino-uno


【解决方案1】:

如前所述,您希望将 5 个字节放入一个只能存储 4 个字节的 long 中。另外,你必须使用结构:

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

【讨论】:

  • 感谢您的回答,我正是在寻找这种“按位移位”方法。但是现在,作为概念证明,有没有办法从 10 个字符 ID 中生成唯一的“校验和”?
  • 也许看看 CRC32,它计算数据的哈希值。此哈希存储在 4 个字节上,因此您保存一个字节。这是一个相对简单的算法,很容易在嵌入式设备中实现。恕我直言,根据 RFID ID 的特殊性(根据一些 RFID 标准,ID 的一部分是制造商,另一部分是序列号),发生碰撞的概率非常小,因此您可以使用它来识别标签。但是要对 5 字节数据进行完全完美的唯一哈希,您必须至少采用 5 字节哈希。
  • 谢谢。实际上,我想使用RFID CC制作电子版的垄断。最多 4 名玩家,所以即使我将最后 4 个字符设为 int 或 long,我认为碰撞风险几乎为 0%。因此,为了确保 CRC32 是完美的。
  • 这是计划。第一个元素将是银行,然后我正在等待我将在其上“挖掘”电气轨道以粘合 RGB 条纹(以引导属性)的电路板。我肯定会发布这个过程的视频。如果你有兴趣,我可以在这里发布 github
  • 我很有趣,是的:)。一切都将在 arduino 上完成?或者arduino仅用于获取标签ID?
猜你喜欢
  • 2011-12-16
  • 2021-10-09
  • 2015-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-02
相关资源
最近更新 更多