我正在使用以下代码在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()
的第二种方法。如何比使用上述方法更快地读取单字节数据?
答案 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"