我在 Arduino IDE 上使用 Raspberry pi pico。我正在使用这个库githublink。此链接中有 3 个示例,ArduinoUniqueID 和 ArduinoUniqueID8 不打印任何内容。艾德说
WARNING: library ArduinoUniqueID claims to run on avr, esp8266, esp32, sam, samd, stm32 architecture(s) and may be incompatible with your current board which runs on mbed_rp2040 architecture(s).
(但 GitHub 说我们添加了 RP2040)
当我尝试使用最后一个示例 ArduinoUniqueIDSerialUSB 时,它会打印一些内容,但它们不是正确的值。它打印这些:
UniqueID: 30 00 33 00 39 00 31 00 36 00 30 00 45 00 36 00 32 00 41 00 38 00 32 00 34 00 38 00 43 00 33 00
UniqueID: 34 00 38 00 43 00 33 00
此处正确的唯一 ID 值:(我用 micropython 打印了这些)
hex value of s = e660a4931754432c
type s = <class 'bytes'>
s = b'\xe6`\xa4\x93\x17TC,'
我什至不知道
34 00 38 00 43 00 33 00
是什么类型,我尝试转换十六进制,但它打印出相同的东西。
如何使用 Arduino 代码找到 pico 的唯一 ID?
Pico(以及大多数 RP2040 板)的唯一 ID 由闪存的序列号确定。 Pico SDK 具有获取该 ID 的函数。您可以使用
flash_get_unique_id(uint8_t* id_out)
直接从闪存中检索它,这就是上面链接的库所做的。相关文档位于此处。
或者,您可以从 MCU 获取唯一 ID。用于检索 ID 的两个函数是
pico_get_unique_board_id(pico_unique_board_id_t* id_out)
(以十六进制数组形式返回 ID)或 pico_get_unique_board_id_string(char* id_out, uint len)
(以字符串形式返回 ID)。相关文档位于此处。
这些值是十六进制的,来自其 Unique_ID 缓冲区,该缓冲区看起来未正确填充唯一 id。下面的代码应该做你需要的事情。
uint8_t UniqueID[8];
void UniqueIDdump(stream)
{
flash_get_unique_id(UniqueID);
stream.print("UniqueID: ");
for (size_t i = 0; i < 8; i++)
{
if (UniqueID[i] < 0x10)
stream.print("0");
stream.print(UniqueID[i], HEX);
stream.print(" "); }
stream.println();
}
“UniqueID: 30 00 33 ”等是unicode字符串“039160E62A8248C348C3”而不是十六进制。
对于 Earls pico 核心,只需将
extern "C" void flash_get_unique_id(uint8_t *p);
添加到您的草图中,您就可以访问上述 UniqueIDdump 示例所需的功能
为那些将来寻找相同解决方案的人添加此内容。 Earl 在他的 pico 核心中添加了一个
rp2040.getChipID()
函数,它将提供 char * (c string)
结果。代码片段是:
// Print out my unique Id
Serial.print("Unique Id: "); Serial.println(rp2040.getChipID());
这是结果:
Unique Id: E66138528361BB32