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 持久化配置的主要内容,如果未能解决你的问题,请参考以下文章

docker配置redis持久化

activimq消息队列持久化配置

界面动态配置:持久化反持久化

redis持久化配置

Apache ActiveMQ 持久化到MySQL数据库的简单配置

tomcat配置session持久化