python串口通讯小程序(GUI界面)
使用Python进行串口通信需要python的pyserial库,安装Python时不会自动安装,需要自行安装。 1.安装 pyserial 库: 打开命令行窗口,在命令行输入:pip install pyserial 命令进行安装。 2.程序使用python自带的GUI库tkinter实现GUI窗口,使用pyserial实现串口通信模块。 结果如下: 序列号选择框会自动加载所有可用的序列号并显示
使用Python进行串口通信需要python的pyserial库,安装Python时不会自动安装,需要自行安装。
1.安装 pyserial 库:
打开命令行窗口,在命令行输入:pip install pyserial 命令进行安装。
2.程序使用python自带的GUI库tkinter实现GUI窗口,使用pyserial实现串口通信模块。
结果如下:
序列号选择框会自动加载所有可用的序列号并显示在选择框中。使用时选择合适的序列号,然后点击打开序列号。
注意:本程序使用虚拟串口
3.效果演示:
1)发送数据演示:
注意:发送数据显示框中显示字符表示发送成功
动态效果演示:
2)接收数据的演示:
注:接收数据显示框显示字符表示数据发送成功
动态演示效果:
4:项目介绍:
该项目由两个文件组成:GUI 文件和串口文件。
文件代码如下:
图形用户界面文件:
'''
//@作者:夏天
@工具:pycharm
@content:实现串口通信主类
@日期:2020.2.12
'''
导入 tkinter
从 tkinter 导入 ttk
from serial communication.SerialClass import SerialAchieve # Import Serial Communication Class
类 MainSerial:
def init(self):
定义串口变量
self.port u003d 无
self.band u003d 无
self.check u003d 无
self.data u003d 无
self.stop u003d 无
self.myserial u003d 无
初始化表单
self.mainwin u003d tkinter.Tk()
self.mainwin.title("Solarnumen Comdebug")
self.mainwin.geometry("600x400")
标签
self.label1 u003d tkinter.Label(self.mainwin,text u003d "系列标语:",font u003d ("歌曲风格",15))
self.label1.place(x u003d 5,y u003d 5)
self.label2 u003d tkinter.Label(self.mainwin, textu003d"波特率:", fontu003d("歌曲风格", 15))
self.label2.place(xu003d5, yu003d45)
self.label3 u003d tkinter.Label(self.mainwin, textu003d"校验位:", fontu003d("歌曲风格", 15))
self.label3.place(xu003d5, yu003d85)
self.label4 u003d tkinter.Label(self.mainwin, textu003d"数据位:", fontu003d("歌曲风格", 15))
self.label4.place(xu003d5, yu003d125)
self.label5 u003d tkinter.Label(self.mainwin,text u003d "Stop Bit:",font u003d ("Song Style",15))
self.label5.place(x u003d 5,y u003d 165)
文字显示,清除发送数据
self.label6 u003d tkinter.Label(self.mainwin, textu003d"send data:", fontu003d("Song Style", 15))
self.label6.place(xu003d230, yu003d5)
self.label7 u003d tkinter.Label(self.mainwin, textu003d"receive data:", fontu003d("Song Style", 15))
self.label7.place(xu003d230, yu003d200)
系列标语
self.com1value u003d tkinter.StringVar() # 表单自带的文本,创建值
self.combobox_port u003d ttk.Combobox(self.mainwin, textvariableu003dself.com1value,
width u003d 10,font u003d ("歌曲风格",13))
输入选择
self.combobox_port["value"] u003d [""] #这里先选择
self.combobox_port.place(x u003d 105,y u003d 5) # 显示
波特率
self.bandvalue u003d tkinter.StringVar() # 表单自带的文本,创建值
self.combobox_band u003d ttk.Combobox(self.mainwin, textvariableu003dself.bandvalue, widthu003d10, fontu003d("Song Style", 13))
输入选择
self.combobox_band["value"] u003d ["4800","9600","14400","19200","38400","57600","115200"] #这里先选择
self.combobox_band.current(6) # 默认选择0
self.combobox_band.place(xu003d105, yu003d45) # 显示
检查位
self.checkvalue u003d tkinter.StringVar() # 表单自带的文本,创建值
self.combobox_check u003d ttk.Combobox(self.mainwin, textvariableu003dself.checkvalue, widthu003d10, fontu003d("Song Style", 13))
输入选择
self.combobox_check["value"] u003d ["No Check Bit"] #这里先选择
self.combobox_check.current(0) # 默认选择0
self.combobox_check.place(xu003d105, yu003d85) # 显示
数据位
self.datavalue u003d tkinter.StringVar() # 表单自带的文本,创建值
self.combobox_data u003d ttk.Combobox(self.mainwin, textvariableu003dself.datavalue, widthu003d10, fontu003d("歌曲风格", 13) )
输入选择
self.combobox_data["value"] u003d ["8", "9", "0"] #这里先选择
self.combobox_data.current(0) # 默认选择0
self.combobox_data.place(xu003d105, yu003d125) # 显示
停止位
self.stopvalue u003d tkinter.StringVar() # 表单自带的文本,创建值
self.combobox_stop u003d ttk.Combobox(self.mainwin, textvariableu003dself.stopvalue, widthu003d10, fontu003d("Song Style", 13))
输入选择
self.combobox_stop["value"] u003d ["1", "0"] #这里先选择
self.combobox_stop.current(0) # 默认选择0
self.combobox_stop.place(xu003d105, yu003d165) # 显示
按键显示,打开串口
self.button_OK u003d tkinter.Button(self.mainwin, textu003d"打开串口",
commandu003dself.button_OK_click, font u003d ("Song Style",13),
宽度 u003d 10,高度 u003d 1)
self.button_OK.place(x u003d 5,y u003d 210) # 显示控件
关闭串口
self.button_Cancel u003d tkinter.Button(self.mainwin, textu003d"关闭串口", # 显示文本
commandu003dself.button_Cancel_click, font u003d ("Song Style",13),
宽度u003d10,高度u003d1)
self.button_Cancel.place(x u003d 120,y u003d 210) # 显示控件
清除发送数据
self.button_Cancel u003d tkinter.Button(self.mainwin, textu003d"清除发送数据", # 显示文本
commandu003dself.button_clcSend_click, fontu003d("歌曲风格", 13),
宽度u003d13,高度u003d1)
self.button_Cancel.place(xu003d400, yu003d2) # 显示控件
清除接收到的数据
self.button_Cancel u003d tkinter.Button(self.mainwin, textu003d"Clear Received Data", # 显示文本
commandu003dself.button_clcRece_click, fontu003d("歌曲风格", 13),
宽度u003d13,高度u003d1)
self.button_Cancel.place(xu003d400, yu003d197) # 显示控件
发送密钥
self.button_Send u003d tkinter.Button(self.mainwin, textu003d"Send out", # 显示文本
commandu003dself.button_Send_click, fontu003d("歌曲风格", 13),
宽度u003d6,高度u003d1)
self.button_Send.place(xu003d5, yu003d255) # 显示控件
接收密钥
self.button_Send u003d tkinter.Button(self.mainwin, textu003d"Receive", # 显示文本
commandu003dself.button_Rece_click, fontu003d("歌曲风格", 13),
宽度u003d6,高度u003d1)
self.button_Send.place(xu003d5, yu003d310) # 显示控件
显示框
实现记事本的功能组件
self.SendDataView u003d tkinter.Text(self.mainwin,width u003d 40,height u003d 9,
font u003d ("Song Style",13)) #Text其实是一个文本编辑器
self.SendDataView.place(x u003d 230,y u003d 35) # 显示
self.ReceDataView u003d tkinter.Text(self.mainwin, widthu003d40, heightu003d9,
fontu003d("Song Style", 13)) # Text其实就是一个文本编辑器
self.ReceDataView.place(xu003d230, yu003d230) # 显示
发送内容
test_str u003d tkinter.StringVar(valueu003d"Hello")
self.entrySend u003d tkinter.Entry(self.mainwin, widthu003d13,textvariable u003d test_str,font u003d ("Song Style",15))
self.entrySend.place(x u003d 80,y u003d 260) # 显示
获取文件路径
test_str u003d tkinter.StringVar(valueu003d"Hello")
self.entrySend u003d tkinter.Entry(self.mainwin, widthu003d13, textvariableu003dtest_str, fontu003d("Song Style", 15))
self.entrySend.place(xu003d80, yu003d260) # 显示
获取接口的参数
self.band u003d self.combobox_band.get()
self.check u003d self.combobox_check.get()
self.data u003d self.combobox_data.get()
self.stop u003d self.combobox_stop.get()
print("波特率:"+self.band)
self.myserial u003d SerialAchieve(int(self.band),self.check,self.data,self.stop)
处理串口值
self.port_list u003d self.myserial.get_port()
port_str_list u003d [] # 用于存储剪切序列号
for i in range(len(self.port_list)):
剪出序列号
行 u003d str(self.port_list[i])
str_list u003d lines.split(" ")
port_str_list.append(str_list[0])
self.combobox_port[“值”] u003d port_str_list
self.combobox_port.current(0) # 默认选择0
def 显示(自我):
self.mainwin.mainloop()
def button_OK_click(self):
'''
@串口打开功能
:返回:
'''
如果 self.port u003du003d None 或 self.port.isOpen() u003du003d False:
self.myserial.open_port(self.combobox_port.get())
print("成功打开串口")
其他:
通过
def button_Cancel_click(self):
self.myserial.delete_port()
print("成功关闭串口")
def button_clcSend_click(self):
self.SendDataView.delete("1.0","end")
def button_clcRece_click(self):
self.ReceDataView.delete("1.0", "end")
def button_Send_click(self):
尝试:
如果 self.myserial.port.isOpen() u003du003d True:
print("开始发送数据")
send_str1 u003d self.entrySend.get()
self.myserial.Write_data(send_str1)
self.SendDataView.insert(tkinter.INSERT, send_str1+"")
print("数据发送成功")
其他:
print("串口未打开")
除了:
print("发送失败")
def button_Rece_click(self):
尝试:
readstr u003d self.myserial.Read_data()
self.ReceDataView.insert(tkinter.INSERT, readstr + "")
除了:
print("读取失败")
如果 name u003du003d 'main':
my_ser1 u003d MainSerial()
my_ser1.show()
串口文件:
'''
//@作者:夏天
@工具:pycharm
@内容:串口通信实现类
@日期:2020.2.12
'''
导入序列号
导入 serial.tools.list_ports
类 SerialAchieve:
def init(self,bandu003d115200,checku003d"无校验位",datau003d8,stopu003d1):
self.port u003d 无
获取可用的串口
self.port_list u003d list(serial.tools.list_ports.comports())
断言 (len(self.port_list) !u003d 0),"没有可用的串行端口"
self.bandRate u003d 乐队
self.checkbit u003d 检查
self.databit u003d 数据
self.stopbit u003d 停止
读写数据
self.read_data u003d 无
self.write_data u003d 无
通过
def 显示端口(自我):
for i in range(0,len(self.port_list)):
打印(self.port_list[i])
def show_other(self):
print("波特率:"+self.bandRate)
print("校验位:" + self.checkbit)
print("数据位:" + self.databit)
print("停止位:" + self.stopbit)
返回串口
def get_port(自我):
返回 self.port_list
打开串口
def open_port(自我,端口):
self.port u003d serial.Serial(端口,self.bandRate,超时 u003d 无)
定义删除端口(自我):
如果 self.port !u003d 无:
self.port.close()
print("关闭串口完成")
其他:
通过
def Read_data(self): #self.port.read(self.port.in_wait)表示接收串口中的所有数据都已接收
self.read_data u003d self.port.read(self.port.in_waiting) # 读取数据
返回 self.read_data.decode("utf-8")
定义写入数据(自我,数据):
如果 self.port.isOpen() u003du003d 假:
print("串口打开错误")
其他:
self.port.write(data.encode("utf-8")) # 返回写入的字节数
如果 name u003du003d 'main':
myser u003d SerialAchieve()
myer.open 端口(“COM7”)
myser.delete_port()
myser.show_port()
因为程序写的比较仓促,所以有很多地方需要改进。如果您对这个项目感兴趣,可以一起改进它。
本项目GitHub地址
更多推荐
所有评论(0)