串口调试工具,PC上虚拟串口收发测试,串口数据监听
最近项目需要通过串口与硬件进行通信交互,就提前进行了一下技术调研,新增了一些串口通信方面知识。下面本文将介绍一套可能有助于串口通信测试的软硬件。
一、串口的简单认识
本身不是做硬件开发的,可以简单了解下串口相关的知识,这里贴一个知乎的地址,大家可以看下,我人为还是比较通俗易懂的:https://zhuanlan.zhihu.com/p/87400956
二、PC上的串口测试软件
目前使用了几款串口测试软件,各有特色吧,下载地址当时没保留,可自行百度。
1、sscom 这个可能做硬件开发的用的比较多吧,网上很多教程里面用的都是这款
2、ComMonitor串口调试软件,简单收发测试我觉得还是这个用着顺手,不过这个的校验计算好像存在问题
3、UartAssist串口调试助手,我愿称之为最强,至少在计算附加校验位方面算法支持很全面
4、开源跨平台的串口调试工具SerialTest,更支持网络串口、蓝牙串口通信
仓库下载地址(各端已打包好,支持安卓、mac、windows):https://github.com/wh201906/SerialTest/releases
三、PC上的虚拟串口软件Virtual Serial Port Driver(收发测试)
这个是付费软件,网上也有”免费体验版“我下的是6.9的版本,现在应该算是比较老的版本了。他可以虚拟出串口,比如我虚拟了com2、com3,然后打开2个串口调试软件分别打开对应的com口,就可以实现串口发送接收的测试了,当然你也可以自己编写程序操作对应的com口。需要注意的是要记得进行com口的关联,不然com2与com3之间的不能互相通信。
四、串口通信监听/抓包-软件
正常情况下一个程序只能打开一个com口,那么如果我们想要知道PC上的某个应用程序与外部串口设备之前的通信是什么样子的,程序上的功能按钮点击后会发送什么样的指令数据给外部串口设备,该怎么办呢?
没错,还真有这种软件,比如ComSpy串口监视精灵这个软件,你只需要先打开该软件并设置需要监听的串口号,然后再打开目标应用程序即可。程序可能比较老了有些bug,我用”UartAssist串口调试助手“连接该软件监听的com口发送数据后会出现无限错误提示框。
五、串口通信监听-硬件
网上有不少串口监听硬件,这种一版厂家售后维护人员用的比较多用来定位问题,但是我没买过,正常来讲原理应该也不算难。使用得当的情况下,这种应该是捕获串口通信最稳定的,当然有些特殊的串口交互可能没办法搞定(比如通信过程中串口应用程序协商后变动通信的波特率、校验位等)
六、python实现串口通信
网上例子很多,就简单贴一个了
import serial import threading import queue import time import binascii # 打开串口 ser = serial.Serial('COM3', 115200, timeout=0.05) # 创建队列 data_queue = queue.Queue() # 异步读取数据的线程函数 def read_serial(): while True: if ser.in_waiting > 0: data = ser.readline() # data=binascii.hexlify(data) hex_data = binascii.hexlify(data).decode('utf-8').strip() # 将十六进制数据每两个字符用空格分隔 hex_data = ' '.join(hex_data[i:i + 2] for i in range(0, len(hex_data), 2)).upper() # print(hex_data) data_queue.put(hex_data) time.sleep(0.01) # 休眠一段时间,减少轮询频率 # 创建并运行线程 thread = threading.Thread(target=read_serial, daemon=True) thread.start() try: # 主线程中异步写入数据 while True: ser.write(b'ranjuan.cn') time.sleep(2) # 从队列中获取读取线程的数据 while not data_queue.empty(): received_data = data_queue.get() if received_data != b'': print('received_data',received_data) #except KeyboardInterrupt: except Exception as e: print(e) print("Serial Communication Stopped.") finally: # 等待读取线程结束后再关闭串口 thread.join() if ser.is_open: ser.close()
基于互联网精神,在注明出处的前提下本站文章可自由转载!
本文链接:https://ranjuan.cn/serial-tools-python/
微信赞赏支付宝赞赏
发表评论