2016-01-21 143 views
0

我对编程比较陌生,所以请耐心等待。我正在尝试与测量设备METEX M-4650CR https://sigrok.org/wiki/Voltcraft_M-4650CR进行通信,我正在使用Windows 7 64位操作系统。我只是想读出设备测量的数据到我的python程序并显示它并用它来计算。Pyserial写入数据但不读取

我在手动http://elektron.pol.lublin.pl/elekp/labor_instr/METEX_M-4650CR_Manual.pdf(页面25ff)发现,它的工作原理与波特率1200,一个bytesize 7(用ASCII码)和2 停止位

此外,它可以被要求通过简单地给它命令“M”发送数据到计算机。然后它返回14个字节到计算机。没有任何要测量的东西连接到它,它应该返回类似'DC 00.0000V CR'的东西。 CR是这里的终结者(我希望这是正确的名字)。

这里是我的代码:

import pyserial 
import time 

ser = serial.Serial(port='COM5', baudrate=1200, 
        bytesize=7, stopbits=2, timeout=1, 
        rtscts=False, dsrdtr=True) 

time.sleep(1) 
ser.write("M") 
time.sleep(1) 
bytestoread = ser.inWaiting() 
print bytestoread 

output = '' 
output += ser.read(1000) 
print 'output:' + str(output) 

time.sleep(1) 
ser.close() 

我的问题是,我不能pyserial正确读出的数据。我将命令“M”发送到METEX,并在显示屏上显示“发送”一会儿,所以我猜我的写入命令工作正常。但在此之后(它应该发送数据),我从ser.inWaitung得到的所有数据都是'0L'或'1L',而ser.read命令根本没有任何结果。

我不认为这是硬件问题,因为使用另一个名为'serialwatcher'的程序,我可以正确读出数据。它给出了手册中描述的字符。

我也试过下面的while循环,有问题,大部分时间是inWaiting == 0,这样它就永远不会初始化循环。

while ser.inWaiting() > 0: 
    output += ser.read(1) 
if output != '': 
    output = outpus.rstrip() 
    print output 

那么,怎样才能正确读出数据,发送到串口呢?提前致谢。

回答

1

可惜我不能测试你的代码,因为我没有串行设备在身边,但你可以尝试以下方法:

你可以设置一个标志,如alive当你正在期待数据,并试图读取一些东西。当我试图从一台非常老的光谱仪接收数据时,这对我有用。

 while alive:       #loop 
     text = ser.read(1)     #try to read one line 
     if text:       #if there is data 
      n = ser.inWaiting()   #look if there is more to read 
      if n:       #if so 
       text = text + ser.read(n) #get all of it 

一个更复杂的例子可以在这里找到wxTerminal - Pyserial example你也可以简单地尝试修改这个辉煌的代码为你的目的,看看你更容易成功。

+2

感谢您的回答,链接真的很棒。虽然,问题是另一个:我只是不得不使用“ser.setDTR(1)”。我认为,在定义端口名称时设置了DTR的使用,但事实并非如此。 – kire

相关问题