Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
arduino项目的唯一计算机ID_Arduino - Fatal编程技术网

arduino项目的唯一计算机ID

arduino项目的唯一计算机ID,arduino,Arduino,我正在为arduino构建一些遥感器节点,它们将使用RF将数据传输回基站。是否有某种独特的id备份到arduino中,我可以使用它来识别基站的远程arduino传感器节点?如果没有,其他人如何解决这个问题 我意识到,当我编译该节点的源代码时,我可以硬编码一个节点ID,但这似乎不能很好地扩展。我需要的是类似于http land中的mac地址的东西。很抱歉,我知道的所有atmega芯片都不会提供唯一的ID,但xmega系列会提供(但是你离arduino真的很远) 您可以在编译时将一个值放入eepro

我正在为arduino构建一些遥感器节点,它们将使用RF将数据传输回基站。是否有某种独特的id备份到arduino中,我可以使用它来识别基站的远程arduino传感器节点?如果没有,其他人如何解决这个问题


我意识到,当我编译该节点的源代码时,我可以硬编码一个节点ID,但这似乎不能很好地扩展。我需要的是类似于http land中的mac地址的东西。

很抱歉,我知道的所有atmega芯片都不会提供唯一的ID,但xmega系列会提供(但是你离arduino真的很远)

您可以在编译时将一个值放入eeprom中,但如上所述,它的伸缩性不好

除非,作为mpflaga,您可以使用“-U EEPROM:w:mydata.eep”参数将SN#直接写入EEPROM


您也可以实现一些功能,比如在总线中请求ID,如果它是免费的,则可以使用并存储它,但会给您的协议增加很多复杂性

我在尝试自己找到答案时偶然发现了这个问题,并决定使用注释()中提供的链接中引用的DS2401


无论如何,我的项目中都会有1线总线,所以有一个额外(而且相当便宜)的组件并不重要,它将提供全球唯一的id,而不管所使用的板型号和芯片如何(也适用于克隆MFG,例如,我有两块DCcduino UNO板的CH340G用于通信,而不是Arduino UNO的Atmega8U2/Atmega16U2和其他Arduino板的FTDI)。

我知道这是一篇老文章,但我很好奇你是如何解决这个问题的。我目前正在生成一个唯一的ID,末尾有一个校验位(使用与UPC代码相同的方法)

目前,在使用单独的草图将序列号写入EEPROM之前,我会使用一个外部程序来管理序列号。所有这些都是通过构建过程控制的。听起来很复杂,但我真的想不出更好的方法(除了硬编码序列号)

我考虑了DS2401的方法;但是,我无法证明额外的硬件是合理的。我没有看到写入EEPROM和使用另一个串行写入的硬件组件之间的区别

我还有一个SerialNumber类,它读取可以在任何项目中使用的数据。

(很抱歉英语不好,我是德国人) 据我所知,Arduino没有唯一的产品ID,但是重置后RAM中的每个字节都有一个随机值,每个Arduino上的随机值都不同。 此程序应在每个arduino上输出不同的值:

void setup()
{
  uint32_t checksum = 0;
  for(uint16_t u = 0; u < 2048; u++)
  {
    checksum += * ( (byte *) u );//checksum += the byte number u in the ram
  }
  Serial.begin(115200);
  Serial.println(checksum , HEX);
}
void loop()
{
}
void setup()
{
uint32\u t校验和=0;
对于(uint16_t u=0;u<2048;u++)
{
校验和+=*((字节*)u);//校验和+=ram中的字节数u
}
序列号开始(115200);
Serial.println(校验和,十六进制);
}
void循环()
{
}
更新:
你只需在eeprom上写一个数字->你有你唯一的ID,这很烦人,Arduino设备上没有可用的硬件ID。我创建了一个小库(70行代码),将你自己的ID存储在eeprom内存中,稍后验证

您可以使用它来防止在设备上安装错误的草图并损坏外围设备或用于任何其他类似目的:


您的射频设备是否有ID。例如,蓝牙有MAC和/或序列号。不幸的是,射频没有ID,希望它有。您可以从EEPROM中读取Arduino的序列号,如下所示:您可以使用avrdude将序列号直接写入EEPROM,使用“-U EEPROM:w:mydata.eep”参数。重置后,它看起来总是非常相似(只是在1个arduino上进行了测试),但在刷新不同的草图,然后返回唯一的ID草图后,我得到了新的值!谢谢,这是生成半随机值的一种很好的方法!