Redian新闻
>
手上没有示波器?分享一个开源的QT的串口示波器给你。

手上没有示波器?分享一个开源的QT的串口示波器给你。

公众号新闻
直接来源 | 果果小师弟

逛github时看到这个QT的串口示波器,完全开源,支持串口、TCP、波形显示、通信协议。

感觉很不错,跟以前分享的那个vofa+有点像。感兴趣的可以下载下来学习学习(文末附链接)。

Sailor Project功能说明

串口调试助手功能

  • 支持传统的串口调试助手的基本收发功能,同时可以刷新大量的数据而不卡顿
  • 支持保存接收的数据
  • 支持最大200条可编辑指令的设置,并用于多条发送
  • 支持定时器发送
  • 支持换行符替换时间戳功能
  • 支持较多的中文编码格式
  • 值得注意的是支持Linux简单的串口调试
  • 支持加载csv表格数据到200条可编辑指令
  • 支持部分窗口配置的保存和重启恢复(前提是你不会删除配置文件)

操作说明

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

同时当你向上移动滚动条到一定程度,便会开始加载所有数据,如果你想再次触发实时刷新数据状态,只需要将滚动条移动到最低端,并确保有数据接收。

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

TCPServer界面

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、帧头详细定义

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;
}

软件截图

项目开源地址:

https://github.com/SEASKY-Master/vSailorProject
声明:本文素材来源网络,版权归原作者所有。如涉及作品版权问题,请与我联系删除。

-END-


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


汇总 | 2023年嵌入式行业方向及公司


突发!美将全面禁止向华为提供任何产品!


人均月薪过万?打工人最大的错觉!


我为什么鼓励你读博士?

微信扫码关注该文公众号作者

欢迎戳这里提交新闻线索和高质量文章给我们。
相关阅读
使用 BookStack 写文档,一个开源的 Confluence 替代品谁会拒绝一个开源的3D博客呢?盘点5大技术板块、洞察56个开源项目:InfoQ研究中心带你探秘中国开源数据库Gamerzilla:一个开源游戏成就系统 | Linux 中国用这个开源工具在 React 中建立一个交互式时间轴 | Linux 中国[掌设] 也来分享一下x90pro+,没有技巧的样张有很多张。直播预告 | 总是无法完成新年计划?分享我提升行动力的秘籍【有奖征集】现在跟你爱的人在一起吗?分享赢礼品卡、现金红包…前期是老板给你发工资,中期是能力给你发工资,后期是品德给你发工资东风汽车“骨折”降价引关注,“有示范作用”因为电脑上没有“锤子大爆炸”,有人决定自己做一个。一个人身上没有这3个迹象,说明他在嫌弃你,别再来往了分享一个很实用的习惯养成模型分享一个不错的英语交流群分享一个我长期坚持的好习惯!二胎+哺乳期+焦虑+失眠,怎么办?——分享一个线上咨询案例分享一个不错的英语学习交流群200+个开发任务,100w+ 奖金的开源赛事,来了!还在为玩不了ChatGPT苦恼?这十几个开源平替也能体验智能对话太好用了!Linux 服务器上必备的 4 个开源工具还在为玩不了 ChatGPT 苦恼?这十几个开源平替也能体验智能对话11款好用又开源的视频剪辑处理工具Meta开源的ChatGPT平替到底好不好用?测试结果、加料改装方法已出炉,2天5.2k星每天使用开源的 9 种方法 | Linux 中国原来有这么多开源的Web浏览器人类“3.0”意识形态战场——ChatGPT的政治化终局ChatGPT的价值观及立场(四)如何过上没有压力的生活课本上没有的电影导演组干货知识在哪里?“世界上没有完全合适的两个人”为什么超市卖的鸡蛋上没有粑粑项飙x李一凡:流水线上没有历史,杀马特才有你的QQ号码是几位数?如果你多次感染过新冠,请分享一下自己的具体情况[照片] 分享一些最近的拍摄的照片,希望能缓解症状中的你陈傻子:“阳”后第二天,我已经退烧了,分享一下我斗“阳”的过程!高卡遍地爬,行政酒廊宛如菜市场,分享一下跨年夜经历血赚5000多,分享一下技巧开学季!孩子早餐不将就,分享一周早餐,7天不重样,简单好吃营养卫生资格冲刺!分享一位已过职考考生的真实备考经验分享一些PPT配色知识与技巧
联系我们隐私协议©2023 redian.news
Redian新闻 · 海外热点 · 尽在指尖
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。