逛github時看到這個QT的串口示波器,完全開源,支持串口、TCP、波形顯示、通信協議。感覺很不錯,跟以前分享的那個vofa+有點像。
Sailor Project功能說明
![8a09edd0-6c57-11ed-8abf-dac502259ad0.png](https://file1.elecfans.com//web2/M00/98/0A/wKgZomTnSYWAe2YpAAR_mm2A-20545.png)
串口調試助手功能
- 支持傳統的串口調試助手的基本收發功能,同時可以刷新大量的數據而不卡頓
- 支持保存接收的數據
- 支持最大200條可編輯指令的設置,并用于多條發送
- 支持定時器發送
- 支持換行符替換時間戳功能
- 支持較多的中文編碼格式
- 值得注意的是支持Linux簡單的串口調試
- 支持加載csv表格數據到200條可編輯指令
- 支持部分窗口配置的保存和重啟恢復(前提是你不會刪除配置文件)
操作說明
注意由于QT自帶文本顯示窗口加載大量數據后會造成軟件卡頓,現解決方案為設定一個顯示緩沖區,在有刷新數據階段(即串口接收數據階段),如果需要保持刷新狀態(即實時顯示接收得數據),則僅顯示顯示緩沖區的內容,你可以使用鼠標移動向上滾動條,停止數據刷新,同時當你向上移動滾動條到一定程度,便會開始加載所有數據,如果你想再次觸發實時刷新數據狀態,只需要將滾動條移動到最低端,并確保有數據接收。
由于保存數據為顯示界面的數據,如果出于刷新狀態,則無法保存所有數據,正確的做法是關閉串口后,將滾動條移動到最頂端,加載全部數據,然后保存窗口數據。
TCPServer界面
![8a14e078-6c57-11ed-8abf-dac502259ad0.png](https://file1.elecfans.com//web2/M00/98/0A/wKgZomTnSYWAOvIHAATI12QFsQM229.png)
![8a1f5558-6c57-11ed-8abf-dac502259ad0.png](https://file1.elecfans.com//web2/M00/98/0A/wKgZomTnSYWAMBoIAAUNwZoBGfo573.png)
![8a2a8ad6-6c57-11ed-8abf-dac502259ad0.png](https://file1.elecfans.com//web2/M00/98/0A/wKgZomTnSYWAKj8CAAVEbq2PX58199.png)
![8a3909b2-6c57-11ed-8abf-dac502259ad0.png](https://file1.elecfans.com//web2/M00/98/0A/wKgZomTnSYaALfIVAAU3ZAk2Yb4880.png)
![8a5d4d04-6c57-11ed-8abf-dac502259ad0.png](https://file1.elecfans.com//web2/M00/98/0A/wKgZomTnSYaADzJaAAm8Edx47AY752.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、幀頭詳細定義
![8a6b92a6-6c57-11ed-8abf-dac502259ad0.png](https://file1.elecfans.com//web2/M00/98/0A/wKgZomTnSYaAQ6rnAABYCdtm5bw255.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;
}
軟件截圖
![8a7296c8-6c57-11ed-8abf-dac502259ad0.png](https://file1.elecfans.com//web2/M00/98/0A/wKgZomTnSYaAZrnpAAsBf_s6YfI465.png)
![8a8152ee-6c57-11ed-8abf-dac502259ad0.png](https://file1.elecfans.com//web2/M00/98/0A/wKgZomTnSYeAMaO6AAi7HTnZvYM383.png)
![8a905078-6c57-11ed-8abf-dac502259ad0.png](https://file1.elecfans.com//web2/M00/98/0A/wKgZomTnSYeAbLzfAAc5CbHTbB4970.png)
![8aa36d02-6c57-11ed-8abf-dac502259ad0.png](https://file1.elecfans.com//web2/M00/98/0A/wKgZomTnSYeAb5htAAK-dZjDau4945.png)
項目開源地址:
https://github.com/SEASKY-Master/vSailorProject
審核編輯 :李倩
-
示波器
+關注
關注
113文章
6283瀏覽量
185886 -
定時器
+關注
關注
23文章
3256瀏覽量
115407
原文標題:分享一個開源的QT的串口示波器
文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
Qt Group發布Qt Accelerate,加速數字產品開發進程
在QT環境下使用CH348芯片進行設備識別與管理
![在<b class='flag-5'>QT</b>環境下使用CH348芯片進行設備識別與管理](https://file.elecfans.com/web2/M00/3E/6A/pYYBAGJhBGGAGyDYAACBPQuBZQI711.png)
示波器探頭和示波器需要匹配嗎
示波器電流探頭最簡單三個步驟是什么
QT5+OpenCV4搭建應用開發環境
![<b class='flag-5'>QT</b>5+OpenCV4搭建應用開發環境](https://file1.elecfans.com/web2/M00/FD/D6/wKgZomafIsaAI1-HAAAPdI9NvlA380.jpg)
米爾NXP i.MX 93開發板的Qt開發指南
![米爾NXP i.MX 93開發板的<b class='flag-5'>Qt</b>開發指南](https://file.elecfans.com/web2/M00/08/64/pYYBAGDwFEGADIPWAAFlJOlmLxg664.jpg)
如何使用示波器測量串口波特率
做了一個 log 日志觸發器控制示波器
如何用示波器測量串口波特率
![如何用<b class='flag-5'>示波器</b>測量<b class='flag-5'>串口</b>波特率](https://file1.elecfans.com/web2/M00/C5/A7/wKgaomX3wmWAdca-AABTaJiene8107.png)
評論