一個開源的QT的串口示波器,很nice
摘要:逛github時看到這個QT的串口示波器,完全開源,支持串口、TCP、波形顯示、通信協議。感覺很不錯,跟以前分享的那個vofa 有點像。感興趣的可以下載下來學習學習。
相關文章:QT上位機合集
Sailor Project功能說明
串口調試助手功能
- 支持傳統的串口調試助手的基本收發功能,同時可以刷新大量的數據而不卡頓
- 支持保存接收的數據
- 支持最大200條可編輯指令的設置,并用于多條發送
- 支持定時器發送
- 支持換行符替換時間戳功能
- 支持較多的中文編碼格式
- 值得注意的是支持Linux簡單的串口調試
- 支持加載csv表格數據到200條可編輯指令
- 支持部分窗口配置的保存和重啟恢復(前提是你不會刪除配置文件)
操作說明
注意由于QT自帶文本顯示窗口加載大量數據后會造成軟件卡頓,現解決方案為設定一個顯示緩沖區,在有刷新數據階段(即串口接收數據階段),如果需要保持刷新狀態(即實時顯示接收得數據),則僅顯示顯示緩沖區的內容,你可以使用鼠標移動向上滾動條,停止數據刷新,同時當你向上移動滾動條到一定程度,便會開始加載所有數據,如果你想再次觸發實時刷新數據狀態,只需要將滾動條移動到最低端,并確保有數據接收。
由于保存數據為顯示界面的數據,如果出于刷新狀態,則無法保存所有數據,正確的做法是關閉串口后,將滾動條移動到最頂端,加載全部數據,然后保存窗口數據。
【嵌入式物聯網單片機學習資料】整理了全套精華學習資料,除了教程外,還有一些大廠面經 筆試面試題,開源共享給大家。
點擊加V自取:領取資料私信我 或者點擊鏈接 http://s.pdb2.com/l/CMIsoKcnATFIF4M
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.pData int 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
原文鏈接:https://mp.weixin.qq.com/s/Bf619Q3bQuon5d4CNxrt-Q
文章轉載自:果果小師弟
文章來源于:一個開源的QT的串口示波器,很nice!
版權聲明:本文來源于網絡,免費傳達知識,版權歸原作者所有,如涉及作品版權問題,請聯系我進行刪除