当前位置:   article > 正文

这个开源的QT调试工具小巧且强劲~

这个开源的QT调试工具小巧且强劲~
关注、星标公众号,直达精彩内容

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

Sailor Project功能说明

6aab100fb4646825d450b63f116edc48.png

串口调试助手功能

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

  • 支持保存接收的数据

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

  • 支持定时器发送

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

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

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

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

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

操作说明

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

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

TCPServer界面

0366ddfea541aeb9be165ff9d092dfa7.png c2febd7e39074b6ce17b03a1242a9fc2.png adb95f10a78ebe9378d5c192e9a61b95.png 17771dc5e91427f77a555a275913857b.png 3f357d99915ff2dd7410b96d501228e3.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、帧头详细定义

8d22449283c8f89af6c35c2bb8ff0e8d.png

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

软件截图

a59e2b4bece35fa592138c5141f483f3.png 999abfbf6906e29da809f88b71d016a5.png 7153b357e3aac3abe957af54bf6ce804.png 0ca3f2ad3da4f160cf92d7d52882cfbe.png

项目开源地址:

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

版权声明:本文来源网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。

‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧  END  ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧

关注我的微信公众号,回复“加群”按规则加入技术交流群。
点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/459952
推荐阅读
相关标签
  

闽ICP备14008679号