Программатор 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()
Я новичок, так что извините, если это что-то очевидное.
@bobbbob, 👍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
- Не удается связаться с ардуино с помощью python (Windows)
- Последовательная связь Arduino с Python: отправка массива
- Построение графика на Python с использованием Tkinter Canvas
- Как отправить целое число через pyserial с Python на Arduino и получить тот же результат?
- Сброс последовательного порта Arduino в последовательном мониторе и Python
- Отправка числа с плавающей запятой из python в arduino
- Serial Comm. проблема синхронизации между Arduino и Pyserial
- Связь между Python и Arduino ненадежна
А если дождаться перезагрузки Arduino и передать загрузчик после открытия последовательного порта?, @Majenko
У меня была задержка после открытия последовательного порта в коде python, но это не имело значения, ввод имени файла в любом случае занимает немного времени. Наверное, мне следует добавить его обратно., @bobbbob
Вы должны рассмотреть двусторонний протокол, поэтому Python отправляет что-то, а Arduino отвечает, как только эта операция будет выполнена со статусом. Таким образом, вы знаете, что происходит с обоих концов., @Majenko
Ладно, я попробую., @bobbbob
Я отредактировал код, чтобы напечатать "Успех", когда arduino закончит писать 256 байт, однако он печатает успех только 3 раза, а затем зависает. Будет ли вообще иметь значение содержимое файла? Это 32-килограммовый файл, который в основном состоит из нулей после некоторого текста в начале., @bobbbob
Это, вероятно, та вещь, которую было бы лучше отработать в сети чата. Если вы будете проходить через это постепенно, то не будет четкого вопроса с четким ответом., @timemage