摘要:逛github时看到这个QT的串口示波器,完全开源,支持串口、TCP、波形显示、通信协议。感觉很不错,跟以前分享的那个vofa+有点像。感兴趣的可以下载下来学习学习。
Sailor Project功能说明
![48698448-e9e0-11ec-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/78/wKgaomTnAimABqBnAAR_mm2A-20763.png)
串口调试助手功能
- 支持传统的串口调试助手的基本收发功能,同时可以刷新大量的数据而不卡顿
- 支持保存接收的数据
- 支持最大200条可编辑指令的设置,并用于多条发送
- 支持定时器发送
- 支持换行符替换时间戳功能
- 支持较多的中文编码格式
- 值得注意的是支持Linux简单的串口调试
- 支持加载csv表格数据到200条可编辑指令
- 支持部分窗口配置的保存和重启恢复(前提是你不会删除配置文件)
操作说明
注意由于QT自带文本显示窗口加载大量数据后会造成软件卡顿,现解决方案为设定一个显示缓冲区,在有刷新数据阶段(即串口接收数据阶段),如果需要保持刷新状态(即实时显示接收得数据),则仅显示显示缓冲区的内容,你可以使用鼠标移动向上滚动条,停止数据刷新,同时当你向上移动滚动条到一定程度,便会开始加载所有数据,如果你想再次触发实时刷新数据状态,只需要将滚动条移动到最低端,并确保有数据接收。
由于保存数据为显示界面的数据,如果出于刷新状态,则无法保存所有数据,正确的做法是关闭串口后,将滚动条移动到最顶端,加载全部数据,然后保存窗口数据。
TCPServer界面
![488946fc-e9e0-11ec-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/78/wKgaomTnAimAB6J8AATI12QFsQM781.png)
![48985ee4-e9e0-11ec-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/78/wKgaomTnAimAcjqKAAUNwZoBGfo829.png)
![48acebca-e9e0-11ec-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/78/wKgaomTnAimAO5-iAAVEbq2PX58554.png)
![48ba99be-e9e0-11ec-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/78/wKgaomTnAiqAfrvxAAU3ZAk2Yb4070.png)
![48cc7134-e9e0-11ec-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/78/wKgaomTnAiqAV-caAAm8Edx47AY935.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、帧头详细定义
![48e29c52-e9e0-11ec-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/78/wKgaomTnAiqAfB_kAABYCdtm5bw918.png)
3、串口通信协议
intparse_protocol(protocol_struct*pProtocol,uint16_tparseDataLen)
{
//解析数据,使用前需提前缓冲pProtocol->message_st.pData
intret=-1;
uint16_tpos_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]);
returnPROTOCOL_RESULT_OK;
}
else
{
//待解析BUFF超过预定解析数据容量,避免内存越界
PROTOCOL_ERROR_PRINTF("parse_protocol->>CRC16_Check_Sumerr!
");
returnPROTOCOL_RESULT_CHECK_FRAME_ERR;
}
}
else
{
//待解析BUFF超过预定解析数据容量,避免内存越界
PROTOCOL_ERROR_PRINTF("parse_protocol->>data_len[%d]>max_data_len[%d]!
",
pMessageStruct->data_len,
pMessageStruct->max_data_len);
returnPROTOCOL_RESULT_OUT_OF_LEN;
}
}
else
{
//通过包头计算,还未收到完整的数据包
//PROTOCOL_ERROR_PRINTF("parse_protocol->>data_len[%d]>max_data_len[%d]!
",
//pMessageStruct->data_len,
//pMessageStruct->max_data_len);
returnPROTOCOL_RESULT_OUT_OF_LEN;
}
}
else
{
//待解析BUFF超过预定解析数据容量,避免内存越界
PROTOCOL_ERROR_PRINTF("parse_protocol->>check_protocol_headeerr!
");
returnPROTOCOL_RESULT_CHECK_HEAD_ERR;
}
PROTOCOL_DEBUG_PRINTF("parse_protocol->>check_protocol_headeok!
");
returnPROTOCOL_RESULT_ERR;
}
软件截图
![48f219fc-e9e0-11ec-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/78/wKgaomTnAiqAUae4AAsBf_s6YfI994.png)
![49092566-e9e0-11ec-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/78/wKgaomTnAiuAUzICAAi7HTnZvYM368.png)
![491dee6a-e9e0-11ec-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/78/wKgaomTnAiuAXzfBAAc5CbHTbB4048.png)
![49342216-e9e0-11ec-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/78/wKgaomTnAiuAIJRgAAK-dZjDau4757.png)
项目开源地址:
https://github.com/SEASKY-Master/vSailorProject
-
示波器
+关注
关注
113文章
6311浏览量
186087 -
串口
+关注
关注
14文章
1563浏览量
77272 -
Qt
+关注
关注
1文章
309浏览量
38137
原文标题:一个开源的QT的串口示波器,很nice!
文章出处:【微信号:FANYPCB,微信公众号:凡亿PCB】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
开源的Qt串口助手的使用方法
![开源的<b class='flag-5'>Qt</b><b class='flag-5'>串口</b>助手的使用方法](https://file.elecfans.com/web1/M00/DD/E4/o4YBAGAYu7uAE-W6AAA7zGrPYSc006.png)
Qt小项目之串口助手控制LED
![<b class='flag-5'>Qt</b>小项目之<b class='flag-5'>串口</b>助手控制LED](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
QT 串口示波器的串口调试助手功能
【飞凌OKA40i-C开发板试用体验】QT实现串口助手
![【飞凌OKA40i-C开发板试用体验】<b class='flag-5'>QT</b><b class='flag-5'>实现</b><b class='flag-5'>串口</b>助手](https://file.elecfans.com/web2/M00/6D/FE/poYBAGM83waAdYubAAIZvRd3P5U587.png)
分享一个开源的QT的串口示波器
QT篇QT上位机串口编程
![<b class='flag-5'>QT</b>篇<b class='flag-5'>QT</b>上位机<b class='flag-5'>串口</b>编程](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
QT实现简单的上位机软件
![<b class='flag-5'>QT</b><b class='flag-5'>实现</b>简单的上位机软件](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
Qt5实现上位机与串口通信
![<b class='flag-5'>Qt</b>5<b class='flag-5'>实现</b>上位机与<b class='flag-5'>串口</b>通信](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
评论