参考网址:
https://www.cnblogs.com/attentle/p/7098408.html
http://blog.csdn.net/xhao014/article/details/7640568
https://www.cnblogs.com/xiaohe520/articles/7137247.html
这里面要用到几个pip几个库才行。
serial库
1 2 |
pip install serial pip install pyserial |
注意:inwaiting 好像不需要() 貌似不是子程序。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
#encoding=utf-8 __author__ = 'freedom' from tkinter import * from serial import * import tkinter.ttk as ttk class GUI(Frame): def __init__(self,master): frame = Frame(master) frame.pack() #串口设置相关变量 self.port = 0 self.baudrate = 9600 #串口号提示 self.lab1 = Label(frame,text = 'Serial Number') self.lab1.grid(row = 0,column = 0,sticky = W) #串口号选择下拉菜单 self.boxValue = StringVar() self.boxChoice = ttk.Combobox(frame,textvariable = self.boxValue,state = 'readonly') self.boxChoice['value'] = ('COM1','COM2','COM3','COM4') self.boxChoice.current(0) self.boxChoice.bind('<<ComboboxSelected>>',self.Choice) self.boxChoice.grid(row = 1,column = 0,sticky = W) #波特率选择提示 self.lab2 = Label(frame,text = 'Baudrate Set') self.lab2.grid(row = 2,column = 0,sticky = W) #波特率选择下拉菜单 self.boxValueBaudrate = IntVar() self.BaudrateChoice = ttk.Combobox(frame,textvariable = self.boxValueBaudrate,state = 'readonly') self.BaudrateChoice['value'] = (9600,115200) self.BaudrateChoice.current(0) self.BaudrateChoice.bind('<<ComboboxSelected>>',self.ChoiceBaudrate) self.BaudrateChoice.grid(row = 3,column = 0,sticky = W) #输出框提示 self.lab3 = Label(frame,text = 'Message Show') self.lab3.grid(row = 0,column = 1,sticky = W) #输出框 self.show = Text(frame,width = 40,height = 5,wrap = WORD) self.show.grid(row = 1,column = 1,rowspan = 4,sticky = W) #输入框提示 self.lab4 = Label(frame,text = 'Input here,please!') self.lab4.grid(row = 5,column = 1,sticky = W) #输入框 self.input = Entry(frame,width = 40) self.input.grid(row = 6,column = 1,rowspan = 4,sticky = W) #输入按钮 self.button1 = Button(frame,text = "Input",command = self.Submit) self.button1.grid(row = 11,column = 1,sticky = E) #串口开启按钮 self.button2 = Button(frame,text = 'Open Serial',command = self.open) self.button2.grid(row = 7,column = 0,sticky = W) #串口关闭按钮 self.button3 = Button(frame,text = 'Close Serial',command = self.close) self.button3.grid(row = 10,column = 0,sticky = W) #串口信息提示框 self.showSerial = Text(frame,width = 20,height = 2,wrap = WORD) self.showSerial.grid(row = 12,column = 0,sticky = W) #串口初始化配置 self.ser = Serial() self.ser.setPort(self.port) #self.ser.setBaudrate(self.baudrate) #self.ser.open() #print self.ser.isOpen() #print self.ser def Choice(self,event): context = self.boxValue.get() list = ["COM1",'COM2','COM3','COM4'] if context in list: self.port = list.index(context) self.ser.setPort(self.port) print (self.port) def ChoiceBaudrate(self,event): self.baudrate = self.boxValueBaudrate.get() self.ser.setBaudrate(self.baudrate) print (self.baudrate) def Submit(self): context1 = self.input.get() n = self.ser.write(context1) output = self.ser.read(n) print (output) self.show.delete(0.0,END) self.show.insert(0.0,output) def open(self): self.ser.open() if self.ser.isOpen() == True: self.showSerial.delete(0.0,END) self.showSerial.insert(0.0,"Serial has been opend!") def close(self): self.ser.close() if self.ser.isOpen() == False: self.showSerial.delete(0.0,END) self.showSerial.insert(0.0,"Serial has been closed!") root = Tk() root.title("Serial GUI") #root.geometry("3000x4000") app = GUI(root) root.mainloop() |
还没有调通,MARK一下。
接收也调通了,贴上源码庆祝一下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
#encoding=utf-8 __author__ = 'ggrarea' from threading import * from time import * from tkinter import * from serial import * import tkinter.ttk as ttk class GUI(Frame): def __init__(self,master): # 构造串口的属性 self.alive = False frame = Frame(master) frame.pack() #串口设置相关变量 self.port = 'COM1' self.baudrate = 9600 #串口号提示 self.lab1 = Label(frame,text = 'Serial Number') self.lab1.grid(row = 0,column = 0,sticky = W) #串口号选择下拉菜单 self.boxValue = StringVar() self.boxChoice = ttk.Combobox(frame,textvariable = self.boxValue,state = 'readonly') self.boxChoice['value'] = ('COM1','COM2','COM3','COM4','COM5','COM6','COM7','COM8','COM9') self.boxChoice.current(0) self.boxChoice.bind('<<ComboboxSelected>>',self.Choice) self.boxChoice.grid(row = 1,column = 0,sticky = W) #波特率选择提示 self.lab2 = Label(frame,text = 'Baudrate Set') self.lab2.grid(row = 2,column = 0,sticky = W) #波特率选择下拉菜单 self.boxValueBaudrate = IntVar() self.BaudrateChoice = ttk.Combobox(frame,textvariable = self.boxValueBaudrate,state = 'readonly') self.BaudrateChoice['value'] = (9600,115200) self.BaudrateChoice.current(0) self.BaudrateChoice.bind('<<ComboboxSelected>>',self.ChoiceBaudrate) self.BaudrateChoice.grid(row = 3,column = 0,sticky = W) #输出框提示 self.lab3 = Label(frame,text = 'Message Show') self.lab3.grid(row = 0,column = 1,sticky = W) #输出框 self.show = Text(frame,width = 40,height = 5,wrap = WORD) self.show.grid(row = 1,column = 1,rowspan = 4,sticky = W) #输入框提示 self.lab4 = Label(frame,text = 'Input here,please!') self.lab4.grid(row = 5,column = 1,sticky = W) #输入框 self.input = Entry(frame,width = 40) self.input.grid(row = 6,column = 1,rowspan = 4,sticky = W) #输入按钮 self.button1 = Button(frame,text = "发送",command = self.Submit) self.button1.grid(row = 11,column = 1,sticky = E) #串口开启按钮 self.button2 = Button(frame,text = 'Open Serial',command = self.open) self.button2.grid(row = 7,column = 0,sticky = W) #串口关闭按钮 self.button3 = Button(frame,text = 'Close Serial',command = self.close) self.button3.grid(row = 10,column = 0,sticky = W) #串口信息提示框 self.showSerial = Text(frame,width = 20,height = 2,wrap = WORD) self.showSerial.grid(row = 12,column = 0,sticky = W) #串口初始化配置 self.ser = Serial() self.ser.setPort(self.port) #self.ser.setBaudrate(self.baudrate) #self.ser.open() #print self.ser.isOpen() #print self.ser def Choice(self,event): context = self.boxValue.get() list = ['COM1','COM2','COM3','COM4','COM5','COM6','COM7','COM8','COM9'] if context in list: self.port = context self.ser.setPort(self.port) #self.ser.timeout = 2 #设置等待时间,若超出这停止等待 print (self.port) def ChoiceBaudrate(self,event): self.baudrate = self.boxValueBaudrate.get() self.ser.setBaudrate(self.baudrate) print (self.baudrate) def Submit(self): context1 = self.input.get() self.ser.write(bytes(context1, encoding="utf8")) #output = self.ser.read(n) #print (output) #self.show.delete(0.0,END)#清除显示 #self.show.insert(0.0,output) def FirstReader(self): while self.alive: time.sleep(0.1) data = '' data = data.encode('utf-8') n = self.ser.in_waiting if n: data = data + self.ser.read(n) print('get data from serial port:', data) #self.show.delete(0.0, END) # 清除显示 self.show.insert(END, data) def open(self): self.ser.open() if self.ser.isOpen() == True: self.showSerial.delete(0.0,END) self.showSerial.insert(0.0,"Serial has been opend!") self.alive = True self.thread_read = Thread(target=self.FirstReader) self.thread_read.setDaemon(True) #守护线程 self.thread_read.start() def close(self): #self.thread_read. self.alive = False #关闭当前线程 # join的作用是保证当前线程执行完成后,再执行其它线程。join可以有timeout参数,表示阻塞其它线程timeout秒后,不再阻塞。详见官方文档。 self.thread_read.join() if self.ser.isOpen() == True: self.ser.close() if self.ser.isOpen() == False: self.showSerial.delete(0.0,END) self.showSerial.insert(0.0,"Serial has been closed!") root = Tk() root.title("Serial GUI") #root.geometry("3000x4000") app = GUI(root) root.mainloop() |
接收效果。
转载请注明:徐自远的乱七八糟小站 » 【原创】python调试串口GUI小程序