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


    分享一款开源的QT的串口示波器,完全开源,支持串口、TCP、波形显示、通信协议。

    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、串口通信协议

    1. int parse_protocol(protocol_struct* pProtocol,uint16_t parseDataLen)
    2. {
    3.     //解析数据,使用前需提前缓冲 pProtocol->message_st.pData
    4.     int ret = -1;
    5.     uint16_t pos_offset;
    6.     frame_struct* pFrameStruct = &pProtocol->frame_st;
    7.     message_struct* pMessageStruct = &pProtocol->message_st;
    8.     if (check_protocol_heade(pMessageStruct->pData) == PROTOCOL_RESULT_OK)
    9.     {
    10.         //更新帧头数据
    11.         pFrameStruct->header.sof            = pMessageStruct->pData[0];
    12.         //获取data段的数据长度
    13.         pFrameStruct->header.data_length    = (pMessageStruct->pData[2<< 8) | (pMessageStruct->pData[1]);
    14.         pFrameStruct->header.crc_check      = pMessageStruct->pData[3];
    15.         //获取此次数据包长度
    16.         pMessageStruct->data_len = pFrameStruct->header.data_length + PROTOCOL_DATA_OFFSET + 2;
    17.         //计算解析后得到的 data_union 数据长度
    18.         pFrameStruct->frame_user.cmd_data.data_len = (pFrameStruct->header.data_length/ sizeof(data_union);
    19.         if(pMessageStruct->data_len<=parseDataLen)
    20.         {
    21.             if (pMessageStruct->data_len <= pMessageStruct->max_data_len)
    22.             {
    23.                 if(CRC16_Check_Sum(&pMessageStruct->pData[0], pMessageStruct->data_len) != 0)
    24.                 {
    25.                     pFrameStruct->frame_user.equipment_type = (pMessageStruct->pData[5]<<8) | (pMessageStruct->pData[4]);
    26.                     pFrameStruct->frame_user.equipment_id   = (pMessageStruct->pData[7<< 8) | (pMessageStruct->pData[6]);
    27.                     pFrameStruct->frame_user.data_id        = (pMessageStruct->pData[9<< 8) | (pMessageStruct->pData[8]);
    28.                     //拷贝 data段 指定长度数据
    29.                     ret = (int)memcpy(&pFrameStruct->frame_user.cmd_data.pData[0], &pMessageStruct->pData[PROTOCOL_DATA_OFFSET], pFrameStruct->header.data_length);
    30.                     pos_offset = pFrameStruct->header.data_length + PROTOCOL_DATA_OFFSET;
    31.                     pFrameStruct->frame_tail = (pMessageStruct->pData[pos_offset+1<< 8) | (pMessageStruct->pData[pos_offset]);
    32.                     return PROTOCOL_RESULT_OK;
    33.                 }
    34.                 else
    35.                 {
    36.                     //待解析BUFF超过预定解析数据容量,避免内存越界
    37.                     PROTOCOL_ERROR_PRINTF("parse_protocol->>CRC16_Check_Sum err!\n");
    38.                     return PROTOCOL_RESULT_CHECK_FRAME_ERR;
    39.                 }
    40.             }
    41.             else
    42.             {
    43.                 //待解析BUFF超过预定解析数据容量,避免内存越界
    44.                 PROTOCOL_ERROR_PRINTF("parse_protocol->>data_len[%d] > max_data_len[%d]!\n",
    45.                     pMessageStruct->data_len,
    46.                     pMessageStruct->max_data_len);
    47.                 return PROTOCOL_RESULT_OUT_OF_LEN;
    48.             }
    49.         }
    50.         else
    51.         {
    52.             //通过包头计算,还未收到完整的数据包
    53. //            PROTOCOL_ERROR_PRINTF("parse_protocol->>data_len[%d] > max_data_len[%d]!\n",
    54. //                pMessageStruct->data_len,
    55. //                pMessageStruct->max_data_len);
    56.             return PROTOCOL_RESULT_OUT_OF_LEN;
    57.         }
    58.     }
    59.     else
    60.     {
    61.         //待解析BUFF超过预定解析数据容量,避免内存越界
    62.         PROTOCOL_ERROR_PRINTF("parse_protocol->>check_protocol_heade err!\n");
    63.         return PROTOCOL_RESULT_CHECK_HEAD_ERR;
    64.     }
    65.     PROTOCOL_DEBUG_PRINTF("parse_protocol->>check_protocol_heade ok!\n");
    66.     return PROTOCOL_RESULT_ERR;
    67. }

    软件截图

    图片

    图片

    图片

    图片

    项目开源地址:

    https://github.com/SEASKY-Master/vSailorProject
  • 相关阅读:
    如何全面提升架构设计的质量
    国产化服务器内网安装onlyoffice
    基于Keilv5新建STM32F030工程
    MOOC 大数据Note
    V-Control Pro 3.0发布,为Presonus控制器增加Pro Tools高级控制
    idea整合Tomcat进行Javaweb工程
    nginx502常见502错误问题解决办法
    如何使用轻量应用服务器搭建NextCloud私有云网盘?
    目录启示:使用 use 关键字为命名空间内的元素建立非限定名称
    【MindSpore】【图片加载】加载RGB-D图片失败
  • 原文地址:https://blog.csdn.net/m0_61687959/article/details/133355267