2009-06-15 74 views
4

我有一个Python脚本,它通过pySerial将数据包写入Arduino板。 有时在将代码写入主板时,pySerial会引发errno 5的输入/输出错误。使用pySerial从Python获取输入/输出错误

一些研究表明,这表示在写入表示与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实现,实现只是将错误传递给我的代码。所以从那里没有新的真正的见解。 有没有一种很好的方法来测试程序中发生了什么?

回答

2

不好意思打扰了你,但我很确定这个错误是由arduino自己重置导致的,因此关闭了与计算机的连接。

+0

我有同样的问题 - 你有任何想法如何赶上/防止这个错误? – 2013-05-13 18:07:26

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

我怀疑你的错误来源于此,但尝试这种方式,让我们知道!您仅在是int的情况下检查其是否为str,因此elif总是按定义失败。但我想如果你真的代码缩进是这样的,你会得到一个SyntaxError,所以我认为你只是错误张贴和你真正的问题仍然隐藏。

+0

你是对的intendation :) – Janusz 2009-06-15 05:08:25

1

如果您在Windows上运行此操作,则不能在运行Python脚本的同时打开Arduino IDE的串行连接。这会抛出同样的错误。

+0

我想过一个错误,两个程序或脚本写入到arduino。我们在linux机器上运行这个程序,并且脚本是唯一写的东西。程序中没有线程。在出现错误之前,一些数据包会成功发送。 因此,第二个程序写入连接似乎不太可能。 – Janusz 2009-06-15 14:55:33

0

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

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

看看出现了什么。假设您的草图尝试通过Serial.print()发回数据,它经常会非常有帮助。几个笔记。确保串行监视器内设置的波特率与草图中的波特率完全一致(9600几乎适用于所有情况)。

第二个注意事项非常重要。调出串行监视器强制在Arduino板上重置。你的素描开始(总是)。这是一件好事,因为它每次都会让你重新焕然一新。请注意,只需将波特率设置为9600(即使它已经是9600),您也可以强制重置。这使您可以在串行监视器内运行多个测试,而无需每次都重新启动串行监视器。