找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7061|回复: 18
打印 上一主题 下一主题
收起左侧

Python串口助手 TK界面(含源代码)

  [复制链接]
跳转到指定楼层
楼主
学习两个月的Python ,经过千辛万苦,熬夜写的软件,含有源码


单片机源程序如下:
  1. from tkinter import  *
  2. from tkinter import ttk
  3. from tkinter import messagebox
  4. import threading
  5. import serial
  6. import serial.tools.list_ports
  7. import time
  8. import sys





  9. data = None
  10. tx=None
  11. recv_end = False
  12. send_data=None
  13. send_data_hex=None
  14. txt_rece_show=None
  15. txt_send_show=None
  16. myser=None
  17. window=None
  18. th_receve=None
  19. ports=[]
  20. comvalue_port=None
  21. comvalue_baudrate=None
  22. comvalue_bytesize=None
  23. comvalue_prity=None
  24. comvalue_stopbits=None

  25. chekbuvalue_line = None
  26. chekbuvalue_time_show=None
  27. checkbuvalue_send_show=None

  28. combox_port=None
  29. combox_stopbits=None
  30. combox_prity=None
  31. combox_bytesize=None
  32. combox_baudrate=None

  33. radb_hex_ascii=None
  34. radb1_hex_ascii=None

  35. but_open_clos_port=None
  36. exit_mark=True
  37. port_list=[]


  38. def recv():
  39.     global tx
  40.     global data
  41.     global recv_end
  42.     global txt_rece_show
  43.     print('---rec-start---')

  44.     while exit_mark:

  45.         # print(myser.isOpen())
  46.         time.sleep(0.01)
  47.         data = ''
  48.         # data1=''
  49.         data = data.encode('utf-8')
  50.         try:
  51.             if myser.isOpen():
  52.                 time.sleep(0.01)
  53.                 n = myser.inWaiting()
  54.                 # print(n)
  55.                 if n:
  56.                     for i in range(n):
  57.                         data = data+myser.read()
  58.                     print(data)
  59.                     print(n)
  60.                     print(len(data))
  61.                     insert_txt(txt_rece_show)
  62.         except Exception as e:
  63.             print('--异常--',e)


  64. def find_port_list():
  65.     global ports
  66.     global port_list
  67.     global myser
  68.     port_test = None
  69.     port_list = serial.tools.list_ports.comports()
  70.     for i in range(len(port_list)):
  71.         ports.append(port_list[i][0])
  72.         try:
  73.             myser = serial.Serial(port_list[i][0])
  74.             myser.close()
  75.         except:
  76.             print(port_list[i][0],'打开失败')


  77.     return ports

  78. def open_close_port():
  79.     global myser
  80.     global th_receve
  81.     global comvalue_port
  82.     global comvalue_baudrate
  83.     global comvalue_bytesize
  84.     global comvalue_prity
  85.     global comvalue_stopbits
  86.     global but_open_clos_port
  87.     global combox_port
  88.     global combox_stopbits
  89.     global combox_prity
  90.     global combox_bytesize
  91.     global combox_baudrate


  92.     myport = comvalue_port.get()
  93.     mybaudrate = comvalue_baudrate.get()
  94.     mybytesize = comvalue_bytesize.get()
  95.     myprity = comvalue_prity.get()
  96.     mystopbits = comvalue_stopbits.get()

  97.     myser.port=myport
  98.     myser.baudrate = mybaudrate
  99.     myser.bytesize=int(mybytesize)
  100.     myser.parity=myprity

  101.     if mystopbits == '1':
  102.         myser.stopbits=serial.STOPBITS_ONE
  103.     elif mystopbits == '1.5':
  104.         myser.stopbits = serial.STOPBITS_ONE_POINT_FIVE
  105.     elif mystopbits == '2':
  106.         myser.stopbits = serial.STOPBITS_TWO


  107.     try:
  108.         if myser.isOpen():

  109.             myser.close()
  110.             combox_port['state'] = "normal"
  111.             combox_baudrate['state'] = "normal"
  112.             combox_bytesize['state'] = "normal"
  113.             combox_prity['state'] = "normal"
  114.             combox_stopbits['state'] = "normal"

  115.             but_open_clos_port['text']='打开串口(串口已经关闭)'
  116.             print(myser.name,'串口已经关闭')
  117.         else:
  118.             myser.open()

  119.             combox_port['state']="disable"
  120.             combox_baudrate['state']="disable"
  121.             combox_bytesize['state']="disable"
  122.             combox_prity['state']="disable"
  123.             combox_stopbits['state']="disable"
  124.             but_open_clos_port['text'] = '关闭串口(串口已经打开)'
  125.             print(myser.name,'串口已经打开')
  126.     except Exception as e:
  127.         print('--串口打开异常—',e)
  128.         str_mes = myser.name + " 打开失败"
  129.         open_port_mesbox=messagebox.showinfo('提示',str_mes)


  130. def send_mydata(serial):
  131.     global send_data
  132.     global radb1_hex_ascii
  133.     if serial.isOpen() :
  134.         if radb1_hex_ascii.get()==1:
  135.             # serial.write(send_data.encod('utf-8'))
  136.             serial.write(send_data.encode('utf-8'))
  137.         if radb1_hex_ascii.get()==2:
  138.             serial.write(send_data_hex)
  139.         #     pass


  140. def get_txt_send_show():
  141.     global send_data
  142.     global txt_send_show
  143.     global radb1_hex_ascii
  144.     global send_data_hex
  145.     if radb1_hex_ascii.get()==1:
  146.         send_data = txt_send_show.get('1.0', 'end')
  147.         print('send_data type',type(send_data))
  148.         print(send_data)
  149.         pass
  150.     if radb1_hex_ascii.get()==2:
  151.         send_data_hex = bytes.fromhex(txt_send_show.get('1.0', 'end'))
  152.         print('send_data_hex type',type(send_data_hex))
  153.         print(send_data_hex)
  154.     #     pass
  155.     # send_data = txt_send_show.get('1.0','end')

  156. def button_sent_data():
  157.     print(myser.isOpen())
  158.     get_txt_send_show()
  159.     send_mydata(myser)

  160. def insert_txt(tx):
  161.     global radb_hex_ascii
  162.     global chekbuvalue_line
  163.     global chekbuvalue_send_show
  164.     global data

  165.     # timeadd=''

  166.     if chekbuvalue_time_show.get()==1 & chekbuvalue_line.get()==1:
  167.         timeadd=str(time.strftime("[%H:%M:%S]", time.localtime()))
  168.         print('timeadd',timeadd)
  169.     else:
  170.         timeadd=''

  171.     if radb_hex_ascii.get()==1:
  172.         data = timeadd.encode('utf-8') + data
  173.         tx.insert('end', data)
  174.     if radb_hex_ascii.get()==2:
  175.         hex_str=''
  176.         for i in range(len(data)):
  177.             # print('%x'%data[i])
  178.             hex_str=hex_str+('%x'%data[i]).upper()+' '
  179.         hex_str=timeadd+hex_str
  180.         tx.insert('end', hex_str)

  181.     if chekbuvalue_line.get()==1:
  182.         print('自动换行已经选中')
  183.         tx.insert('end', '\n')

  184. def clear_all_txt():
  185.     global txt_rece_show
  186.     txt_rece_show.delete('1.0','end')

  187. def all_exit():
  188.     global window
  189.     global exit_mark
  190.     exit_mark=False
  191.     if myser.isOpen:
  192.         myser.close()
  193.     time.sleep(0.1)
  194.     sys.exit()



  195. def mygui():
  196.         global myser
  197.         global window
  198.         global th_receve
  199.         global comvalue_port
  200.         global comvalue_baudrate
  201.         global comvalue_bytesize
  202.         global comvalue_prity
  203.         global comvalue_stopbits
  204.         global chekbuvalue_line
  205.         global chekbuvalue_time_show
  206.         global checkbuvalue_send_show

  207.         global combox_port
  208.         global combox_stopbits
  209.         global combox_prity
  210.         global combox_bytesize
  211.         global combox_baudrate
  212.         global checkbu


  213.         global port_list

  214.         find_port_list()
  215.         # port_list[0][0]

  216.         try:
  217.             # myser = serial.Serial(port_list[0][0])
  218.             # myser.close()
  219.             th_receve = threading.Thread(target=recv)
  220.             th_receve.start()
  221.         except Exception as e:
  222.             print('--串口异常--',e)


  223.         window = Tk()
  224.         window.title('HaiLang serial tools')
  225.         window.geometry('700x400')
  226.         window.resizable(width=False,height=False)  # 窗口大小不可更改
  227.         window.protocol('WM_DELETE_WINDOW',all_exit)
  228.         # window.bind('<QUIT>',all_exit)


  229.         frame_set = Frame(window)   # 设置单元框架
  230.         frame_set.pack(side="left",padx=10)
  231.         frame_disply =Frame(window) # 显示单元框架
  232.         frame_disply.pack(side='right')

  233. #  设置单元框架
  234.         # 串口设置 LableFrame
  235.         lf_port_set = LabelFrame(frame_set,text="串口设置")
  236.         lf_port_set.pack()

  237.         lf_port_set.rowconfigure([0,1,2,3,4],minsize=30)
  238.         lf_port_set.rowconfigure(5, minsize=10)
  239.         #*****************************************************
  240.         label_port = Label(lf_port_set,text="端  口:")
  241.         label_port.grid(row=0,column=0,padx=10)

  242.         global ports
  243.         comvalue_port=StringVar()
  244.         combox_port = ttk.Combobox(lf_port_set,textvariable=comvalue_port)
  245.         combox_port['values']=ports
  246.         combox_port.current(0)
  247.         combox_port.grid(row=0,column=1,padx=10)



  248.         #*****************************************************
  249.         label_baudrate = Label(lf_port_set, text="波特率:")
  250.         label_baudrate.grid(row=1,column=0)

  251.         comvalue_baudrate = StringVar()
  252.         combox_baudrate = ttk.Combobox(lf_port_set, textvariable=comvalue_baudrate)
  253.         combox_baudrate['values'] = [2400, 4800,9600, 19200,
  254.                                      38400, 57600, 115200]
  255.         combox_baudrate.current(2)
  256.         combox_baudrate.grid(row=1, column=1)
  257.         #*****************************************************

  258.         label_bytesize = Label(lf_port_set, text="数据位:")
  259.         label_bytesize.grid()

  260.         comvalue_bytesize = StringVar()
  261.         combox_bytesize = ttk.Combobox(lf_port_set,
  262.                                        textvariable=comvalue_bytesize)
  263.         combox_bytesize['values'] = [serial.FIVEBITS, serial.SIXBITS, serial.SEVENBITS, serial.EIGHTBITS]
  264.         combox_bytesize.current(3)
  265.         combox_bytesize.grid(row=2, column=1)
  266.         #*****************************************************

  267.         label_prity = Label(lf_port_set, text="校验位:")
  268.         label_prity.grid()

  269.         comvalue_prity = StringVar()
  270.         combox_prity = ttk.Combobox(lf_port_set,
  271.                                        textvariable=comvalue_prity)
  272.         combox_prity['values'] = [serial.PARITY_EVEN, serial.PARITY_NONE, serial.PARITY_ODD]
  273.         combox_prity.current(1)
  274.         combox_prity.grid(row=3, column=1)
  275.         #*****************************************************

  276.         label_stopbits = Label(lf_port_set, text="停止位:")
  277.         label_stopbits.grid()

  278.         comvalue_stopbits = StringVar()
  279.         combox_stopbits = ttk.Combobox(lf_port_set,
  280.                                     textvariable=comvalue_stopbits)
  281.         combox_stopbits['values'] = [serial.STOPBITS_ONE,  serial.STOPBITS_TWO]
  282.         combox_stopbits.current(0)
  283.         combox_stopbits.grid(row=4, column=1)



  284.         #*****************************************************
  285.         global but_open_clos_port
  286.         but_open_clos_port =Button(frame_set,text='打开串口' ,command=open_close_port)
  287.         but_open_clos_port.pack(fill='x')

  288.         #*****************************************************

  289.         lf_receve_set =LabelFrame(frame_set,text="接收设置")
  290.         lf_receve_set.pack(fill='x')

  291.         global radb_hex_ascii
  292.         radb_hex_ascii = IntVar()
  293.         radb_hex_ascii.set(1)
  294.         radb_ascii = Radiobutton(lf_receve_set,text='ASCII',variable=radb_hex_ascii,value=1)
  295.         radb_ascii.grid(row=0,column=0)
  296.         radb_hex = Radiobutton(lf_receve_set,text='HEX',variable=radb_hex_ascii,value=2)
  297.         radb_hex.grid(row=0,column=1)
  298.         radb_hex_ascii.get()

  299.         chekbuvalue_line = IntVar()
  300.         checkbu_line = Checkbutton(lf_receve_set,text='自动换行',variable=chekbuvalue_line)
  301.         checkbu_line.grid(row=1,column=0,padx=10)

  302.         # checkbuvalue_send_show=IntVar()
  303.         # checkbu_send_show = Checkbutton(lf_receve_set, text='显示发送',variable=checkbuvalue_send_show)
  304.         # checkbu_send_show.grid(row=2, column=0)

  305.         chekbuvalue_time_show = IntVar()
  306.         checkbu_time_show = Checkbutton(lf_receve_set, text='显示时间',variable=chekbuvalue_time_show)
  307.         checkbu_time_show.grid(row=3, column=0)

  308.         but_clear_txt=Button(lf_receve_set,text='清空接收',command=clear_all_txt)
  309.         but_clear_txt.grid(row=0,column=2,padx=20)

  310. ……………………

  311. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
mypythonserialtools.rar (8.13 MB, 下载次数: 176)


评分

参与人数 3黑币 +90 收起 理由
外星人11111 + 30
王者不可阻挡 + 10 感谢大佬
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏14 分享淘帖 顶 踩
回复

使用道具 举报

来自 2#
ID:296541 发表于 2020-4-12 22:56 | 只看该作者
修复了无可用串口时打开错误的BUG

hailangserialtools.rar

8.09 MB, 下载次数: 116, 下载积分: 黑币 -5

评分

参与人数 1黑币 +70 收起 理由
admin + 70 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:723508 发表于 2020-4-6 17:16 | 只看该作者
不错,用python做这类东西头次见,学习了。。。。
回复

使用道具 举报

地板
ID:296541 发表于 2020-4-7 16:53 | 只看该作者
fgdzypf 发表于 2020-4-6 17:16
不错,用python做这类东西头次见,学习了。。。。

是滴 之前在网上找没有找到 就自己做了一个
回复

使用道具 举报

5#
ID:91165 发表于 2020-4-11 15:37 | 只看该作者
python的学习学习  
回复

使用道具 举报

6#
ID:693413 发表于 2020-4-12 21:53 | 只看该作者
下载下来打不开,提示这个压缩文件格式未知或者数据已损坏
回复

使用道具 举报

7#
ID:296541 发表于 2020-4-12 22:16 | 只看该作者
jh2020 发表于 2020-4-12 21:53
下载下来打不开,提示这个压缩文件格式未知或者数据已损坏

python 2.7 写的  一般Windows 都可以打开 有可能你的电脑 缺少某种文件 你可以试试装一下 Python2.7的环境,如果还是不行的话,有源代码,可以用Python 2.7 打开源码
回复

使用道具 举报

8#
ID:296541 发表于 2020-4-12 22:26 | 只看该作者
jh2020 发表于 2020-4-12 21:53
下载下来打不开,提示这个压缩文件格式未知或者数据已损坏

是用Python 3.7写的   有BUG  你的电脑上需要有COM口 虚拟的也行才能打开
回复

使用道具 举报

9#
ID:282431 发表于 2020-4-12 22:50 | 只看该作者
python语言学习学习
回复

使用道具 举报

10#
ID:727812 发表于 2020-4-13 12:21 | 只看该作者
大神牛啊,学习了
回复

使用道具 举报

11#
ID:693413 发表于 2020-5-10 16:31 | 只看该作者
压缩包打开不了

51hei截图_20200510163016.png (11.1 KB, 下载次数: 184)

51hei截图_20200510163016.png
回复

使用道具 举报

12#
ID:328014 发表于 2020-5-10 18:08 | 只看该作者
jh2020 发表于 2020-5-10 16:31
压缩包打开不了

刚测了winrar最新版可以正常打开,,其他压缩软件不行的哦
回复

使用道具 举报

13#
ID:748560 发表于 2020-5-10 19:08 | 只看该作者
不错,用python做这类东西头次见,之前都是C#做的
回复

使用道具 举报

14#
ID:749484 发表于 2020-5-11 23:21 | 只看该作者
整个要支持,之前学了c#,最近正打算学python,可以参考
回复

使用道具 举报

15#
ID:568538 发表于 2020-6-6 21:41 | 只看该作者
感谢分享,但是打不开,如图所示~

_20200606214010.png (63.55 KB, 下载次数: 164)

_20200606214010.png
回复

使用道具 举报

16#
ID:827841 发表于 2022-7-6 10:25 | 只看该作者
hailang0304 发表于 2020-4-12 22:56
修复了无可用串口时打开错误的BUG

很不错 学习了!
回复

使用道具 举报

17#
ID:691028 发表于 2022-7-6 13:23 | 只看该作者
非常好的入门参考资料,楼主太厉害了,短短不到一个月就已经修炼到如此程度,佩服佩服!
回复

使用道具 举报

18#
ID:268736 发表于 2022-11-10 18:23 | 只看该作者
寫得太好了!可以取代 HyperTerminal 謝謝分享 !
回复

使用道具 举报

19#
ID:517256 发表于 2022-11-11 15:42 | 只看该作者

python的学习学习  
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表