2011-04-07 75 views
4

我从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仍然会在端口上改变某些东西。

+0

你在同一个Python解释器中多次运行这个吗?如果是这样,您是否在尝试再次打开它之前关闭了tty设备? – sienkiew 2012-05-24 19:06:21

回答

0

我不认为你的问题与Python有任何关系。

我在使用Ubuntu编程Arduino时面临同样的问题 - 有时候,在插入和拔出插头几次之后,Ubuntu不再识别我的设备。然后它根本没有出现在/dev/

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

+0

Mononofu:看到第三次更新,认为信息应该在那里,而不是在评论 – 2011-05-24 07:42:11

0

我工作了很多与Python串行和Ubuntu,这个问题是关于如何Ubuntu的安装“”串口,有时会失败,并...

,你可以发布您的dmesg输出?这可能有助于双重检查问题的根源。

+0

我不记得确切,但我已经放弃了Ubuntu发布此时。我不再拥有该设备。如果我再次工作并设法重复错误,我肯定会在此发布dmesg。 – 2012-03-16 21:41:44