我怀疑Uno上的USB接口是否为您提供了唯一的序列号。任何数字都将是上传到芯片的代码的一部分,因此在多个Unos中将是相同的。
一种方法是使用单线接口的DS2401“硅序列号”芯片。那将只需要一个空闲引脚和一些代码(可能是代码问题)。
侵入性最小的方法,也许是最可靠的方法,将是简单地读回代码并对其进行总和检查。这正是我使用芯片签名检测器所做的。但是,它仅检测(按当前编写方式)引导加载程序签名。相当小的更改,它可以MD5-求和整个草图代码。
输出示例:
Signature detector.
Written by Nick Gammon.
Signature = 1E 95 0F
Fuses
Low = FF High = D6 Ext = FF Lock = CF
Processor = ATmega328P
Flash memory size = 32768
Bootloader in use: Yes
EEPROM preserved through erase: Yes
Watchdog timer always on: No
Bootloader is 512 bytes starting at 7E00
Bootloader:
7E00: 02 01 02 03 0405 06 07 08 09 0A 0B 0C 0D 0E 0F
7E10: 02 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
7E20: 02 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
7E30: 02 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
...
7FB0: 02 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
7FC0: 02 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
7FD0: 02 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
7FE0: 02 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
7FF0: 02 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
MD5 sum of bootloader = 56 72 75 2D 5D B5 0D BA 25 10 DF BE 87 D2 A1 27
该MD5总和(最后一行)实际上是该特定引导程序的签名。实际上,最新版本在表中查找它们:
MD5 sum of bootloader = FB F4 9B 7B 59 73 7F 65 E8 D0 F8 A5 08 12 E7 9F
Bootloader name: optiboot_atmega328
因此,您可以做的是,在上传草图时,生成十六进制代码的MD5总和。有相当简单的方法可以做到这一点。然后,您可以对源代码执行“ git tag”操作,然后(使用某种自动或手动过程)记住,特定MD5十六进制代码总和表示特定时刻的草图代码。
某种数据库,例如:
Chip: Uno
MD5 sum: D8 8C 70 6D FE 1F DC 38 82 1E CE AE 23 B2 E6 E7
Sketch: My_robot_sketch_42.ino
Git tag: version666
现在,要从开发板上找到源代码,就可以建立代码的MD5和(通过从开发板读回),然后在数据库中查找它。