使用pySerial时Python出现输入/输出错误

4 投票
4 回答
17975 浏览
提问于 2025-04-15 12:15

我有一个Python脚本,它通过pySerial把数据包写入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__())

这个代码打印出的错误信息是:

操作系统错误 输入/输出错误 错误代码5

在发送数据时,我的代码有没有什么问题?我需要检查串口连接是否准备好发送数据吗?还是说在发送后需要加个延迟?或者可能是硬件本身或者与硬件的连接出现了问题?

编辑:我查看了pyserial在Linux上的实现,发现它只是把错误传递给了我的代码,所以从那里没有得到新的实际见解。有没有好的方法来测试程序中发生了什么?

4 个回答

1

我看到你代码里唯一明显的问题就是缩进不对。你可以把代码改成这样:

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__())

我不太确定这个问题是不是导致你出错的原因,但你可以试试这样做,然后告诉我们结果!你在检查 byte 是否是 int 时,只在它是 str 的情况下进行判断,所以 elif 这个条件总是会失败。不过我觉得如果你真实的代码缩进是这样的,你应该会遇到 SyntaxError(语法错误),所以我猜测你在发帖时出错了,真正的问题可能还没被发现。

1

如果你在Windows上运行这个,记得不要同时打开Arduino IDE并且和串口连接,这样的话再运行你的Python脚本就会出现同样的错误。

3

抱歉打扰你了,但我很确定这个错误是因为Arduino自己重启了,所以它和电脑的连接就断开了。

撰写回答