我從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