【发布时间】: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 设备?
标签: python linux serial-port pyserial