Pyserial持久化配置
我有一段代码,用于从Linux机器向嵌入式设备发送文件大小:
#send length
device_port = serial.Serial("/dev/ttyUSB1", 115200, timeout=3)
device_port.write(program_length_str)
#get response
answer = device_port.readline()
if answer != "OK":
print "Size transmit failed:"
print `answer`
device_port.close()
quit()
问题是,当我运行这段代码时(它总是在这里退出),程序员(负责通过同一个串口给设备加载固件)会出现一个bad file descriptor
的错误。重新插拔设备(设备没有内部电源)也没有帮助,我必须重启我的电脑。我的Python代码有什么问题呢?为什么即使我重新插拔设备(FT2232),错误的设置仍然存在呢?
用cutecom打开端口可以让设备编程,但当我再次关闭它时,错误又回来了。
更新1:使用strace
我发现,成功加载时和失败时的第一个区别在于锁:
open("//var/lock/LCK..ttyUSB1", O_RDONLY) = 4是成功加载开始时的情况,
open("//var/lock/LCK..ttyUSB1", O_RDONLY) = -1 ENOENT (No such file or directory)
而失败时的情况。第二个区别(以及整个错误)可能是加载器的一个bug,所以我在工具链论坛上发了帖子(他们认为read()
返回0是个错误,调用perror()
,但实际上没有错误,所以EBAFD是之前存储在errno中的)。不过我对锁的问题很感兴趣。我在cutecom或Python脚本中(使用strace)找不到任何相关的参考,但锁似乎受到了一些影响。这个问题能否迁移到Unix & Linux网站上呢?
更新2:正如我之前提到的,问题在于串口上的read()
返回0。当我专注于这个问题时,我发现read()应该在阻塞模式下阻塞,或者在非阻塞模式下返回EAGAIN。在什么情况下,read()调用会返回0呢?
更新3:我通过等待设备的select()
调用“解决”了加载器的问题。不过,PySerial在端口上更改了一些东西的问题仍然存在。
2 个回答
我在使用Python串口和Ubuntu方面花了不少时间,遇到的问题是Ubuntu如何“挂载”串口,有时候会失败,还有……
你能把你的dmesg输出发出来吗?这样可能有助于我们更好地检查问题的根源。
我觉得你的问题和Python没什么关系。
我在用Ubuntu编程Arduino的时候也遇到过同样的问题——有时候,插拔几次之后,Ubuntu就不再识别我的设备了。然后它在/dev/
里根本就不显示。
我猜这也是你遇到问题的原因。bad file descriptor
很可能是告诉你你指定的路径其实并不存在。你检查过/dev/ttyUSB0
吗?如果不行的话,我建议你把你的系统升级到最新版本。