程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

python串口助手及實時波形顯示(serial庫+matplotlib庫)

編輯:Python

一、所用庫

線程模塊、serial模塊、tkinter(沒有用)、matplotlib畫圖

二、大致框架

串口:com1.inWaiting()判斷有無接收到數據

        k == '\n':判斷有無換行

        將每次接收到的數據添加到字符串中,最後用“\r\n”分割

        每四個數據分為一組,最後一起畫圖

畫圖:清除上一次所畫的圖、畫此次的圖、顯示

三、用法

輸入COM口名稱

輸入波特率

等待接收數據

四、擴展

 draw_new_pic(self, dat_in: list, width=100):

修改此函數傳入的width可以決定同時顯示的最大數據量。(發送的數據量超過這個值時圖像會向左平移以顯示新的數據)

get_data(self, group_number=4):

修改這個函數傳入的group_number參數可以改變數據的分組(最大4)

五、代碼

import threading
import serial
import tkinter as tk
import matplotlib.pyplot as plt
wait = 1
on = 1
time_jia = 0
ax = []
ay = []
INT_TYPE = 0
STR_TYPE = 1
STR_AND_INT = 2
class Rcom:
def __init__(self, comn, boud):
self.receive_data = []
self.write_data = []
self.receive_number = []
self.com1 = serial.Serial(comn, boud, timeout=0.5)
self.com1.write("ready".encode('utf-8'))
def get_data(self, group_number=4):
string_k = ''
return_number_list = []
times = 0
while 1:
if self.com1.inWaiting() > 0:
k = self.com1.read().decode('ascii')
string_k = string_k + k
if k == '\n':
times = times + 1
if times == 4:
new_list = string_k.split("\r\n")
break
# print(new_list)
for s1 in new_list:
if s1.isdigit():
return_number_list.append(eval(s1))
return return_number_list
def write_data(self):
pass
pass
class DrawPic:
def __init__(self):
self.x = [[] for i in range(4)]
self.y = [[] for i in range(4)]
self.len = 0
def draw_new_pic(self, dat_in: list, width=100):
self.len = self.len + 1
for i in range(4):
self.x[i].append(self.len)
self.y[i].append(dat_in[i])
if self.len < width + 1:
plt.ion()
plt.clf()
plt.subplot(2, 2, 1)
plt.plot(self.x[0][0:width], self.y[0][(self.len - width):self.len])
plt.subplot(2, 2, 2)
plt.plot(self.x[1][0:width], self.y[1][(self.len - width):self.len])
plt.subplot(2, 2, 3)
plt.plot(self.x[2][0:width], self.y[2][(self.len - width):self.len])
plt.subplot(2, 2, 4)
plt.plot(self.x[3][0:width], self.y[3][(self.len - width):self.len])
plt.pause(0.1)
plt.ioff()
else:
plt.ion()
plt.clf()
plt.subplot(2, 2, 1)
plt.plot(self.x[0][0:width], self.y[0][(self.len - width):self.len])
plt.subplot(2, 2, 2)
plt.plot(self.x[1][0:width], self.y[1][(self.len - width):self.len])
plt.subplot(2, 2, 3)
plt.plot(self.x[2][0:width], self.y[2][(self.len - width):self.len])
plt.subplot(2, 2, 4)
plt.plot(self.x[3][0:width], self.y[3][(self.len - width):self.len])
plt.pause(0.1)
plt.ioff()
pass
pass
def threading_1():
global com1
global pic1
while True:
pic1.draw_new_pic(com1.get_data())
def threading_tk():
root1 = tk.Tk()
button1 = tk.Button(root1)
button1.pack()
root1.mainloop()
pass
if __name__ == '__main__':
com_name = input("輸入COM口的名字:COM1,COM2,COM3 ...")
com_bound = input("輸入波特率:")
if com_name == '':
com_name = 'COM1'
if com_bound == '':
com_bound = 9600
else:
com_bound = eval(com_bound)
com1 = Rcom(com_name, com_bound)
pic1 = DrawPic()
thread1 = threading.Thread(target=threading_1())
thread1.start()

六、完善

1. 數據分組還沒完善

2. 只能輸入純數字

3. 還得加入用戶界面

覺得可以的,希望大家點個贊!


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved