我从Linux机器发送文件的大小,以嵌入式设备验证码:Pyserial持久配置
#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)
失败。第二个区别(和整个错误)可能是加载器中的错误,所以我在toolchain forum上写道(他们认为read()
返回0是错误,请拨打perror()
,但没有错误,所以EBAFD存储在早期的errno中)。但我对这些锁很好奇。我无法在cutecom或python脚本中找到任何参考(使用strace),但锁受到某种程度的影响。将这个问题迁移到Unix的Linux站点可以吗?
更新2:正如我前面提到的,问题是串行端口上的read()
返回0.当我关注此问题时,发现read()应该在非阻塞模式下阻塞或返回EAGAIN。 read()在什么情况下可以返回0?
更新3:我通过为设备拨打select()
调用来解决加载程序的问题。 PySerial仍然会在端口上改变某些东西。
你在同一个Python解释器中多次运行这个吗?如果是这样,您是否在尝试再次打开它之前关闭了tty设备? – sienkiew 2012-05-24 19:06:21