4

我有一个 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__())

此代码打印的错误是:

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

发送时我的代码有问题吗?我是否需要检查串行连接是否已准备好发送某些内容,或者发送后是否应该有延迟?还是硬件或与硬件的连接有问题?

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

4

4 回答 4

2

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

于 2009-06-15T21:45:22.287 回答
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__())

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

于 2009-06-15T05:03:32.377 回答
1

如果您在 Windows 上运行此程序,则无法在运行 Python 脚本的同时通过串行连接打开 Arduino IDE。这将引发相同的错误。

于 2009-06-15T13:21:00.247 回答
0

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

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

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

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

于 2013-11-06T15:10:43.557 回答