使用pySerial从Python获取输入/输出错误

使用pySerial从Python获取输入/输出错误,python,serial-port,arduino,pyserial,Python,Serial Port,Arduino,Pyserial,我有一个Python脚本,通过它将数据包写入Arduino板。 有时,在将代码写入电路板时,pySerial会引发输入/输出错误,错误号为5 一些研究表明,这表明在写入表示与Arduino板连接的文件时出错 发送、仅发送单字节数据包的代码: try: # Check if it's already a single byte if isinstance(byte, str): if len(byte) == 1: # It is. Send it.

我有一个Python脚本,通过它将数据包写入Arduino板。 有时,在将代码写入电路板时,pySerial会引发输入/输出错误,错误号为5

一些研究表明,这表明在写入表示与Arduino板连接的文件时出错

发送、仅发送单字节数据包的代码:

try:
    # Check if it's already a single byte
    if isinstance(byte, str):
        if len(byte) == 1: # It is. Send it.
            self.serial.write(byte)
        else: # It's not
            raise PacketException
    # Check if it's an integer
    elif isinstance(byte, int):
        self.serial.write(chr(byte)) # It is; convert it to a byte and send it
    else: raise PacketException # I don't know what this is.
except Exception as ex:
    print("Exception is: " + ex.__getitem__() + " " + ex.__str__())
此代码打印的错误为:

操作系统错误输入/输出错误Errno 5

发送时,我的代码中是否有错误?我是否需要检查串行连接是否已准备好发送内容,或者发送后是否有延迟? 或者硬件或与硬件的连接可能有问题

编辑:我从pyserial查看了Linux实现,该实现只是将错误传递给我的代码。因此,没有新的真正的见解。
有没有一种很好的方法来测试程序中发生了什么?

我能立即在代码中看到的唯一问题是缩进问题--按如下方式更改代码:

try:
    # Check if it's already a single byte
    if isinstance(byte, str):
        if len(byte) == 1: # It is. Send it.
            self.serial.write(byte)
        else: # It's not
            raise PacketException
    # else, check if it's an integer
    elif isinstance(byte, int): 
        self.serial.write(chr(byte)) # It is; convert it to a byte and send it 
    else: 
        raise PacketException # I don't know what this is.
except Exception as ex:
    print("Exception is: " + ex.__getitem__() + " " + ex.__str__())

我怀疑你的错误来自于此,但请尝试这种方式,让我们知道!您只在
str
的情况下检查
byte
是否为
int
,因此
elif
根据定义总是失败。但我认为如果你的代码缩进是这样的话,你会得到一个语法错误,所以我认为你只是在发布时出错了,你真正的问题仍然隐藏着。

如果你在Windows上运行这个,不能在运行Python脚本的同时使用串行连接打开Arduino IDE。这将引发相同的错误。

很抱歉打扰您,但我非常确定该错误是由arduino重置自身并因此关闭与计算机的连接引起的

让我试着为您和其他有类似问题的人提供一些意见。首先,尝试使用串行监视器运行Arduino草图几次。您可以在IDE菜单的“工具”下找到串行监视器。您还可以键入Ctrl-Shift-M来调用串行监视器

串行监视器显示Arduino草图返回给您的内容。但是,它还允许您键入发送到Arduino草图的数据。换句话说,您只需使用串行监视器即可测试和调试串行数据流的两侧

看看出现了什么。假设您的草图试图通过Serial.print()发送数据,这通常会非常有用。几点注意事项。绝对确保串行监视器内设置的波特率与草图中的波特率完全匹配(在几乎所有情况下,9600都是一个不错的选择)


第二个要点至关重要。启动串行监视器将强制在Arduino板上重置。你的素描(总是)重新开始。这是一件好事,因为它每次都给你一次全新的体验。请注意,您可以强制重置,只需将波特率设置为9600(即使它已经是9600)。这使您可以在串行监视器内运行许多测试,而无需每次重新启动串行监视器。

我也想到了一个错误,两个程序或脚本会写入arduino。我们在linux机器上运行这个程序,脚本是唯一需要编写的东西。程序中没有线程。在错误出现之前,一些数据包被成功发送。因此,似乎不太可能有第二个程序写入连接。我也有同样的问题-您知道如何捕获/防止此错误吗?