У меня возникли проблемы с записью последовательных данных в Arduino Uno с использованием pyserial на 64-битной машине Windows 10 с Python 3.7.
Вот урезанная версия кода, который я тестирую:
SerialEcho.ino
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
Serial.begin(9600);
Serial.println("Serial connected");
}
void loop() {
int c = Serial.read();
if (c < 0) return;
digitalWrite(LED_BUILTIN, HIGH);
Serial.write(c);
}
SerialEcho.py
from sys import stdout
import serial
import time
port = "COM14"
baud_rate = 9600
com = serial.Serial()
com.port = port
com.baudrate = baud_rate
# Doesn't effect write issues
com.timeout = 0.1
# 0 = no exception but no echo, anything else = instant SerialTimeoutException
com.writeTimeout = 0
# setDTR works as expected but doesn't help the issue
# True = Arduino resets on open, False = Arduino doesn't reset on open
com.setDTR(True)
# EDIT: This doesn't seem to do anything
#com.setRTS(False)
com.open()
# Adding a sleep here has no effect because I am already waiting for a character to come through from the Arduino
time.sleep(1)
# Wait for a character to come through to ensure there is no issue with auto resetting
while not com.read():
pass
print("Connected")
# This should be echoed back but it isn't
# EDIT: adding a new line character doesn't fix the issue
com.write(b'55555555555555555555555555555555555\n')
# Neither of these lines have any effect on the issue
#com.flush()
#com.flushOutput()
# This is always 0
#print(com.outWaiting())
print(com.out_waiting)
while True:
c = com.read()
if c:
print(c, end=" ")
com.write(b'6')
stdout.flush()
Проблема, с которой я сталкиваюсь при запуске приведенного выше кода, заключается в том, что я не получаю эхо от Arduino. Я вижу оператор печати Connected
, а также символы erial connected
, проходящие (как и ожидалось), но не 5
s или 6
s, и встроенный светодиод не включается.
Я знаю, что нет проблем с Arduino или его подключением к компьютеру, потому что он отлично работает с монитором Arduino Serial (все символы очень хорошо отражаются, а встроенный светодиод включается после получения первого символа) .
Если я использую ненулевое значение для writeTimeout
, я получаю следующую трассировку, как только com.write
запускается (даже если я установил writeTimeout
в 1000
):
Traceback (most recent call last):
File "SerialEcho/SerialEcho.py", line 30, in <module>
com.write(b'55555555555555555555555555555555555')
File "C:\Users\James\AppData\Local\Programs\Python\Python37-32\lib\site-packages\serial\serialwin32.py", line 323, in write
raise writeTimeoutError
serial.serialutil.SerialTimeoutException: Write timeout
Я также получаю ту же трассировку, если пытаюсь отправить символ в программу arduino, используя miniterm
.
Я прокомментировал в SerialEcho.py
пару других изменений, которые я пробовал, которые не решили проблему.
Я сталкивался с некоторыми сообщениями, предлагающими проблемы с различными версиями pyserial на windows Я пробовал вышеупомянутое на большинстве комбинаций Python 3.7 32-битных и 64-битных наряду с pyserial 3.4, 2.7 и 2.6, но ни одна из них не работает для меня.
Я сталкивался с множеством различных постов здесь, на переполнении стека, а также на форумах Arduino, пытаясь решить эту проблему, но либо ответа нет, либо ответ не работает для меня. Я старался изо всех сил, чтобы покрыть все ответы, которые я нашел.
Спасибо
Редактировать
Я изменил приведенный выше тестовый код, чтобы включить в него больше изменений, которые не устранили проблему.