Pyserial 持久化配置
Posted
技术标签:
【中文标题】Pyserial 持久化配置【英文标题】:Pyserial persistent configuration 【发布时间】:2011-04-07 13:39:25 【问题描述】:我有此代码用于将文件大小从 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 (没有那个文件或目录)
失败。第二个区别(以及整个错误)可能是加载程序中的错误,所以我在toolchain forum上写了(他们认为read()
返回0是错误,调用perror()
,但没有错误,所以EBAFD存储在之前的 errno 中)。但我对锁很好奇。我在cutecom 或python 脚本(使用strace)中找不到任何参考,但锁受到了某种影响。是否可以将此问题迁移到 Unix 和 Linux 站点?
更新2:正如我之前提到的,问题是串口上的read()
返回0。当我关注这个时,我发现read()应该阻塞或在非阻塞模式下返回EAGAIN。在什么情况下 read() 调用可以返回 0?
更新 3:我通过调用 select()
等待设备“解决”了加载程序的问题。 PySerial 更改端口中的某些内容仍然存在问题。
【问题讨论】:
您是否在同一个 python 解释器中多次运行它?如果是这样,您是否在尝试再次打开之前关闭了 tty 设备? 【参考方案1】:我认为您的问题与 Python 无关。
在使用 Ubuntu 对我的 Arduino 进行编程时,我遇到了同样的问题 - 有时,在插入和拔出几次之后,Ubuntu 不再识别我的设备。然后它根本没有出现在/dev/
中。
我想这也是你问题的根源。 bad file descriptor
most like 告诉您您指定的路径实际上并不存在。你检查过/dev/ttyUSB0
吗?如果这不起作用,我建议将您的安装升级到可用的最新版本。
【讨论】:
Mononofu:见第三次更新,认为信息应该在那里而不是在评论中【参考方案2】:我在 python 串行和 ubuntu 上做了很多工作,问题是关于 ubuntu 如何“挂载”串行端口,有时会失败,并且...
你能发布你的 dmesg 输出吗?这可能有助于仔细检查问题的根源。
【讨论】:
我记不太清了,但是我在发这个的时候已经放弃了 Ubuntu。我不再拥有该设备。如果我再次处理它并设法重复错误,我一定会在这里发布 dmesg。以上是关于Pyserial 持久化配置的主要内容,如果未能解决你的问题,请参考以下文章