在 Windows 上使用 pyserial 将串行数据写入 Arduino

Posted

技术标签:

【中文标题】在 Windows 上使用 pyserial 将串行数据写入 Arduino【英文标题】:Writing serial data to Arduino using pyserial on Windows 【发布时间】:2019-01-22 07:22:13 【问题描述】:

我在使用 Python 3.7 的 64 位 Windows 10 机器上使用 pyserial 将串行数据写入 Arduino Uno 时遇到了一些问题。

这是我正在测试的代码的精简版:

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 的字符(如预期的那样),但没有5s 或6s 并且内置LED 没有打开。

我知道 Arduino 或其与计算机的连接没有问题,因为它使用 Arduino 串行监视器工作得很好(所有字符都可以很好地回显,并且内置 LED 在接收到第一个字符后会亮起) .

如果我对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

如果我尝试使用 miniterm 将字符发送到 arduino 程序,我也会得到相同的回溯。

我在SerialEcho.py 中评论了一些我尝试过的其他更改,但没有解决问题。

我遇到了一些帖子,这些帖子暗示 Windows 上不同版本的 pyserial 存在问题。我已经在 Python 3.7 32 位和 64 位以及 pyserial 3.4、2.7 和 2.6 的大多数组合上尝试了上述方法,但没有一个对我有用。

在尝试解决此问题时,我在 Stack Overflow 和 Arduino 论坛上遇到了许多不同的帖子,但要么没有答案,要么答案对我不起作用。我已尽力涵盖我找到的所有答案。

谢谢

编辑

我已经修改了上面的测试代码以包含更多没有解决问题的更改。

【问题讨论】:

【参考方案1】:

我对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)

希望这会有所帮助。

【讨论】:

您好,感谢您的回复。不幸的是,这些建议并没有解决问题。查看我对问题所做的修改,看看我尝试了什么。

以上是关于在 Windows 上使用 pyserial 将串行数据写入 Arduino的主要内容,如果未能解决你的问题,请参考以下文章

Windows 中 Pyserial 和 Pexpect 的使用

pySerial 串口工具简介

Windows 下的 pySerial API 简介

如何使用 pyserial 将文件逐行写入 com0com?

尝试在 WinXP 上使用 pyserial 打开串行端口 - >“拒绝访问”

pyserial 挺强大的