串口调试工具,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/

赞赏

微信赞赏支付宝赞赏

发表评论