我正在尝试使用arduino mega构建一个简单的FLASH存储器编程器(用于39SF020A)。我编写了C代码和Python脚本来发送数据(所有这些都按预期工作)。 我需要传输约32k的十六进制数据,但是通过我的设置,仅10k的数据就花费了大约4分钟(115200 BAUD),这让我发现不必要的长时间。目前,我正在通过串行(从Python)发送带有终止符的值(我选择了“ $”),因此示例为“ 3F $”。地址是在arduino上计算的,因此无需发送它们。
在我的arduino代码中,我有
String received_string = Serial.readStringUntil('$');
,然后使用arduino将每个字节编程为FLASH之后,它会发回“ \ n”以告知Python,它已准备好接收下一个字节(Python正在等待接收“行”,然后继续)。我不确定这是否是一种方法,如果一次只发送一个字节是个好主意,如果不是,我应该如何在arduino上解析它们?反馈回路有用吗?
谢谢。
Python代码: (“文件”包含所有数据)
for item in file[1:]:
ser.write((item + "$").encode("ascii"))
line = ser.readline()
i += 1
if i >= top:
break
elif (i % 100) == 0:
print(i)
Arduino代码(只是其中的一部分)
if (Serial.available() > 0){
String received_string = Serial.readStringUntil('$');
programData(received_string.toInt(),program_adress);
program_adress++;
}
void programData(char data_in, unsigned long adress)
{
digitalWrite(OE,HIGH);
digitalWrite(CE,LOW);
writeByte(0xAA, 0x5555);
writeByte(0x55, 0x2AAA);
writeByte(0xA0, 0x5555);
writeByte(data_in, adress);
Serial.print("\n"); // Feedback for Python
delayMicroseconds(30); // Just to be on the safe side
}
void writeByte(char data_in, unsigned long adress)
{
setDataAs(OUTPUT);
digitalWrite(OE,HIGH);
digitalWrite(WE,HIGH);
setAdress(adress);
setData(data_in);
digitalWrite(WE,LOW);
delayMicroseconds(1);
digitalWrite(WE,HIGH);
}
// Sets data BUS to input or output
void setDataAs(char dir){
for (unsigned int i = 0; i < data_size ;i++) pinMode(data[i],dir);
}
// Sets data to specific values
void setData(char data_i){
setDataAs(OUTPUT);
for (int i = 0; i < data_size;i++) { digitalWrite(data[i],bitRead(data_i,i)); }
}
void setAdress(long adr){
// Set all adresses
for (int i = 0; i < adresses_size;i++)
digitalWrite(adresses[i],bitRead(adr,i));
}