import sys
import serial
import numpy as np
import matplotlib.pyplot as plt
from collections import deque
port = "COM11"
baud = 9600
timeout=1
ser = serial.Serial()
ser.port = port
ser.baudrate = baud
ser.timeout = timeout
a1 = deque([0.0]*100)
#ax = plt.axes(xlim=(0, 100), ylim=(0, 1000))
line, = plt.plot(a1)
plt.ion()
plt.ylim([0,1000])
try:
ser.open()
except:
sys.stderr.write("Error opening serial port %s\n" % (ser.portstr) )
sys.exit(1)
#ser.setRtsCts(0)
while 1:
# Read from serial port, blocking
data = ser.read(1)
# If there is more than 1 byte, read the rest
n = ser.inWaiting()
data = data + ser.read(n)
#sys.stdout.write(data)
print(a1)
a1.appendleft((data))
datatoplot = a1.pop()
line.set_ydata(a1)
plt.draw()
我正在使用msp430f5438a board。如果我在每个数据之间用新行发送数据,那么我无法绘制数据,因为在python中有时数据被打印为78_9,7_89,_789其中_表示空间所以python给我一个错误,无法将字符串转换为浮点数。但是,如果我说从uart发送数据而它们之间没有任何新线,那么我得到了一个很好的情节但是在一些不规则的短间隔之后的情节中,情节变为零,然后再次变好,尽管我检查了超级终端我没有收到任何零值 我的问题是: 我描述的两个案例是否相互关联?可以采取哪些措施来纠正这个剧情在两者之间变为零的问题?因此我没有得到一个平滑的波。 感谢
答案 0 :(得分:0)
问题可能在于您处理串行接口的方式。由于您没有解析串行输入,因此您可能会收到如下两条消息:
1.23
4.56
7.
和
89
10.11
等。这是因为您的代码可能在任何时候拆分输入。它可能是如此之快,以至于你一次得到一位数,这可能不是你想要的。
我建议如果您使用换行符填充数据,并且如果终端程序中的数据良好,则使用readline
方法。
while 1:
# read a line from the input
line = ser.readline()
# try to make a float out of it
try:
a1.appendleft(float(line))
except ValueError:
# in case we got bad input, print it and go to the next line
print "Received an invalid line '{0}'".format(line)
continue
# do the plotting
这很可能解决了您的问题。
读取异步串行线程非常复杂,通常需要在超时时解析输入。幸运的是,这是pyserial
使用readline
时完成的。