Программатор EEPROM работает с последовательным монитором, но не с pySerial

Я пытаюсь изменить программатор eeprom Бена Пожирателя, чтобы прошить 32K eeprom, так как arduino имеет 32K программных данных, то данные не поместятся в программу. Поэтому я написал программу на python, использующую pySerial для отправки данных порциями по 256 байт по последовательному каналу. Программа arduino работает правильно, когда я вручную отправляю данные через последовательный монитор, а программа python работает правильно, когда я печатаю значения на консоль в качестве теста, но когда я фактически запускаю программу через serial, кажется, что она записывает только нули в eeprom. Кроме того, светодиод Rx на arduino, кажется, загорается правильными данными, но, как я уже сказал, записываются только нули.

Вот соответствующий код arduino:

void setup() {
  pinMode(SHIFT_DATA, OUTPUT);
  pinMode(SHIFT_CLK, OUTPUT);
  pinMode(SHIFT_LATCH, OUTPUT);
  digitalWrite(WRITE_EN, HIGH);
  pinMode(WRITE_EN, OUTPUT);
  
  Serial.begin(57600);
  dataArrPage = 0;
 
  //delay(1000);
  //Serial.println("Reading EEPROM");
  //printContents();

}

void loop() {
  if (Serial.available() > 0) {
    int len = Serial.readBytes(dataArr, 256);

    for (int i = 0; i < 256; i++) {
      writeEEPROM(dataArrPage + i, dataArr[i]); // writeEEPROM(address, data)
    }
    dataArrPage += 0x100;

    Serial.write('s'); //success, writing is done
  }
}

И соответствующий код Python:

import time
import serial
ser = serial.Serial('/dev/ttyUSB0', 57600)
time.sleep(4) # wait for arduino to initialize

filename = input("Enter file name: ")
f = open(filename, "rb")
data = f.read()

page = 0
for x in range(128): # 128 pages in 32K eeprom
    for i in range(256):
        #print(hex(data[(page * 256) + i])) # printing prints the correct values
        ser.write(data[(page * 256) + i])
    page += 1
    
    #wait until receive 's' from arduino
    while True:
        if ser.in_waiting > 0:
            suc = ser.read(size=1)
            if suc == b's':
                print("Success")
                break

print("Writing done")
f.close()
ser.close()

Я новичок, так что извините, если это что-то очевидное.

, 👍1

Обсуждение

А если дождаться перезагрузки Arduino и передать загрузчик после открытия последовательного порта?, @Majenko

У меня была задержка после открытия последовательного порта в коде python, но это не имело значения, ввод имени файла в любом случае занимает немного времени. Наверное, мне следует добавить его обратно., @bobbbob

Вы должны рассмотреть двусторонний протокол, поэтому Python отправляет что-то, а Arduino отвечает, как только эта операция будет выполнена со статусом. Таким образом, вы знаете, что происходит с обоих концов., @Majenko

Ладно, я попробую., @bobbbob

Я отредактировал код, чтобы напечатать "Успех", когда arduino закончит писать 256 байт, однако он печатает успех только 3 раза, а затем зависает. Будет ли вообще иметь значение содержимое файла? Это 32-килограммовый файл, который в основном состоит из нулей после некоторого текста в начале., @bobbbob

Это, вероятно, та вещь, которую было бы лучше отработать в сети чата. Если вы будете проходить через это постепенно, то не будет четкого вопроса с четким ответом., @timemage


1 ответ


Лучший ответ:

1

Я разобрался в этой проблеме. Цикл for записывал по одному байту за раз, что, вероятно, было недостаточно быстро и вызвало тайм-аут в арудино. Теперь код выглядит так:

page = 0
for x in range(128): # 128 pages in 32K eeprom
    datalst = []
    for i in range(256):
        datalst.append(data[(page * 256) + i])
        
    ser.write(datalst)

    #wait until receive 's' from arduino
    while True:
        if ser.in_waiting > 0:
            suc = ser.read(size=1)
            if suc == b's':
                print("Success")
                break
            
    page += 1

Я также изменил типы данных в скетче arduino, чтобы использовать те, что в stdint.h, который решил несвязанную ошибку. Дайте мне знать, если я должен опубликовать полный код для обоих.

,

Хм, странно. Поскольку ваша линия работает со скоростью 57600 бод, она передает всего около 6000 байт в секунду. Я бы подумал, что цикл Python работает быстрее. -- Однако, если последовательный интерфейс на основе USB подключается непосредственно к USB-модулю внутри AVR, скорость baudrate не поддерживается., @the busybee