嵌入式单片机开源的串口示波器实现方法

news/2024/11/28 13:55:20/

分享一款开源的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、串口通信协议

int parse_protocol(protocol_struct* pProtocol,uint16_t parseDataLen)
{//解析数据,使用前需提前缓冲 pProtocol->message_st.pDataint 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

http://www.ppmy.cn/news/1121397.html

相关文章

大模型从入门到应用——LangChain:代理(Agents)-[代理执行器(Agent Executor):处理解析错误、访问中间步骤和限制最大迭代次数]

分类目录&#xff1a;《大模型从入门到应用》总目录 LangChain系列文章&#xff1a; 基础知识快速入门 安装与环境配置链&#xff08;Chains&#xff09;、代理&#xff08;Agent:&#xff09;和记忆&#xff08;Memory&#xff09;快速开发聊天模型 模型&#xff08;Models&…

Linux启动过程详解 Xmind导图笔记

参考大佬博客&#xff1a; 简要描述linux系统从开机到登陆界面的启动过程 Linux启动过程详解 Bootloader详解 来源&#xff1a;从BIOS开始画图了解Linux启动过程——老杨Linux

java框架-Springboot3-数据访问

整合SSM SpringSpringMVCMybatis 整合步骤 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"…

【若依框架2】前后端分离版本添加功能页

在VSCode的src/views下新建个文件平example,在example下创建test文件夹&#xff0c;在test里创建index.vue文件 <template> <h1>Hello world</h1> </template><script> export default {name: "index" } </script><style s…

《Kubernetes部署篇:Ubuntu20.04基于外部etcd+部署kubernetes1.25.14集群(多主多从)》

一、部署架构图 1、架构图如下所示: 2、部署流程图如下所示: 二、环境信息 1、资源下载基于外部etcd+部署容器版kubernetes1.25.14集群资源合集 2、部署规划主机名K8S版本系统版本内核版本IP地址备注k8s-master-121.25.14Ubuntu 20.04.5 LTS5.15.0-69-generic192.168.1.12ma…

eCognition易康操作教程(一):如何利用eCognition易康软件进行影像分割之棋盘分割、四叉树分割、光谱差异分割

一、新建工程 使用eCognition新建工程ImageSegmentation&#xff0c;加载影像数据&#xff0c;并编辑图层名称&#xff0c;将Layer 1、Layer 2、Layer 3、Layer 4的 Layer Alias 分别改为 Blue、Green、Red、如图1-1&#xff0c;图1-2所示&#xff1a; 图 1-1 图 1-2 设置加载…

分布式文件存储系统minio、大文件分片传输

上传大文件 1、Promise对象 Promise 对象代表一个异步操作&#xff0c;有三种状态&#xff1a; pending: 初始状态&#xff0c;不是成功或失败状态。fulfilled: 意味着操作成功完成。rejected: 意味着操作失败。 只有异步操作的结果&#xff0c;可以决定当前是哪一种状态&a…

【kafka】可视化工具KAFKA EAGLE安装分享

目录 准备&#xff1a; 开始&#xff1a; 1.解压 2.环境变量配置 3.生效环境变量配置文件 3.修改配置文件 1.修改zookeeper集群信息 2.修改mysql配置信息 4.启动 5.异常排查 6.页面 创作不易&#xff0c;你的动力是我创作的动力&#xff0c;如果有帮助请关注我&…