分享一个开源的QT的串口示波器

直接来源 | 果果小师弟

逛github时看到这个QT的串口示波器,完全开源,支持串口、TCP、波形显示、通信协议。感觉很不错,跟以前分享的那个vofa+有点像。感兴趣的可以下载下来学习学习(文末附链接)。

Sailor Project功能说明

0bd1a56965100e16d93fd205f2bfc71b.png

串口调试助手功能

  • 支持传统的串口调试助手的基本收发功能,同时可以刷新大量的数据而不卡顿

  • 支持保存接收的数据

  • 支持最大200条可编辑指令的设置,并用于多条发送

  • 支持定时器发送

  • 支持换行符替换时间戳功能

  • 支持较多的中文编码格式

  • 值得注意的是支持Linux简单的串口调试

  • 支持加载csv表格数据到200条可编辑指令

  • 支持部分窗口配置的保存和重启恢复(前提是你不会删除配置文件)

操作说明

注意由于QT自带文本显示窗口加载大量数据后会造成软件卡顿,现解决方案为设定一个显示缓冲区,在有刷新数据阶段(即串口接收数据阶段),如果需要保持刷新状态(即实时显示接收得数据),则仅显示显示缓冲区的内容,你可以使用鼠标移动向上滚动条,停止数据刷新,同时当你向上移动滚动条到一定程度,便会开始加载所有数据,如果你想再次触发实时刷新数据状态,只需要将滚动条移动到最低端,并确保有数据接收。

由于保存数据为显示界面的数据,如果出于刷新状态,则无法保存所有数据,正确的做法是关闭串口后,将滚动条移动到最顶端,加载全部数据,然后保存窗口数据。

TCPServer界面

fb1aa71a299d609b0bd66a4ecce65206.png 49cc1fbf0efb18c015fdd41e639636cb.png 6c9a836e870744bea6a1bcdaf70dc4c1.png 04aa3f2e658bdf242b591f17ca2b4b34.png 4e59d7a902f5ae263884af04dc4c4b78.png

SEASKY串口通信协议

通信方式是串口,配置为波特率115200, 8位数据位, 1位停止位, 无硬件流控, 无校验位。

1、通信协议格式

帧头设备类型设备ID数据ID帧尾
protocol_header(4-byte)equipment_type(2-byte)equipment_id (2-byte)data_id(2-byte)frame_tail(2-byte,CRC16,整包校验)

2、帧头详细定义

a132db5b3f01ed4c544422477553fc06.png

3、串口通信协议

int parse_protocol(protocol_struct* pProtocol,uint16_t parseDataLen)
{
    //解析数据,使用前需提前缓冲 pProtocol->message_st.pData
    int ret = -1;
    uint16_t pos_offset;
    frame_struct* pFrameStruct = &pProtocol->frame_st;
    message_struct* pMessageStruct = &pProtocol->message_st;
    if (check_protocol_heade(pMessageStruct->pData) == PROTOCOL_RESULT_OK)
    {
        //更新帧头数据
        pFrameStruct->header.sof            = pMessageStruct->pData[0];
        //获取data段的数据长度
        pFrameStruct->header.data_length    = (pMessageStruct->pData[2] << 8) | (pMessageStruct->pData[1]);
        pFrameStruct->header.crc_check      = pMessageStruct->pData[3];
        //获取此次数据包长度
        pMessageStruct->data_len = pFrameStruct->header.data_length + PROTOCOL_DATA_OFFSET + 2;
        //计算解析后得到的 data_union 数据长度
        pFrameStruct->frame_user.cmd_data.data_len = (pFrameStruct->header.data_length) / sizeof(data_union);
        if(pMessageStruct->data_len<=parseDataLen)
        {
            if (pMessageStruct->data_len <= pMessageStruct->max_data_len)
            {
                if(CRC16_Check_Sum(&pMessageStruct->pData[0], pMessageStruct->data_len) != 0)
                {
                    pFrameStruct->frame_user.equipment_type = (pMessageStruct->pData[5]<<8) | (pMessageStruct->pData[4]);
                    pFrameStruct->frame_user.equipment_id   = (pMessageStruct->pData[7] << 8) | (pMessageStruct->pData[6]);
                    pFrameStruct->frame_user.data_id        = (pMessageStruct->pData[9] << 8) | (pMessageStruct->pData[8]);
                    //拷贝 data段 指定长度数据
                    ret = (int)memcpy(&pFrameStruct->frame_user.cmd_data.pData[0], &pMessageStruct->pData[PROTOCOL_DATA_OFFSET], pFrameStruct->header.data_length);
                    pos_offset = pFrameStruct->header.data_length + PROTOCOL_DATA_OFFSET;
                    pFrameStruct->frame_tail = (pMessageStruct->pData[pos_offset+1] << 8) | (pMessageStruct->pData[pos_offset]);
                    return PROTOCOL_RESULT_OK;
                }
                else
                {
                    //待解析BUFF超过预定解析数据容量,避免内存越界
                    PROTOCOL_ERROR_PRINTF("parse_protocol->>CRC16_Check_Sum err!\n");
                    return PROTOCOL_RESULT_CHECK_FRAME_ERR;
                }
            }
            else
            {
                //待解析BUFF超过预定解析数据容量,避免内存越界
                PROTOCOL_ERROR_PRINTF("parse_protocol->>data_len[%d] > max_data_len[%d]!\n",
                    pMessageStruct->data_len,
                    pMessageStruct->max_data_len);
                return PROTOCOL_RESULT_OUT_OF_LEN;
            }
        }
        else
        {
            //通过包头计算,还未收到完整的数据包
//            PROTOCOL_ERROR_PRINTF("parse_protocol->>data_len[%d] > max_data_len[%d]!\n",
//                pMessageStruct->data_len,
//                pMessageStruct->max_data_len);
            return PROTOCOL_RESULT_OUT_OF_LEN;
        }
    }
    else
    {
        //待解析BUFF超过预定解析数据容量,避免内存越界
        PROTOCOL_ERROR_PRINTF("parse_protocol->>check_protocol_heade err!\n");
        return PROTOCOL_RESULT_CHECK_HEAD_ERR;
    }
    PROTOCOL_DEBUG_PRINTF("parse_protocol->>check_protocol_heade ok!\n");
    return PROTOCOL_RESULT_ERR;
}

软件截图

00d1e0dddf08bb29ba42a1bc1374193e.png 6b070d2dd3d85f2b6f001d39f29870a0.png 3f138dcbf23375baece26aadc6c16ded.png 058a10755efe1eac25ae320d6ae03771.png

项目开源地址:

https://github.com/SEASKY-Master/vSailorProject

声明:本文素材来源网络,版权归原作者所有。如涉及作品版权问题,请与我联系删除。

-END-


往期推荐:点击图片即可跳转阅读

1f2e727e112b7d840672d123accc9073.jpeg

欧姆定理是如何被提出的?

39d0600f9967d0e3376b0f94cd50affd.jpeg

为什么电路里要摆这两个电容?

0c47df788f93c16458fe327540ef7648.jpeg

画好一张规范的原理图,这些点你可要注意了!

前言: EMI预一致性测试和调试成为工程师在电子产品设计中不可回避的问题 一次性很难通过昂贵的EMI一致性测试 难以捕获偶发的EMI突发信号 EMI调试中很难找到噪声来源 针对EMI预一致性测试与调试问题,泰克提出了解决方案 利用RSA306B、RSA50XA和RSA60XA进行EMI预一致性测试 RSA306B、RSA500和RSA600: DPX和三维频谱图可以查看持续时间短的EMI突发 预先定义的一致性测试模板 使用SignalVu-PC记长时间的EMI信号 DPX使用频谱辐射模板(SEM)把EMI事件与RF功率事件关联起来 基于PC的经济型实时频谱分析仪 可以在PC上完成预一致性测试,无需等待 提供预一致性测试预置,简便易用 使用泰克MDO示波器调试EMI问题 MDO4000C: MDO4000C的频域和时域相关功能可以迅速识别EMI来源 MDO4000C频谱时间与模拟信号和/或数字信号相关,以独特的方式查看频域和时域特点 了解和修复导致EMI噪声的模拟信号和/或数字信号 所有通道采用公共触发同时捕获所有输入信号 泰克提出的解决方案可以解决以下内容:EMI测试中的常见问题,预一致性测试的方法,如何查找干扰与进行调试等! 本文重点介绍了大赛作品:单片机制作的简易示波器 介绍: 一、系统构成 STC12C5A60S2单片机内部AD采样;LCD12864显示波形;LM393组成迟滞比较器测量小信号频率,不需要频率显示时该部分可以省略。 为最大程度简化设计,信号通过电容直接进入单片机AD输入端,无输入时,通过调整R10使波形处于中心线位置即可。 二、基本功能 1、时间每格:10ms/5ms/2ma/1ms/500us/200us/100us/50us/20us。基本能显示20~20Kh信号。 2、电压每格:1V/0.5V/0.2V。 3、HOLD功能:冻结波形后,左右平移能显示共4屏(含当前屏)波形。 4、自带一路5Khz方波输出。 5、用户设置参数断电保持。该功能对电源电压稳定性要求较高,欠压或过压参数会被冲掉或不能正常开机。 三、使用说明 1、K6按键,坐标线样式转换:(1)散点加坐标线,该样式参考了上一届DIY大赛吴老师的示波器显示样式;(2)仅有坐标线;(3)空白。三种样式轮流切换。 2、K1按键,波形冻结与正常显示切换。波形冻结状态下,左下角显示频率的地方会显示HOLD MODE。 3、K2/K3,每格电压值调整,1V/0.5V/0.2V轮流切换。 4、K4/K5,正常显示时,调整每格时间;波形冻结后,实现波形平移。所以在波形冻结状态下是不能调节时间的! 原理图、PCB原文件和源代码至附件下载
关于是德科技 是德科技(NYSE:KEYS)-原安捷伦电子测量事业部,是全球电子测量技术和市场的领导者,致力于推动无线通信、模块化和软件解决方案的持续创新,专注于为客户提供卓越的测量体验。是德科技提供的电子测量仪器、系统、软件及服务广泛应用于电子设备的设计、研发、制造、安装、部署和运营。 本文来自于国外网站的最新设计,结构简单,有单片机基础的非常容易制作成功,老鸟不在话下,甚至于有点基础的初学者也可作为一次提高的挑战,所有元器件国内都有,给制作带来了方便。 附件内容含有制作必须的所有的电路图,pcb文件,原理简介,基础软件,作者基于此构架的开发程序等。(当你的所选器件不同时,软件部分要自己修 本电路基于Atmel的ATmega162单片机,其他器件还包含ADS830,XC9572,IDT7201,LMG6402PFLR,ICL7660A,7805,OPA2652等。 便携示波器波形显示: 便携手持示波器参数: 最大采样频率:40MSPS 最大输入频率:5MHz 不失真不失真最大不失真显示频率:10MHz的 输入电路带宽:20MHz 显示分辨率:240X128(总),跟踪分辨率200x125 灵敏度:40mV/div DC耦合:DC 输入阻抗:10K 供电电源:单直流电源8V .. 10V,1A 增量模式 :无 时间基数:1s/div,500ms/div,200ms/div 100ms/div,50ms/div / 20ms/div,10ms/div,5ms/div,2ms/div,1ms/div,500us/div,200us / DIV,100us/div,50us/div,20us/div,10us/div,5us/div,2us/div,1us/div,500ns/div 触发:数字可调 跟踪偏移:数字可调 说明: 1,附件内容包括制作说明文档(WORD格式); 2,压缩文件里含有原理图和PCB图用eagle软件打开; 3,其他的压缩文件都是软件; 4,这个是开源的,有经验者是可以以此为基础进行再开发; 5,如果能在一个卖家配齐所有零部件,成本不会超过200元。(不含烧写设备); 6,对于菜鸟不适合,但可以作为参考。 附件内容截图:
SerialPortPlotter是一款开源基于Qt实现的多通道串口示波器。该软件使用简单,可以通过串口接收来自硬件设备的波形数据,并将其实时显示在界面上。同时,该示波器还提供了丰富的功能,例如波形捕获、数据保存等。你可以通过该软件对串口通信进行实时监测和分析。 你可以在原作者的GitHub链接上找到该软件的详细信息和源代码,链接为:https://github.com/CieNTi/serial_port_plotter。 该示波器是基于VS2010平台,使用C#开发的,主要利用了serialport控件和chart控件来实现。你可以根据需要对该程序进行修改,以实现自定义的波形数据输入和显示,对数据采样进行直观分析,有助于进行算法研究。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [SerialPortPlotter:一款开源基于Qt实现的多通道串口示波器](https://blog.csdn.net/qq153471503/article/details/122452538)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [基于VS2010的C#简易串口示波器](https://download.csdn.net/download/wabbow/5343281)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值