2014-01-27 34 views
0

我使用pyserial寫和經由UARTpySerial:無法讀取數據超過8個字符

樹莓PI 1兩個覆盆子PI(S)之間讀取:將數據發送到樹莓PI 2

while 1: 
     ser=serial.Serial('/dev/ttyAMA0') 
     if not ser.isOpen(): 
      ser.open() 
     msg=raw_input('RPi 1 send:') 
     ser.write(msg) 
     ser.close() 

樹莓PI 2:從樹莓PI 1

while 1: 
     ser=serial.Serial('/dev/ttyAMA0' ,timeout=0) 
     if not ser.isOpen(): 
      ser.open() 
     data=ser.read(1024) 
     if data.__len__()>0: 
      print 'RPi 2 receive:',data 
     ser.close() 

我運行兩個代碼接收數據。

和發送數據

RPi 1 send : Hello 

和接收數據

RPi 2 receive : Hello 

但如果RPI 1發送數據超過8個字符

例如

RPi 1 send : Hello Raspberry pi NO.2 

結果是

RPi 2 receive: Hello Ra 
    RPi 2 receive: spberry 
    RPi 2 receive: pi NO.2 

這是我的問題。因爲我希望它能像這樣收到

(RPi 2收到:Hello Raspberry pi NO.2)#只顯示一行。

如果再次發送(更多8個字符),它將顯示一個新行。

什麼代碼加入一行?或其他方式來做到這一點? :)

+1

read()只讀取當時準備好的數據。 – cmd

回答

1

我喜歡做這個

sender.py

delim = "\x00" 
ser.write(msg+delim) 

reciever。py

delim = "\x00" 
recvd = "".join(iter(lambda:ser.read(1),delim)) 
print recvd 
+0

現在我編輯你的提示代碼並正確顯示。 但我是一個新的python,我不知道 爲什麼你添加「delim」?爲什麼delim必須是「\ x00」? 「這條線如何工作」「.join(iter(lambda:ser.read(1),delim))? 你會爲我描述這段代碼嗎?所以非常感謝回答:) – Wittaya

+1

該行只是說繼續閱讀,直到我們得到我們的分隔符...你可以使用任何你想要的分隔符...但是(幾乎)將不會在實際的消息內容中,所以它是一個很好的使用 –

3

當使用ser.read進行讀取時,您只是讀取已存在於 緩衝區中的內容,或正在等待字符到達緩衝區。您指定的尺寸爲 是收到的最大字符數,但可能會少得多,因爲您經歷過 。

你有2級簡單的解決辦法:

  1. 使用ser.readline並提出終止您的字符串(如\ N)
  2. ,如果你提前知道多少字符閱讀,復讀 ,直到你」已收到所有這些

在兩種情況下,指定一個超時(例如1秒)打開時 串行線,取回對照如果遠端 因任何原因未發送任何內容,請在您的代碼上輸入ol。

希望它有幫助。