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-通过串行通信发送大量数据_Arduino_Serial Port - Fatal编程技术网

Arduino-通过串行通信发送大量数据

Arduino-通过串行通信发送大量数据,arduino,serial-port,Arduino,Serial Port,我正在尝试使用我的arduino mega构建一个简单的闪存程序员(用于39SF020A)。我编写了C代码和Python脚本来发送数据(一切正常)。 我需要传输大约32k的十六进制数据,但在我的设置下,只有10k的数据需要大约4分钟(115200波特),我发现这不必要太长。目前,我使用终止符(我选择了“$”)通过串行(从Python)发送我的值,因此例如“3F$”。地址在arduino上计算,因此无需发送 在我的arduino代码中,我有 String已接收\u String=Serial.re

我正在尝试使用我的arduino mega构建一个简单的闪存程序员(用于39SF020A)。我编写了C代码和Python脚本来发送数据(一切正常)。 我需要传输大约32k的十六进制数据,但在我的设置下,只有10k的数据需要大约4分钟(115200波特),我发现这不必要太长。目前,我使用终止符(我选择了“$”)通过串行(从Python)发送我的值,因此例如“3F$”。地址在arduino上计算,因此无需发送

在我的arduino代码中,我有

String已接收\u String=Serial.readStringUntil(“$”)

在使用arduino将每个字节编程到FLASH之后,它会返回一个“\n”,让Python知道它已经准备好接收下一个字节(Python正在等待接收一个“行”,然后继续)。我真的不确定这是否是一种方法,如果一次只发送一个字节是个好主意,如果不是,我应该在arduino上解析多少字节,以及如何解析它们?反馈回路有用吗

谢谢

Python代码: (“文件”包含所有数据)

Arduino代码(只是其中的一部分)

if(Serial.available()>0){
已接收字符串\u String=Serial.readStringUntil(“$”);
程序数据(接收到的字符串.toInt(),程序地址);
程序地址++;
}
无效程序数据(字符数据输入,无符号长地址)
{
数字写入(OE,高);
数字写入(CE,低电平);
写字节(0xAA,0x5555);
写字节(0x55,0x2AAA);
写字节(0xA0,0x5555);
写入字节(数据输入,地址);
Serial.print(“\n”);//Python的反馈
延迟微秒(30);//为了安全起见
}
void writeByte(字符数据,无符号长地址)
{
setDataAs(输出);
数字写入(OE,高);
数码书写(我们,高);
坐位地址(ADRES);
setData(数据输入);
数字写入(WE,低);
延迟微秒(1);
数码书写(我们,高);
}
//将数据总线设置为输入或输出
void setDataAs(char dir){
对于(无符号整数i=0;i
请不要只写一页就解释代码的作用。只需在代码中添加一些注释。这更有用。对于每个字节的数据,您向arduino传输3个字节,向arduino传输1个字节。如果我计算正确的话,对于10kB的数据,这大约需要30秒。如果在现实中需要8倍的时间,那么主要问题一定是在其他地方。不可能是你愚蠢(错误)的String.toInt迂回(String.toInt()的结果是什么?
?)@datafiddler是的,但闪存中的数据是正确的。我已经包括了代码的其他部分,首先,我认为延迟会在传输的某个地方。。。所以我有一些糟糕的循环,让我们看看我是否可以优化it@datafiddler谢谢你的评论,我累了,我读毫秒而不是微秒;)@小猪;=)克拉利克的运气不好,答案(暂时)不见了。也许他应该把秘密
数据[data\u size]
位安排到atmega端口,直接寻址,而不是使用pinMode和digitalWrite。我希望你能感觉到这有多重要。请不要写一页纸来解释你的代码是做什么的。只需在代码中添加一些注释。这更有用。对于每个字节的数据,您向arduino传输3个字节,向arduino传输1个字节。如果我计算正确的话,对于10kB的数据,这大约需要30秒。如果在现实中需要8倍的时间,那么主要问题一定是在其他地方。不可能是你愚蠢(错误)的String.toInt迂回(String.toInt()的结果是什么??)@datafiddler是的,但闪存中的数据是正确的。我已经包括了代码的其他部分,首先,我认为延迟会在传输的某个地方。。。所以我有一些糟糕的循环,让我们看看我是否可以优化it@datafiddler谢谢你的评论,我累了,我读毫秒而不是微秒;)@小猪;=)克拉利克的运气不好,答案(暂时)不见了。也许他应该把秘密
数据[data\u size]
位安排到atmega端口,直接寻址,而不是使用pinMode和digitalWrite。我希望你能感觉到这有多重要。
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)
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));
}