2011-04-02 55 views
1

我想通過pySerial發送一些字節。我創建了socat虛擬串行端口,用於測試目的:用pySerial和socat發送字節時出現問題

socat PTY,link=./ptyp1,b9600 PTY,link=./ptyp2,b9600 

這裏的Python代碼:

ser = serial.Serial('./ptyp1') 
x = struct.pack('B',2) 
print binascii.hexlify(x) # 02 
ser.write(x) 
y = ser.read(2) 
print binascii.hexlify(y) # 5e42 

的輸出中,我得到:

02 # x 
5e42 # y 

輸出我想到:

02 # x 
02 # y 

我是什麼在這裏做錯了嗎?是socat還是python?

編輯:

我只注意到一些其他奇怪的行爲,爲不同的x值。在這裏,輸出繼電器:

x = 12 => y = 5E 52 0D 0A 5E 50 
x = 100 => y = 100 # why does it work here? 

解決方案:

的問題是,我我寫的同一個端口上閱讀。如果我做對了,socat將兩個港口「連接」爲「進」和「出」。所以如果我寫入./ptyp1,我必須閱讀./ptyp2。之後,一切都很好。

回答

1

問題是我讀到了我寫給的同一個端口。如果我做對了,socat將兩個港口「連接」爲「進」和「出」。所以如果我寫入./ptyp1,我必須閱讀./ptyp2。之後,一切都很好。

0

我已經安裝了socat來測試你的代碼。我已經跑這條線:

socat PTY,link=./ptyp1,b9600 PTY,link=./ptyp2,b9600 

接着,下面的代碼工作:

from binascii import hexlify 
from serial import Serial, struct 

ser = Serial('ptyp1') 
x = struct.pack('B', 2) 
print hexlify(x) # 02 
ser.write(x) 
y = ser.read() 
print hexlify(y) # 5E 
y = ser.read() 
print hexlify(y) # 42 

輸出繼電器:

02 
5e 
42 
+0

好吧,但我不明白:當我只寫1(02)時,爲什麼我可以讀2個字節(5e 42)。我如何寫1個字節並讀取相同的字節? – nonsenz 2011-04-02 16:57:13

0

你似乎什麼回去了是字符串 「^ B」 。有可能socat(或其他方法)正在將您發送的字節(\x02)解釋爲某種控制代碼。

關閉我的頭頂,Ctrl-B是回頁助記符,但我不確定。