最近项目中要使用模拟数据源通过向外发送数据,以前都是用C#编写,最近在研究python,所以就用python写了一个串口助手,方便以后的测试。

在电脑上通过虚拟串口助手产生两个虚拟串口,运行编写的串口助手

另外,打开一个串口调试助手,辅助测试

  两者互发数据,可以看到编写的串口助手能够正常接收发送,并且在后台我们也把接收到的数据打印了出来

下面先讲解关于界面的代码,这里只是简单的使用tkinter做界面,如果想要更好的界面效果,可以尝试一下QT。

首先是界面中串口设置区域的代码,界面布局统一用grid来布局,当然也有其他的布局方法

 #-------------------------------------------------------------------------
#面板布局区
root = Tk()
root.title('xutopia 公众号:洛水梅家') #-------------------------------------------------------------------------
#串口设置区
label_com = Label(root, text="串口号", height=2).grid(row=0, column=0)
label_bps = Label(root, text="波特率", height=2).grid(column=0, row=1)
label_datBit = Label(root, text="数据位", height=2).grid(column=0, row=2)
label_parity = Label(root, text="校验位", height=2).grid(column=0, row=3)
label_stop_bit = Label(root, text="停止位", height=2).grid(column=0, row=4)

接下来是串口号的combobox的设置,其中serialPortFile.GetCom()是获取所有串口号的函数,接下来会讲解

#串口号
varPort = StringVar()
combo_com = ttk.Combobox(root, textvariable=varPort, width=8, height=2, justify=CENTER)
serial_com = serialPortFile.GetCom()
combo_com['values'] = serial_com
#combo_com.bind("<<ComboboxSelected>>", lambda event: combo1_handler(var=varPort.get()))
combo_com.current(0)
combo_com.grid(column=1, row=0)
 #波特率
varBitrate = StringVar()
combo_bps = ttk.Combobox(root, textvariable=varBitrate, width=8, height=2, justify=CENTER)
combo_bps['values'] = ("", "", "", "")
#combo_bps.bind("<<ComboboxSelected>>", lambda event: combo2_handler(var=varBitrate.get()))
combo_bps.current(0)
combo_bps.grid(column=1, row=1)
#数据位
combo_byteBit = ttk.Combobox(root, width=8, height=2, justify=CENTER)
combo_byteBit['values'] = ("", "", "", "")
combo_byteBit.current(3)
combo_byteBit.grid(column=1, row=2)
#奇偶校验
combo_parity = ttk.Combobox(root, width=8, height=2, justify=CENTER)
combo_parity['values'] = ("N", "O", "E")
combo_parity.current(0)
combo_parity.grid(column=1, row=3)
#停止位
combo_stopBit = ttk.Combobox(root, width=8, height=2, justify=CENTER)
combo_stopBit['values'] = ("", "1.5", "")
combo_stopBit.current(0)
combo_stopBit.grid(column=1, row=4)
serialPortFile.text_rx = Text(root,width=70,height=20)
serialPortFile.text_rx.grid(row=0,column=3,rowspan=5)
serialPortFile.text_rx.insert(END,'这是一个xutopia用python编写的串口助手,公众号:洛水梅家\n')
text_tx = Text(root,width=70,height=10)
text_tx.grid(row=5,column=3,rowspan=2)
text_tx.insert(END,'xutopia 公众号:洛水梅家,发送数据12345,上山打老虎')
button_send = Button(root, text='send', width=18, height=1)
button_send.bind("<Button-1>", lambda event: serialPortFile.usart_sent(var=text_tx.get("0.0", "end")))
button_send.grid(column=1, row=6)
#串口开关按钮
serialPortFile.button_var = StringVar()
serialPortFile.button_var.set("打开串口")
buttonOpenCom = Button(root, textvariable=serialPortFile.button_var, width=18, height=1)
buttonOpenCom.bind("<Button-1>", lambda event: serialPortFile.usart_ctrl(combo_com.get(), combo_bps.get(),combo_parity.get(),combo_stopBit.get(),combo_byteBit.get()))
buttonOpenCom.grid(column=1, row=5)

以上就是界面相关的代码,最终效果也就是上图显示的效果,很简单。接下来介绍python串口的逻辑代码部分。在另外一个模块中serialPortFile.py

获取电脑中所有的串口号的函数,注意这里通过serial.tools.list_ports.comports()获取所有的串口号之后进行了一步转换,存在一个数组中,这样,传入serial中才能被识别。

 # 获取并存储串口号到数组
def GetCom():
port_list = list(serial.tools.list_ports.comports())
print(len(port_list))
portcnt = len(port_list)
serial_com = []
for m in range(portcnt):
port_list_1 = list(port_list[m])
serial_com.append(port_list_1[0])
return serial_com

串口打开关闭函数,串口打开之后创建了一个线程threading,线程中一直监视串口的状态,一旦接受到数据,就把数据显示到接受数据显示框中。有关python线程threading的内容可以在我的公众号,洛水梅家中查看。

注意在代码中加了一个if ser.is_open:的条件判断,不加入这个条件的话,很有可能重复打开串口而报错误。

同时在按键Button的状态也随着串口的开关状态而变化。

def usart_ctrl(com, bps,parity_,stopbits_,bytesize_):
#print(__file__, sys._getframe().f_lineno, port_, bitrate_, var.get())
global ser, button_var
if button_var.get() == "打开串口":
button_var.set("关闭串口")
ser = serial.Serial(
port=com,
baudrate=int(bps),
parity=parity_,
timeout=0.2,
stopbits=float(stopbits_),
bytesize=int(bytesize_))
if ser.is_open:
pass
else:
ser.open()
recv_data = threading.Thread(target=thread_recv)
recv_data.start()
else:
button_var.set("打开串口")
if ser.is_open:
ser.close()
else:
pass
def usart_sent(var):
#print(__file__, sys._getframe().f_lineno, "-->", var)
print(var)
if ser.is_open:
ser.write(var.encode("gb2312"))
def thread_recv():
global text_rx
while True:
try:
read = ser.readall()
if len(read) > 0:
print(bytes(read).decode('gb2312'))
# print(__file__, sys._getframe().f_lineno, "<--", bytes(read).decode('ascii'))
text_rx.insert(END,bytes(read).decode('gb2312'))
except Exception as e:
print(e)
time.sleep(1)
pass

上面就是关于串口助手的所有代码介绍,更多详细内容,关注公众号 洛水梅家 免费获取源码

后台回复python_com,免费获取源码

python串口助手的更多相关文章

  1. Python串口编程

    python的串口网上有很多例子,这里了只是把认为好的整理到一起. 首先,应该安装serial模块,还能开始后续的操作.我用的python2.6,serial模块可以在这里下载安装serial模块下载 ...

  2. python3 Serial 串口助手的接收读取数据

    其实网上已经有许多python语言书写的串口,但大部分都是python2写的,没有找到一个合适的python编写的串口助手,只能自己来写一个串口助手,由于我只需要串口能够接收读取数据就可以了,故而这个 ...

  3. raspi串口、python串口模块pyserial

    一.安装 1.下载软件包pyserial-2.7.tar.gz   网址:https://pypi.python.org/pypi/pyserial 2.8uftp上传至/usr/local/src/ ...

  4. 谢欣伦 - OpenDev原创例程 - 串口助手Comm Assist

    前一段时间,一位博友发邮件给我.他跟我讲说没太看懂<化繁为简系列原创教程 - 通信专题 - 串口类CxComm的使用>,请我做一个DEMO工程给他.我抽了一天时间编写并上传了一个DEMO工 ...

  5. 34.QT-制作串口助手(并动态检测在线串口,附带源码)

    qextserialport-1.2rc库下载链接: http://www.pudn.com/Download/item/id/2298532.html 1.添加源码到工程 将qextserialpo ...

  6. Qt小项目之串口助手控制LED

    Qt小项目之串口助手控制LED 前言 最近刚学了一点Qt开发上位机,尝试着做个小软件练练手.查找了很多资料,做了一个简单的串口助手,可以实现串口基本发送和接收功能,支持中文显示,还可以控制STM32开 ...

  7. 用 PYQT5 和 QT Dseingner 写的串口助手

    最近公司做项目需要写串口助手,于是从网上找教程着手写了一下,基本的功能可以实现了,但是想要一个表盘的功能一直没有找到教程,有些遗憾.大神们会的话给指导指导  谢谢啦 ! 下边有源码的连接,欢迎大家下载 ...

  8. 通过编写串口助手工具学习MFC过程--(十一)弹出模态型对话框

    通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...

  9. 通过编写串口助手工具学习MFC过程——(十)UpdateData()用法和编辑框的赋值、取值

    通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...

随机推荐

  1. 洛谷P3951 小凯的疑惑 - 数学 /扩展欧几里得

    传送门 题意:求出a和b不能通过线性组合(即n*a+m*b)得到的最大值: 思路:摘自洛谷: 不妨设 a<b 假设答案为 x 若 x≡m*a ( mod b )(1≤m≤b−1) (mod3)什 ...

  2. 并发、线程的基本概念&线程启动结束

    并发.进程.可执行程序.进程.线程的基本概念 1.并发 并发当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间段 ...

  3. lightoj 1030-B - Discovering Gold (概率dp)

    题意:有一个直线的金矿,每个点有一定数量的金子:你从0开始,每次扔个骰子,扔出几点就走几步, 然后把那个点的金子拿走:如果扔出的骰子超出了金矿,就重新扔,知道你站在最后一个点:问拿走金 子的期望值是多 ...

  4. JS执行机制详解,定时器时间间隔的真正含义

     壹 ❀ 引 通过结果倒推过程是我们常用的思考模式,我在上一篇学习promise笔记中,有少量关于promise执行顺序的例子,通过倒推,我成功让自己对于js执行机制的理解一塌糊涂,js事件机制,事件 ...

  5. 自定义属性,innerHTML,outerHTML,dom节点的获取,className,tagName,更改或者是获取css属性

    01.自定义属性 1.自定义属性: 作用:保存数据 通用的自定义属性的前缀 data-属性="属性值" 注:自定义的属性不能通过 元素.属性 取属性值 ,需使用getAttribu ...

  6. MySQL连接方式小结

    1.   连接方式 1.1  方式1 /usr/local/mysql5./bin/mysql -p 此方法默认采用root@localhost用户登录, 1.2  方式2 /usr/local/my ...

  7. 【Offer】[63] 【股票的最大利润】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少? 例如,一只股票在某些时间节点的价格为{9, ...

  8. C++ lambda的演化

    翻译自https://www.bfilipek.com/2019/02/lambdas-story-part1.html与https://www.bfilipek.com/2019/02/lambda ...

  9. fastjson对象,JSON,字符串,map之间的互转

    1.对象与字符串之间的互转 将对象转换成为字符串 String str = JSON.toJSONString(infoDo); 字符串转换成为对象 InfoDo infoDo = JSON.pars ...

  10. Fortify安全漏洞一般处理方法

    前段时间公司又一轮安全审查,要求对各项目进行安全扫描,排查漏洞并修复,手上有几个历史项目,要求在限定的时间内全部修复并提交安全报告,也不清楚之前是如何做的漏洞修复,这次使用工具扫描出来平均每个项目都还 ...