2016-12-12 23 views
0

我有一個插入樹莓派的XBee。這裏是我正在使用的Python 3.4代碼:Python os.read塊直到換行符

f = os.open("/dev/ttyUSB0", os.O_RDWR | os.O_NONBLOCK) 

print("Writing...") 
b = bytes("hello","utf-8") 
os.write(f,b) 

print("Press return to start read") 
cmd = input() 

print("Reading...") 
ret = os.read(f,10) 
if ret == None: 
     print("ret = None") 
else: 
     print("ret = {}".format(ret)) 

os.close(f) 

昨天,這一切都按我的預期工作。 read命令立即返回,如果沒有任何要讀取的內容,則爲零字節。

今天我將代碼添加到寫入文本文件的項目的另一部分,幷包含一個線程RLock。現在上面的代碼做了不同的事情。如果沒有字節等待讀,或有字節等待讀,但他們不以0X0D結束,我得到一個錯誤:

BlockingIOError: [Errno 11] Resource temporarily unavailable 

但就是有等待讀取的字節以0x0D結束,讀取函數返回包括0x0D的那些字節。

更新:我已經對系統進行了重新格式化,並且故障沒有消失,這表明它不是添加導致問題的文件和線程鎖定代碼。

我跑minicom和問題已經消失,所以也許我應該做一些設備上的串行配置之前,我打開它作爲一個文件?

這是返回的os.read到原來的行爲線:

小型機-b 9600 -o-D的/ dev/ttyUSB0

+0

你可以包含添加鎖的代碼嗎?換行符聽起來像讀取被緩衝(我知道使用普通的文件類對象作爲迭代器將阻止等待換行符或EOF),但afaik'os.open'返回一個無緩衝的文件句柄 –

+0

謝謝爲答覆。我用鎖定代碼更新了我的問題。 –

+0

您是否關閉了串口的手柄,但仍然從中讀取?如果是這樣,那麼trace.txt文件的底層文件句柄可能與USB端口相同。 Unix操作系統按遞增順序分配文件句柄,並將重新使用句柄。試試這個,看看你自己:https://gist.github.com/jszakmeister/e18607a026749956f0bd7a30cd148fa6 – jszakmeister

回答

0

我強烈懷疑這兩個不同的行爲都涉及到串行端口上的CTS/RTS流量控制設置。嘗試開啓或關閉CTS/RTS以獲得您想要的行爲。