从 C# 桌面应用程序获取 Arduino Uno 控制器的唯一标识值
Get unique identification value of Arduino Uno controller from C# desktop application
我想弄清楚,什么以及如何从具有串行端口数据的 C# 桌面应用程序的特定 Arduino Uno 微控制器获取唯一标识号或任何其他类型的等效 ID
如果是 Uno,我打开了 COM3:
myport.PortName = comPort;
myport.BaudRate = 9600;
myport.Open();
但是我不确定,如何读取芯片ID等数据,例如EEPROM Get :
#include <EEPROM.h>
void setup() {
float f = 0.00f;
int eeAddress = 0;
Serial.begin(9600);
while (!Serial) {
}
Serial.print("Read float from EEPROM: ");
EEPROM.get(eeAddress, f);
Serial.println(f, 3);
secondTest(); //Run the next test.
}
struct MyObject {
float field1;
byte field2;
char name[10];
};
void secondTest() {
int eeAddress = sizeof(float);
MyObject customVar;
EEPROM.get(eeAddress, customVar);
Serial.println("Read custom object from EEPROM: ");
Serial.println(customVar.field1);
Serial.println(customVar.field2);
Serial.println(customVar.name);
}
void loop() {}
和 C#:
private void button1_Click(object sender, EventArgs e)
{
textBox1.Text = myport.ReadExisting();
}
我得到了一些完全被误解的结果:
Read float from EEPROM: ovf
Read custom object from EEPROM:
ovf
95
_^^]]]\\fedc
从特定微控制器获取唯一 ID 的输出变量必须是什么:
Serial.println(customVar.field2);
Serial.println(customVar.name);
官方Arduino UNO中使用的Atmega328P没有任何工厂编程的唯一ID。但是,Atmega328PB 确实有 10 字节长的预编程序列号。
Atmega328PB 似乎与Atmega328P 相当兼容。本应用笔记中描述了差异:http://ww1.microchip.com/downloads/en/AppNotes/Atmel-42559-Differences-between-ATmega328P-and-ATmega328PB_ApplicationNote_AT15007.pdf
您可以使用 boot_signature_byte_get() 函数从 avr/boot.h 读取序列号:https://www.nongnu.org/avr-libc/user-manual/group__avr__boot.html#gaf375d2543ba38dc56697b4f4bc37a717
有 Atmega328PB 芯片可用的开发板,"Atmega328PB arduino" 只需要 google。
如果您不能更换芯片,那么您需要自己生成唯一 ID 并将其编程到您的芯片中。
我想弄清楚,什么以及如何从具有串行端口数据的 C# 桌面应用程序的特定 Arduino Uno 微控制器获取唯一标识号或任何其他类型的等效 ID
如果是 Uno,我打开了 COM3:
myport.PortName = comPort;
myport.BaudRate = 9600;
myport.Open();
但是我不确定,如何读取芯片ID等数据,例如EEPROM Get :
#include <EEPROM.h>
void setup() {
float f = 0.00f;
int eeAddress = 0;
Serial.begin(9600);
while (!Serial) {
}
Serial.print("Read float from EEPROM: ");
EEPROM.get(eeAddress, f);
Serial.println(f, 3);
secondTest(); //Run the next test.
}
struct MyObject {
float field1;
byte field2;
char name[10];
};
void secondTest() {
int eeAddress = sizeof(float);
MyObject customVar;
EEPROM.get(eeAddress, customVar);
Serial.println("Read custom object from EEPROM: ");
Serial.println(customVar.field1);
Serial.println(customVar.field2);
Serial.println(customVar.name);
}
void loop() {}
和 C#:
private void button1_Click(object sender, EventArgs e)
{
textBox1.Text = myport.ReadExisting();
}
我得到了一些完全被误解的结果:
Read float from EEPROM: ovf
Read custom object from EEPROM:
ovf
95
_^^]]]\\fedc
从特定微控制器获取唯一 ID 的输出变量必须是什么:
Serial.println(customVar.field2);
Serial.println(customVar.name);
官方Arduino UNO中使用的Atmega328P没有任何工厂编程的唯一ID。但是,Atmega328PB 确实有 10 字节长的预编程序列号。
Atmega328PB 似乎与Atmega328P 相当兼容。本应用笔记中描述了差异:http://ww1.microchip.com/downloads/en/AppNotes/Atmel-42559-Differences-between-ATmega328P-and-ATmega328PB_ApplicationNote_AT15007.pdf
您可以使用 boot_signature_byte_get() 函数从 avr/boot.h 读取序列号:https://www.nongnu.org/avr-libc/user-manual/group__avr__boot.html#gaf375d2543ba38dc56697b4f4bc37a717
有 Atmega328PB 芯片可用的开发板,"Atmega328PB arduino" 只需要 google。
如果您不能更换芯片,那么您需要自己生成唯一 ID 并将其编程到您的芯片中。