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

时间:2009-06-15 04:55:27

标签: python serial-port arduino pyserial

我有一个Python脚本,通过pySerial将数据包写入Arduino板。 有时将代码写入电路板时,pySerial会使用errno 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__())

此代码打印的错误是:

  

OS错误输入/输出错误Errno 5

发送时我的代码有问题吗?我是否需要检查串行连接是否已准备好发送或发送后是否有延迟? 或者硬件或与硬件的连接是否存在问题?

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

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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__())

我怀疑你的错误来自于此,但请尝试这种方式让我们知道!您正在检查byteint仅在str的情况下,因此elif 总是按定义失败。但是我认为如果你真正的代码缩进就像这样,你就得到了SyntaxError,所以我认为你在发帖时错了,你的真正问题仍然存在。

答案 2 :(得分:1)

如果您在Windows上运行此功能,则无法在运行Python脚本的同时使用串行连接打开Arduino IDE。这会引发同样的错误。

答案 3 :(得分:0)

让我尝试提供一些可能对您和其他有类似问题的人有所帮助的评论。首先,尝试使用串行监视器运行Arduino草图几次。您可以在IDE菜单中的Tools下找到Serial Monitor。您也可以输入Ctrl-Shift-M来调用串行监视器。

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

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

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