2013-12-15 131 views
0

我試圖與我的智能電錶進行通信,這部分工作。 基本上,我通過FT232 USB串行電纜從我的儀表中獲取串行數據。 智能電錶有一個數據記錄器端口,每10秒(9600波特,7個數據位,偶數位,1個停止位)發送一個電報信息。我用minicom配置文件是串行通信在minicom中工作,但不在python中

pu port    /dev/ttyUSB0 
pu baudrate   9600 
pu bits    7 
pu parity   E 
pu stopbits   1 
pu minit   ~^M~AT S7=45 S0=0 L1 V1 X4 &c1 E1 Q0^M 

這個工程,我能夠成功地接收我的數據。但我的目標是在收到的python中的數據,所以我嘗試下面的腳本

import serial 

ser = serial.Serial() 
ser.baudrate = 9600 
ser.bytesize=serial.SEVENBITS 
ser.parity=serial.PARITY_EVEN 
ser.stopbits=serial.STOPBITS_ONE 
ser.xonxoff=0 
ser.rtscts=0 
ser.timeout=20 
ser.port="/dev/ttyUSB0" 

ser.close() 
ser.open() 
print ("Waiting for P1 output on " + ser.portstr) 

counter=0 
#read 20 lines  
while counter < 20: 
    print ser.readline() 
    counter=counter+1 

try: 
    ser.close() 
    print ("Closed serial port.") 
except: 
    sys.exit ("Couldn't close serial port.") 

這似乎並不工作,它只是超時20秒後。我也曾嘗試 '銅' 有:

銅-l的/ dev/ttyUSB0 -s 9600 -oe

我發現運行python腳本時,然後運行該腳本的Minicom的python腳本將獲得所需的數據。我也嘗試將初始化字符串更改爲'',它適用,但如果我沒有設置它,minicom不會得到任何數據

有沒有人有任何想法?

+1

你能發佈的Minicom腳本 - 我猜測它做一些事情來打開你的Python代碼沒有港口。另外 - 它是否以root身份運行? – adrianmcmenamin

+0

@adrianmcmenamin我沒有使用minicom的任何腳本,我只需通過運行> minicom smartmconfig'運行'配置文件。 – user2826436

+0

它們不以root身份運行,它們由撥出組中的用戶運行。我試圖以root身份運行它們,結果相同。 – user2826436

回答

0

類似的問題,我可以讀取智能表,但50%的時間它不工作。 從20行中只讀出前15行。15到20行被忽略。

這是我的解決方案使用Cu和捕獲輸出

#!/usr/bin/python 

# test voor cu -l /dev/ttyUSB0 -s 9600 --parity=none 

import time 
import os 
import signal 
import sys 
import subprocess 
from subprocess import Popen, PIPE 

line = '' 
teller = 0 
stack = [] 
#Use a process group so as to enable sending a signal to all the process in the groups. 
process = subprocess.Popen('cu -l /dev/ttyUSB0 -s 9600 --parity=none', shell=True, stdout=PIPE, bufsize=1, preexec_fn=os.setsid) 

while teller < 20: 
    line = process.stdout.readline() 
    stack.append(line) 
    print str(teller) + ' ' + line 
    teller = teller + 1 

#time.sleep(15) 

os.killpg(process.pid, signal.SIGTERM) 
1

我有同樣的問題,和它原來我的發送設備是不發送在一個時間線,將其發送的各個字符。使用

bytesToRead = ser.inWaiting() 
ser.read(bytesToRead) 

允許數據開始澆築

相關問題