我有一个python(2.7)脚本,它通过以下形式通过串口读取传入数据:
ID: 648 Data: 45 77 33 9C 26 9A 1F 42
ID: 363 Data: 35 74 36 BC 26 9D
...
数据流包含几个不同的ID(约30个),它们以2-8个数据字节定期重复。 ID的频率范围为10-120毫秒。有些ID比其他ID更快重复。
无论如何,我有一个基本的python脚本,将这个流读入2个变量,(id和data):
import serial
import re
ser = serial.Serial("COM11", 115200)
while 1:
reading = ser.readline()
matchObj = re.match( r'ID:\s([0-9A-F]+)\sData:\s([^\n]+)', reading, re.M|re.I)
if matchObj:
id = matchObj.group(1)
data = matchObj.group(2)
else:
print "No match!!"
我想要做的是以数据表格式实时显示这些数据,其中新的ID条目被添加到表中并且重复的ID条目被更新。这将导致一个表最初随着ID的发现而增长,然后随着ID的数据的变化而更新。
我已经看到了一些表模块的示例,它们允许您向表中添加行,但我还需要能够修改现有条目,因为这是最常发生的事情。
我仍然是python的新手,我需要一个没有过多开销的实现来尽可能快地保持数据更新。
有什么想法? 提前谢谢!
答案 0 :(得分:1)
curses是终端显示的首选。
#!/usr/bin/env python
import curses
import time
def updater():
fakedata = [[1, 78], [2, 97], [1, 45], [2, 2], [3, 89]]
codes_to_linenums_dict = {}
last_line = 0
win = curses.initscr()
for code, data in fakedata:
try:
# if we haven't seen this code before, give it the next line
if code not in codes_to_linenums_dict:
codes_to_linenums_dict[code] = last_line
last_line += 1
# use the line we set for this code.
line = codes_to_linenums_dict[code]
win.addstr(line, 0, '{}: {} '.format(code, data))
win.refresh()
# For display only
time.sleep(2)
except KeyboardInterrupt:
# if endwin isn't called the terminal becomes unuseable.
curses.endwin()
raise
curses.endwin()
if __name__ == '__main__':
updater()
〜