我有一个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实现,实现只是将错误传递给我的代码。所以没有新的真实见解。 有没有一种很好的方法来测试程序中发生的事情?
答案 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__())
我怀疑你的错误来自于此,但请尝试这种方式让我们知道!您正在检查byte
是int
仅在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)。这使您可以在串行监视器内运行许多测试,而无需每次都重新启动串行监视器。