python实现串口通讯小程序(GUI界面)

使用python实现串口通讯需要使用python的pyserial库来实现,这个库在安装python的时候没有自动进行安装,需要自己进行安装。

1、安装pyserial库:

打开命令行窗口,在命令行中输入:pip install pyserial 命令进行安装。

2、程序使用python自带的GUI库tkinter来实现GUI窗口,使用pyserial来实现串口通讯模块。

效果图如下:

串口号选择框会自动加载所有可用的串口号,并且显示在选择框中。在使用时选择合适的串口号,然后点击打开串口按键即可。

注:本程序使用的是虚拟串口

3、效果演示:

1)发送数据演示:

注:在发送数据显示框中显示字符,则表明发送成功

动态效果演示:

2)接收数据演示:

注:接收数据显示框显示字符,则表明发送数据成功

动态演示效果:

4:工程介绍:

本工程由两个文件组成:分别是GUI文件和串口文件。

文件代码如下:

GUI文件:

'''

@ author: summer

@ tools: pycharm

@ content: 实现串口通讯主类

@ date: 2020.2.12

'''

import tkinter

from tkinter import ttk

from 串口通讯.SerialClass import SerialAchieve # 导入串口通讯类

class MainSerial:

def __init__(self):

# 定义串口变量

self.port = None

self.band = None

self.check = None

self.data = None

self.stop = None

self.myserial = None

# 初始化窗体

self.mainwin = tkinter.Tk()

self.mainwin.title("串口调试工具")

self.mainwin.geometry("600x400")

# 标签

self.label1 = tkinter.Label(self.mainwin,text = "串口号:",font = ("宋体",15))

self.label1.place(x = 5,y = 5)

self.label2 = tkinter.Label(self.mainwin, text="波特率:", font=("宋体", 15))

self.label2.place(x=5, y=45)

self.label3 = tkinter.Label(self.mainwin, text="校验位:", font=("宋体", 15))

self.label3.place(x=5, y=85)

self.label4 = tkinter.Label(self.mainwin, text="数据位:", font=("宋体", 15))

self.label4.place(x=5, y=125)

self.label5 = tkinter.Label(self.mainwin,text = "停止位:",font = ("宋体",15))

self.label5.place(x = 5,y = 165)

# 文本显示,清除发送数据

self.label6 = tkinter.Label(self.mainwin, text="发送数据:", font=("宋体", 15))

self.label6.place(x=230, y=5)

self.label7 = tkinter.Label(self.mainwin, text="接收数据:", font=("宋体", 15))

self.label7.place(x=230, y=200)

# 串口号

self.com1value = tkinter.StringVar() # 窗体中自带的文本,创建一个值

self.combobox_port = ttk.Combobox(self.mainwin, textvariable=self.com1value,

width = 10,font = ("宋体",13))

# 输入选定内容

self.combobox_port["value"] = [""] # 这里先选定

self.combobox_port.place(x = 105,y = 5) # 显示

# 波特率

self.bandvalue = tkinter.StringVar() # 窗体中自带的文本,创建一个值

self.combobox_band = ttk.Combobox(self.mainwin, textvariable=self.bandvalue, width=10, font=("宋体", 13))

# 输入选定内容

self.combobox_band["value"] = ["4800","9600","14400","19200","38400","57600","115200"] # 这里先选定

self.combobox_band.current(6) # 默认选中第0个

self.combobox_band.place(x=105, y=45) # 显示

# 校验位

self.checkvalue = tkinter.StringVar() # 窗体中自带的文本,创建一个值

self.combobox_check = ttk.Combobox(self.mainwin, textvariable=self.checkvalue, width=10, font=("宋体", 13))

# 输入选定内容

self.combobox_check["value"] = ["无校验位"] # 这里先选定

self.combobox_check.current(0) # 默认选中第0个

self.combobox_check.place(x=105, y=85) # 显示

# 数据位

self.datavalue = tkinter.StringVar() # 窗体中自带的文本,创建一个值

self.combobox_data = ttk.Combobox(self.mainwin, textvariable=self.datavalue, width=10, font=("宋体", 13) )

# 输入选定内容

self.combobox_data["value"] = ["8", "9", "0"] # 这里先选定

self.combobox_data.current(0) # 默认选中第0个

self.combobox_data.place(x=105, y=125) # 显示

# 停止位

self.stopvalue = tkinter.StringVar() # 窗体中自带的文本,创建一个值

self.combobox_stop = ttk.Combobox(self.mainwin, textvariable=self.stopvalue, width=10, font=("宋体", 13))

# 输入选定内容

self.combobox_stop["value"] = ["1", "0"] # 这里先选定

self.combobox_stop.current(0) # 默认选中第0个

self.combobox_stop.place(x=105, y=165) # 显示

# 按键显示,打开串口

self.button_OK = tkinter.Button(self.mainwin, text="打开串口",

command=self.button_OK_click, font = ("宋体",13),

width = 10,height = 1)

self.button_OK.place(x = 5,y = 210) # 显示控件

# 关闭串口

self.button_Cancel = tkinter.Button(self.mainwin, text="关闭串口", # 显示文本

command=self.button_Cancel_click, font = ("宋体",13),

width=10, height=1)

self.button_Cancel.place(x = 120,y = 210) # 显示控件

# 清除发送数据

self.button_Cancel = tkinter.Button(self.mainwin, text="清除发送数据", # 显示文本

command=self.button_clcSend_click, font=("宋体", 13),

width=13, height=1)

self.button_Cancel.place(x=400, y=2) # 显示控件

# 清除接收数据

self.button_Cancel = tkinter.Button(self.mainwin, text="清除接收数据", # 显示文本

command=self.button_clcRece_click, font=("宋体", 13),

width=13, height=1)

self.button_Cancel.place(x=400, y=197) # 显示控件

# 发送按键

self.button_Send = tkinter.Button(self.mainwin, text="发送", # 显示文本

command=self.button_Send_click, font=("宋体", 13),

width=6, height=1)

self.button_Send.place(x=5, y=255) # 显示控件

# 接收按键

self.button_Send = tkinter.Button(self.mainwin, text="接收", # 显示文本

command=self.button_Rece_click, font=("宋体", 13),

width=6, height=1)

self.button_Send.place(x=5, y=310) # 显示控件

# 显示框

# 实现记事本的功能组件

self.SendDataView = tkinter.Text(self.mainwin,width = 40,height = 9,

font = ("宋体",13)) # text实际上是一个文本编辑器

self.SendDataView.place(x = 230,y = 35) # 显示

self.ReceDataView = tkinter.Text(self.mainwin, width=40, height=9,

font=("宋体", 13)) # text实际上是一个文本编辑器

self.ReceDataView.place(x=230, y=230) # 显示

# 发送的内容

test_str = tkinter.StringVar(value="Hello")

self.entrySend = tkinter.Entry(self.mainwin, width=13,textvariable = test_str,font = ("宋体",15))

self.entrySend.place(x = 80,y = 260) # 显示

# 获取文件路径

test_str = tkinter.StringVar(value="Hello")

self.entrySend = tkinter.Entry(self.mainwin, width=13, textvariable=test_str, font=("宋体", 15))

self.entrySend.place(x=80, y=260) # 显示

# 获取界面的参数

self.band = self.combobox_band.get()

self.check = self.combobox_check.get()

self.data = self.combobox_data.get()

self.stop = self.combobox_stop.get()

print("波特率:"+self.band)

self.myserial = SerialAchieve(int(self.band),self.check,self.data,self.stop)

# 处理串口值

self.port_list = self.myserial.get_port()

port_str_list = [] # 用来存储切割好的串口号

for i in range(len(self.port_list)):

# 将串口号切割出来

lines = str(self.port_list[i])

str_list = lines.split(" ")

port_str_list.append(str_list[0])

self.combobox_port["value"] = port_str_list

self.combobox_port.current(0) # 默认选中第0个

def show(self):

self.mainwin.mainloop()

def button_OK_click(self):

'''

@ 串口打开函数

:return:

'''

if self.port == None or self.port.isOpen() == False:

self.myserial.open_port(self.combobox_port.get())

print("打开串口成功")

else:

pass

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):

try:

if self.myserial.port.isOpen() == True:

print("开始发送数据")

send_str1 = self.entrySend.get()

self.myserial.Write_data(send_str1)

self.SendDataView.insert(tkinter.INSERT, send_str1+" ")

print("发送数据成功")

else:

print("串口没有打开")

except:

print("发送失败")

def button_Rece_click(self):

try:

readstr = self.myserial.Read_data()

self.ReceDataView.insert(tkinter.INSERT, readstr + " ")

except:

print("读取失败")

if __name__ == '__main__':

my_ser1 = MainSerial()

my_ser1.show()

串口文件:

'''

@ author: summer

@ tools: pycharm

@ content: 串口通讯实现类

@ date: 2020.2.12

'''

import serial

import serial.tools.list_ports

class SerialAchieve:

def __init__(self,band=115200,check="无校验位",data=8,stop=1):

self.port = None

# 获取可用串口

self.port_list = list(serial.tools.list_ports.comports())

assert (len(self.port_list) != 0),"无可用串口"

self.bandRate = band

self.checkbit = check

self.databit = data

self.stopbit = stop

# 读写的数据

self.read_data = None

self.write_data = None

pass

def show_port(self):

for i in range(0,len(self.port_list)):

print(self.port_list[i])

def show_other(self):

print("波特率:"+self.bandRate)

print("校验位:" + self.checkbit)

print("数据位:" + self.databit)

print("停止位:" + self.stopbit)

# 返回串口

def get_port(self):

return self.port_list

# 打开串口

def open_port(self,port):

self.port = serial.Serial(port, self.bandRate,timeout = None)

def delete_port(self):

if self.port != None:

self.port.close()

print("关闭串口完成")

else:

pass

def Read_data(self): # self.port.read(self.port.in_waiting) 表示全部接收串口中的数据

self.read_data = self.port.read(self.port.in_waiting) # 读取数据

return self.read_data.decode("utf-8")

def Write_data(self,data):

if self.port.isOpen() == False:

print("串口打开错误")

else:

self.port.write(data.encode("utf-8")) # 返回的是写入的字节数

if __name__ == '__main__':

myser = SerialAchieve()

myser.open_port("COM7")

myser.delete_port()

myser.show_port()

由于程序写的比较匆忙,所以还有很多需要完善的地方,如果你对这个工程感兴趣可以一起来完善它。

本工程GitHub地址

python实现串口通讯小程序(GUI界面)

原文:https://www.cnblogs.com/zhicungaoyuan-mingzhi/p/12303229.html

python gui界面制作显示串口数据_python实现串口通讯小程序(GUI界面)相关推荐

  1. python串口界面编程_python实现串口通讯小程序(GUI界面)

    python实现串口通讯小程序(GUI界面) 使用python实现串口通讯需要使用python的pyserial库来实现,这个库在安装python的时候没有自动进行安装,需要自己进行安装. 1.安装p ...

  2. python监听串口数据_python 读取串口数据的示例

    python3 读取串口数据 demo 最近在写一个demo,zigbee串口连接树莓派,树莓派使用串口通信接受zigbee穿过来得值.其中我是用的树莓派是3代B+,zigbee每隔三秒钟从串口输出数 ...

  3. python中texttable库显示实时数据_python显示数据库数据

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  4. 数字信号 fft c源码_如何制作一个简单的人体动态识别微信小程序(附源码)

    知乎小白第一次写专栏,还请多指教. 先放成果. GitHub源码: lrioxh/HAR-applet-of-Wechat​github.com b站演示视频: 居然不需要服务器?!如何制作一个简单的 ...

  5. 小程序数据框有重影_小程序开发(二):数据绑定

    前言: 第一章讲到了如何去创建一个项目,并且在模拟器上显示出来hello world,但是程序开发中,很多的数据都是从服务器去获取或者显示的数据会根据用户的操作来变化的,所以我们需要用到数据绑定. 数 ...

  6. 简单Java小程序----有界面ATM机

    继<简单Java小程序---无界面ATM机>以后,尝试对有界面ATM机改写,对面向对象的了解又深了一层! 桌面的创建过程       由于使用的NetBean软件没有提供专用的控件拖拽使用 ...

  7. 12_心理咨询_微信小程序项目实战_数据交互_深入理解小程序

    前言 我们实现静态页面,只需要稍微懂一点HTML/CSS即可或者零基础都可以,但是如果想要进行数据交互,需要对小程序有一定的理解: 小程序提供了一个简单.高效的应用开发框架和丰富的组件及API,帮助开 ...

  8. 视频教程-微信小程序商城-界面设计实战教学(含源代码)-微信开发

    微信小程序商城-界面设计实战教学(含源代码) 04年进入计算机行业.拥有6年net和php项目开发经验,8年java项目开发经验. 现前端全栈工程师,主攻产品设计,微信开发等. 黄菊华 ¥90.00 ...

  9. 用聚合数据API快速写出小程序

    利用聚合数据API快速写出小程序,过程简单. 1.申请小程序账号 2.进入开发 3.调用API.比如"苏州实时公交"小程序,选择的是苏州实时公交API. 苏州实时公交API文档:h ...

最新文章

  1. 零基础入门学习Python(2)
  2. 16s扩增子分析注意事项和经验总结Tips
  3. 点击按钮的时候,切换搜索框的显示与隐藏(动画)
  4. 导入Vitamio库后libBaiduMapSDK找不到
  5. 三角窗 matlab,【matlab】矩形窗/三角窗/hanning窗/hamming窗/blackman窗的頻率響應圖
  6. Neutron 架构 - 每天5分钟玩转 OpenStack(67)
  7. 分子排列不同会导致_生物信息遇上Deep learning(7): ReLeaSE--强化学习做药物分子设计...
  8. 流媒体(视频)服务器调研
  9. github 公钥 私钥_ubuntu git生成ssh key (公钥私钥)配置github或者码云
  10. 教你前端input框只允许输入正整数
  11. Suse发生了错误Access denied for user #39;#39;@#39;localhost#39; toamp;
  12. 如何让WebStorm正常显示出中文提示,使得中文能够正常输入,请看这里
  13. saveas中参数gcf的理解
  14. ntp版本导致时间同步不成功问题
  15. 【国产单片机】华大HC32L13系列使用printf进行调试(多种方法)
  16. tekla中钢筋外形(TSM.RebarGeometry)
  17. iphone 热点 android,苹果手机的热点安卓机可以连接吗(图文)
  18. 北京市长昨天晚上给我们送温暖啦:)
  19. C语言在中math.h中sqrt()函数的使用
  20. 使用Charles代理工具,导致浏览器无法打开网页

热门文章

  1. 几年级学奥数最好?奥数金牌教练建议3年级开始学...
  2. rebar3编译及发布erlang程序
  3. 夜莺日志采集mtail
  4. mysql 外键约束失败_mysql外键创建失败原因
  5. C# 托管内存与非托管内存之间的转换
  6. Synplify Premier使用教程
  7. jQuery分页插件sPage
  8. http://sebug.net/paper/databases/nosql/Nosql.html
  9. drwtsn32.exe
  10. java Boolean toString()方法