如何使用Python快速读取单字节串行数据

时间:2014-09-24 05:03:21

标签: python pyserial

我正在使用以下代码在Python中读取串行数据:

port = "COM11"
baud = 460800
timeout=1

ser = serial.Serial()
ser.port = port
ser.baudrate = baud
ser.timeout = timeout
while 1:
     # Read from serial port, blocking
     data =ser.read(1)
     print data
     # some further processing of data

我以非常快的速度发送数据但是当我使用这段代码时,我得到的数据速度非常慢,可能每秒大约2-3个数据。这太慢了,因为我想进行实时绘图。

所以,我尝试了以上代码而不是上面的代码:

 while 1:
     # Read from serial port, blocking
     data =ser.read(1)
     data1=(data)


     # If there is more than 1 byte, read the rest
     n = ser.inWaiting()
     data1 = (data1 + ser.read(n))
     print data1

现在数据更新的速度是相同的,但是我检查输入队列中的多个字节并读取它们,而不是单个字节。我每个循环接收大约3850个字节,所以这个对我来说要快得多,但事实上它几乎是相同的,唯一的变化是我没有读取更多的字节数。

我想读取一个字节并检查收到的实时时间。为此,我不能使用ser.inWaiting()的第二种方法。如何比使用上述方法更快地读取单字节数据?

1 个答案:

答案 0 :(得分:0)

这是我为项目编写的一些测试代码,您可以尝试使用不同的波特设置。基本上它会在Tx上发送一些数据(可以直接连接到Rx),并期望数据被回显。然后,它会将返回的数据与发送的数据进行比较,并让您知道是否/何时发生错误。请注意,如果没有错误,则输出将保持空白,在测试结束时,它将打印“0 Comm Errors”。

import serial, time

test_data = "hello this is so freakin cool!!!" + '\r' #Must always be terminated with '\r'
echo_timeout = 1 #the time allotted to read back the test_data string in seconds
cycleNum = 0
errors = 0
try:
        ser = serial.Serial(port="COM1", baudrate=115200, timeout=1)
        ser.flush()
        print "starting test"
        for x in xrange(100):
                cycleNum += 1
                d = ser.write(test_data)
                ret_char = returned = ''
                start_time = time.time()
                while (ret_char <> '\r') and (time.time() - start_time < echo_timeout):
                        ret_char = ser.read(1)
                        returned += ret_char
                if not returned == test_data:
                    errors += 1
                    print "Cycle: %d Sent: %s Received: %s" % (cycleNum, repr(test_data), repr(returned) )
except Exception as e:
        print 'Python Error:', e
finally:
        if 'ser' in locals():
                print "%d Comm Errors" % errors
                if ser.isOpen():
                        ser.close()
                        print "Port Was Successfully Closed"
                else:
                        print "Port Already Closed"
        else:
                print "Serial Variable Was Never Initialized"