2016-01-06 20 views
0

我試圖用python控制使用RS232的投影機。此鏈接具有有關端口設置和預期響應的所需信息。 http://www.audiogeneral.com/Optoma/w501_rs232.pdfPython串行讀取不工作

要summerise它 波特= 9600, 數據位= 8, 無奇偶校驗, 1個停止位, 無流量控制。

當發送命令「〜00124 1 \ r」時,投影機應該響應okn,其中n是電源狀態。

當命令「〜0000 1 \ r」被送到投影機應該

從膩子我能夠發送的命令和其他命令的權力,並看到投影機做的事情應該是動力。我還可以發送讀取命令,並將適當的okn響應返回給膩子。

從python中,我可以發送開機命令並查看投影機的電源。然而,當我發送電源狀態命令時,我從不會看到任何字符進入讀緩衝區。

這裏是我寫的一個測試腳本代碼,試圖調試這個。

import serial 
ser = serial.Serial("/dev/ttyUSB0") 

print ser.baudrate 
print ser.bytesize 
print ser.parity 
print ser.stopbits 
print ser.xonxoff 
print ser.rtscts 
print ser.dsrdtr 
print ser.name 

print "Power State" 
ser.write("~00124 1") 

while ser.inWaiting() > 0: 
    response = ser.read(3) 
    print response 


output: 
9600 
8 
N 
1 
False 
False 
False 
/dev/ttyUSB0 
True 
Power State 

我期望電源狀態線後OKN,但它不顯示

+0

我沒有看到「Power State」後面的任何內容,這表明ser.inWaiting()的返回值<= 0,所以你應該打印它,它是type(),因爲它可能是一個字符串而不是int。 –

+0

我打印它的類型是int,但它的值是0,所以循環不會運行。我試着用True:它只是掛起,直到我殺了程序。 – CrimsonKnights

回答

0

膩子仿真串行終端,比如小型機在Windows的Linux/Unix或超級終端。 嘗試在字符串末尾添加\ n \ r以充當真正的串行終端。

我建議你嘗試讀取每個字節的數據字節而不是3個字節。如果使用readline方法更好。

+0

不要認爲readine會起作用,因爲我可以告訴投影機不會發送\ n來創建新行,它只會在字符後面發送\ r。我嘗試了1個字節並且現在在寫入語句中添加了\ n – CrimsonKnights

+0

\ r是問題的一部分,我還必須在寫入和讀取之間添加一個time.sleep(0.05),以便投影機有時間響應 – CrimsonKnights

+0

您可以也嘗試將端口超時設置爲無,這會導致所有讀取調用被阻止。通過這種方式,Python腳本將等待至少n個字節的收到。嘗試在串行端口上調用方法flush,以確保在調用read方法之前發送所有字節 – sardylan