4

我有此代码用于将文件大小从 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 (没有那个文件或目录)

关于失败。第二个区别(以及整个错误)可能是加载程序中的错误,所以我在工具链论坛上写了(他们认为read()返回 0 是错误,调用perror(),但没有错误,所以 EBAFD 存储在之前的 errno 中) . 但我对锁很好奇。我在cutecom 或python 脚本(使用strace)中找不到任何参考,但锁受到了某种影响。是否可以将此问题迁移到 Unix 和 Linux 站点?

更新2:正如我之前提到的,问题是read()串口返回0。当我专注于此时,我发现read()应该阻塞或在非阻塞模式下返回EAGAIN。在什么情况下 read() 调用可以返回 0?

更新3:我通过select()调用设备来“解决”加载程序的问题。PySerial 更改端口中的某些内容仍然存在问题。

4

2 回答 2

0

我认为您的问题与 Python 无关。

在使用 Ubuntu 对我的 Arduino 进行编程时,我遇到了同样的问题 - 有时,在几次插入和拔出之后,Ubuntu 不再识别我的设备。然后它根本没有出现在/dev/.

我想这也是你问题的根源。bad file descriptormost like 告诉您您指定的路径实际上并不存在。你检查过/dev/ttyUSB0吗?如果这不起作用,我建议将您的安装升级到可用的最新版本。

于 2011-05-23T18:00:55.010 回答
0

我在 python 串行和 ubuntu 上做了很多工作,问题是关于 ubuntu 如何“挂载”串行端口,有时会失败,并且......

你能发布你的 dmesg 输出吗?这可能有助于仔细检查问题的根源。

于 2012-03-15T16:26:17.773 回答