Запись последовательных данных в Arduino с использованием pyserial на Windows - PullRequest
0 голосов
/ 22 января 2019

У меня возникли проблемы с записью последовательных данных в 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, пытаясь решить эту проблему, но либо ответа нет, либо ответ не работает для меня. Я старался изо всех сил, чтобы покрыть все ответы, которые я нашел.

Спасибо

Редактировать

Я изменил приведенный выше тестовый код, чтобы включить в него больше изменений, которые не устранили проблему.

1 Ответ

0 голосов
/ 22 января 2019

У меня тоже была проблема с arduino и python, я просто дам вам несколько советов, сначала добавьте задержку после подключения arduino, так:

com.open()
time.sleep(1)

Это моя функция отправки, которая будет отправлять с новой строкойсимвол:

def ArduinoSend(data):
    arduino.write(format(('{}\n').format(data)).encode())

и Вот мои функции чтения и чтения строки:

def ArduinoRead():
    if Serial.in_waiting:
        data = arduino.read().decode('ascii').strip()
    return data

def ArduinoReadLine():
    if Serial.in_waiting:
        data = arduino.readline().decode('ascii').strip()
        return data

И это мой цикл:

while arduino.is_open:
        info = ArduinoRead()
        time.sleep(0.2)

Надеюсь, это поможет.

...