PN532 RFID with ESP32 (ESP-IDF) 将 uint8_t UID 传递给字符串

PN532 RFID with ESP32 (ESP-IDF) Passing uint8_t UID to a string

提问人:Andrew Taylor 提问时间:9/22/2023 最后编辑:Christoph RackwitzAndrew Taylor 更新时间:9/30/2023 访问量:123

问:

我正在尝试使用 esp32 的 esp-idf 框架在 platformio 中编写一个相当基本的程序。我有主要的工作,但我正在为我认为非常基本的东西而苦苦挣扎!

我正在使用 pn532 库通过 SPI 与 RFID 读取器进行通信。这真的很有效。我可以让它将 UID 输出到日志中。我正在努力做的是用那个 UID 做任何事情。

        uint8_t uid[] = {0, 0, 0, 0, 0, 0, 0}; // Buffer to store the returned UID
        
        uint8_t uidLength;                     // Length of the UID (4 or 7 bytes depending on ISO14443A card type)
       // char myStr[] = "hello";


        // Wait for an ISO14443A type cards (Mifare, etc.).  When one is found
        // 'uid' will be populated with the UID, and uidLength will indicate
        // if the uid is 4 bytes (Mifare Classic) or 7 bytes (Mifare Ultralight)
        success = pn532_readPassiveTargetID(&nfc, PN532_MIFARE_ISO14443A, uid, &uidLength, 0);

        if (success)
        {
            // Display some basic information about the card
            ESP_LOGI(TAG, "Found an ISO14443A card");
            ESP_LOGI(TAG, "UID Length: %d bytes", uidLength);
            ESP_LOGI(TAG, "UID Value:");

            esp_log_buffer_hexdump_internal(TAG, uid, uidLength, ESP_LOG_INFO); 

上面的代码来自库示例。它将 UID 存储在uint8_t缓冲区中,这很好。但是如何将此 UID 值用作字符串呢?

我期待一些类似于uid的东西。ToString(),但这不存在。我是 esp-idf 的新手,所以请温柔一点!我尝试过搜索,我尝试过各种方法,例如转换器(uint8t uid),但我不确定如何正确使用它,因为我无法让它工作。我发现了 nul 终结器,但这些到底是什么,我该如何使用它们?

现在,我只是尝试在oled显示屏上显示UID(作为字符串)。但最终我想将其传递给 RestfulAPI 以对数据库表进行查找。我在Arduino IDE中一切正常,但我正在努力改进它!

感谢您的帮助!

安德鲁

C esp-idf 平台io uint8t

评论

0赞 Andrew Taylor 9/27/2023
到目前为止,我整个周末和一周都试图玩这个。我仍然无法理解它。UID 编号为 7e 34 cc fc。我试过做 ESP_LOGI(TAG, “UID STRING IS %x”, *uid);这会显示前两个字符 (7e),但如何让它显示整个数字?
0赞 hcheung 9/28/2023
您正在使用用 c 编码的。语法,例如建议语言,例如 c++,其中对象具有 .在C语言中,情况并非如此,因为C语言根本不存在类的概念。esp-idfuid.ToString()uidToString()

答:

0赞 Andrew Taylor 9/28/2023 #1

好的,我不确定这是否是正确的方法。但经过一番摆弄,我想出了这个。

我也不欣赏uint8_t是一个数组。

我设法使用以下命令将数据输出为字符串:

ESP_LOGI(TAG, "STRING UID NUMBER IS %x-%x-%x-%x", uid[0], uid[1], uid[2], uid[3]);

这是正确的吗?或者有更好的方法来实现这一目标?

我希望现在我可以使用这个值与sql DB中的值进行比较。但这必须等到我有更多时间!:)

谢谢 安德鲁

评论

0赞 hcheung 9/28/2023
拿起一本关于c的书读一读。了解标准库(如 stdio.h)附带的数组、C 字符串和函数,特别是 sprintf(),然后尝试类似 (或 make a for..循环循环遍历 uid 数组),其中 str 被声明并初始化为 .然后,您可以使用带有 的 printf() 打印输出。sprintf(str, "%02X-%02X-%02X-%02X", uid[0], uid[1], uid[2], uid[3]);char str[12]={0};printf("%s\n", str);