2012-08-06 39 views
2

我正在使用Agilent DMM進行測量。 我使用Python 2.7和PySerial模塊與它進行通信。 這個想法:使用FOR循環,我從DMM中讀取並獲取數據。 它工作正常,直到某一點,每次不同的點。DMM,Python和串行端口:在一個循環中 - 通信突然停止

例如:如果我設置循環測量20k次,它在1k次後突然停止,接下來嘗試它可能在5k次後停止.... 停止 - 意味着DMM停止發送數據並且python保持在一種等待狀態。我的腳本卡住了,我不得不終止它。沒有錯誤,我不知道爲什麼。 我曾嘗試在測量之間添加超時(睡眠),但它不能解決問題。 以下是主要的命令在我的劇本:

# configure the serial connections 
ser = serial.Serial(
    port='com3', 
    baudrate=19200, 
    parity=serial.PARITY_NONE, 
    stopbits=serial.STOPBITS_ONE, 
    bytesize=serial.EIGHTBITS 
} 


ser.write("CONF:CURRent:DC" + '\r\n') 
time.sleep(1) 
ser.write("SENS:CURR:DC:RANGe:UPP 0.05" + '\r\n') 
time.sleep(1.5) 

for m in range (0, 2000): 
try: 
    ser.write('READ?' + '\r\n') 
    out += ser.read(18) 
    print "out = ",out 
except: 
    print "error!" 

循環運行,有時它「生存」到最後,但大多數只是停止,請諮詢時代。請注意,我從來沒有進入「除了」部分。添加「嘗試」沒有幫助...

謝謝!

〜海豚〜

+0

考慮添加超時。當底層設備停止發送數據時,使用阻止讀取語句將掛起。 – 2012-08-06 06:36:07

回答

1

當您創建serial.Serial對象可以設置超時時間。有2個參數用於指定讀取和寫入超時。下面是一個例子:

ser = serial.Serial(
    port='com3', 
    baudrate=19200, 
    parity=serial.PARITY_NONE, 
    stopbits=serial.STOPBITS_ONE, 
    bytesize=serial.EIGHTBITS, 
    timeout=3, # <------ read timeout in seconds (can be floating) 
    writeTimeout=3, # <-------------- write timeout in seconds (can be floating 
} 

以下是文檔說關於值的這些參數可以採取:

超時=無:永遠等待

超時= 0:非阻塞模式(立即返回上讀取)

超時= X:超時設置爲x秒(允許浮動)

+0

非常感謝您的快速響應。 我即將試用它。謝謝! – Dolphinet 2012-08-06 09:59:30

+0

感謝您的幫助! 另一個有用的命令是使用:outPut = ser.read(ser.inWaiting()),而不是精確地詢問18個字符。 謝謝:) – Dolphinet 2012-08-13 07:45:58