2016-01-06 112 views
3

我想寫一個非常基本的腳本,這將允許我通過串行完全控制一個設備。我可以發送數據(並且我知道設備收到它,讓設備上的屏幕打開讓我看到輸入顯示)。Python串行,可以寫但不能讀

但我不能接收數據,與屏幕上打開,並通過屏幕輸入數據出現錯誤:

Traceback (most recent call last): File "serialRec.py", line 4, in for line in ser: File "/usr/lib/python2.7/dist-packages/serial/serialposix.py", line 456, in read raise SerialException('device reports readiness to read but returned no data (device disconnected?)') serial.serialutil.SerialException: device reports readiness to read but returned no data (device disconnected?)

有沒有錯誤,如果我打開端口等待消息沒有屏幕。 我說的應用程序發送數據沒有問題...我能做什麼?我怎樣才能得到這個閱讀?我正在Ubuntu 12.04安裝中運行此腳本...屏幕在Ubuntu筆記本計算機的設備上正常工作

sys參數是:argv[1] = device (/dev/ttyUSB0)argv[2] = braud rate (e.g. 9600)

import serial 
import sys 
import time 

def enterdata(): 
    ser = serial.Serial(sys.argv[1], sys.argv[2]) 
    scom = raw_input("type away:") 
    incli = str(scom) 
    time.sleep(.2) 
    if (incli == "exit the app"): 
     print ("Exiting the data send, nothing was sent from the exit command") 
    else: 
     while True: 
      print ser.readline() 
     enterdata() 

print ("Welcome to the serial CLI") 
enterdata() 

UPDATE:

我現在有工作,但有限的和醜陋它打印從發送一個命令以多行的回報。雖然爲此我將嘗試一些事情。一旦我把它帶到一個好的地方,我會發布並分享一些很好的工作代碼。

import serial 
import sys 
import time 
def enterdata(): 
ser = serial.Serial(sys.argv[1], sys.argv[2]) 
scom = raw_input() 
incli = str(scom) 
if (incli == "exit the app"): 
    print ("Exiting the data send, nothing was sent from the exit command") 
else: 
    ser.write(incli+"\r\n") 
    time.sleep(0.5) 
    while True: 
    data = ser.read(ser.inWaiting()) 
    if (len(data) > 0): 
    for i in range(len(data)): 
    sys.stdout.write(data[i]) 
    break 
    ser.close() 
    enterdata() 


print ("Welcome to the serial CLI, hit enter to activate:") 
enterdata() 

這是我所做的改變,它的工作原理。雖然它總是打印雙倍或可能發送一個額外的字符

+0

我有類似的問題。你正在使用哪個版本?你應該在Pypi上安裝新的v3.0:https://pypi.python.org/pypi/pyserial – CoMartel

+0

@HarryPotfleur我正在使用2.7 – TheHidden

+0

你在哪裏閱讀?數據何時發送/接收?對我有效的是'data = port.read(1); data + = port.read(puerto.inWaiting())'在一個循環中並且如果有數據的話就打印它。 – tglaria

回答

1

您可能想先嚐試使用偵聽器,但必須確保您的設備以正確的波特率將數據發送到串行端口。

import serial, sys 
port = your_port_name 
baudrate = 9600 
ser = serial.Serial(port,baudrate,timeout=0.001) 
while True: 
    data = ser.read(1) 
    data+= ser.read(ser.inWaiting()) 
    sys.stdout.write(data) 
    sys.stdout.flush() 
+0

這不是可悲的工作,我可以通過使用PHP和屏幕獲取數據的串行...但不是蟒蛇... – TheHidden

+0

確定後玩了代碼,並試圖讓一個奇怪的愛孩子,我已經得到它的工作。 ..類型...其發送給我一個單一的字符,我剛纔輸入回我...更改我的標準輸出打印,它發送了兩個字符,顯然只是加載空白的問題是即時通訊使用思科設備,所以我需要看到設備發回的信息,而不僅僅是輸入XD的東西......即使它只有2個字符是它的開始...... – TheHidden

相關問題