2011-04-07 78 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