#----- 本示例代码无使用限制，传播请保留本行 ----- https://jiangge12.github.io/  

import serial, os ,tkinter              # 如没有串口库，在线安装: pip install pyserial 

port  = 'COM7'                          # 串口号
bps   = 115200                          # 波特率

def open_uart():
    global ser
    try:
        ser = serial.Serial(port, bps)                      
        if (ser.isOpen()):
            print("Serial open succeeded")
            ser.flushInput()
    except:
        print("Serial open failed...exit")
        os._exit(0)
        
open_uart()                             # 运行上面的打开串口函数一次
wave_id = 0                             # 波形编号，用于第一次擦除
dot     = 1200                          # 窗口宽度（可任意设置，小于显示器分辨率即可）
data    = [0] * dot                     # 准备全0数组，元素个数为窗口宽度 

win = tkinter.Tk()
cv = tkinter.Canvas(win, width=dot, height=356, bg='black')
cv.pack()
   
while 1:
    if ser:
        data[:-1]= data[1:]             # 数组左移
        data[-1] = int.from_bytes(ser.read(1), byteorder='big') # 数组最后一个元素=新读取的值（串口读回byte，需要转换为int）
        wave =[]                        # 绘制时波形需要包含dot个xy坐标
        for i in range(dot):
            wave.append(i)              # 添加 x
            wave.append(306-data[i])    # 添加 y （上下颠倒）306 = 256+50*2（上下留出50）
        cv.delete(wave_id)              # 擦除上次波形
        wave_id = cv.create_line(wave, width = 3, fill="red")# 绘制新波形
        win.update()                    # 刷新显示
    


