逛github時看到這個QT的串口示波器,完全開源,支持串口、TCP、波形顯示、通信協(xié)議。感覺很不錯,跟以前分享的那個vofa+有點像。感興趣的可以下載下來學習學習。
Sailor Project功能說明
串口調試助手功能
支持傳統(tǒng)的串口調試助手的基本收發(fā)功能,同時可以刷新大量的數(shù)據(jù)而不卡頓
支持保存接收的數(shù)據(jù)
支持最大200條可編輯指令的設置,并用于多條發(fā)送
支持定時器發(fā)送
支持換行符替換時間戳功能
支持較多的中文編碼格式
值得注意的是支持Linux簡單的串口調試
支持加載csv表格數(shù)據(jù)到200條可編輯指令
支持部分窗口配置的保存和重啟恢復(前提是你不會刪除配置文件)
操作說明
注意由于QT自帶文本顯示窗口加載大量數(shù)據(jù)后會造成軟件卡頓,現(xiàn)解決方案為設定一個顯示緩沖區(qū),在有刷新數(shù)據(jù)階段(即串口接收數(shù)據(jù)階段),如果需要保持刷新狀態(tài)(即實時顯示接收得數(shù)據(jù)),則僅顯示顯示緩沖區(qū)的內容,你可以使用鼠標移動向上滾動條,停止數(shù)據(jù)刷新,同時當你向上移動滾動條到一定程度,便會開始加載所有數(shù)據(jù),如果你想再次觸發(fā)實時刷新數(shù)據(jù)狀態(tài),只需要將滾動條移動到最低端,并確保有數(shù)據(jù)接收。
由于保存數(shù)據(jù)為顯示界面的數(shù)據(jù),如果出于刷新狀態(tài),則無法保存所有數(shù)據(jù),正確的做法是關閉串口后,將滾動條移動到最頂端,加載全部數(shù)據(jù),然后保存窗口數(shù)據(jù)。
TCPServer界面
?
?
?
?
SEASKY串口通信協(xié)議
通信方式是串口,配置為波特率115200, 8位數(shù)據(jù)位, 1位停止位, 無硬件流控, 無校驗位。
1、通信協(xié)議格式
幀頭 | 設備類型 | 設備ID | 數(shù)據(jù)ID | 幀尾 |
---|---|---|---|---|
protocol_header(4-byte) | equipment_type(2-byte) | equipment_id (2-byte) | data_id(2-byte) | frame_tail(2-byte,CRC16,整包校驗) |
2、幀頭詳細定義
3、串口通信協(xié)議
int?parse_protocol(protocol_struct*?pProtocol,uint16_t?parseDataLen) { ????//解析數(shù)據(jù),使用前需提前緩沖?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) ????{ ????????//更新幀頭數(shù)據(jù) ????????pFrameStruct->header.sof????????????=?pMessageStruct->pData[0]; ????????//獲取data段的數(shù)據(jù)長度 ????????pFrameStruct->header.data_length????=?(pMessageStruct->pData[2]?<8)?|?(pMessageStruct->pData[1]); ????????pFrameStruct->header.crc_check??????=?pMessageStruct->pData[3]; ????????//獲取此次數(shù)據(jù)包長度 ????????pMessageStruct->data_len?=?pFrameStruct->header.data_length?+?PROTOCOL_DATA_OFFSET?+?2; ????????//計算解析后得到的?data_union?數(shù)據(jù)長度 ????????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段?指定長度數(shù)據(jù) ????????????????????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超過預定解析數(shù)據(jù)容量,避免內存越界 ????????????????????PROTOCOL_ERROR_PRINTF("parse_protocol->>CRC16_Check_Sum?err! "); ????????????????????return?PROTOCOL_RESULT_CHECK_FRAME_ERR; ????????????????} ????????????} ????????????else ????????????{ ????????????????//待解析BUFF超過預定解析數(shù)據(jù)容量,避免內存越界 ????????????????PROTOCOL_ERROR_PRINTF("parse_protocol->>data_len[%d]?>?max_data_len[%d]! ", ????????????????????pMessageStruct->data_len, ????????????????????pMessageStruct->max_data_len); ????????????????return?PROTOCOL_RESULT_OUT_OF_LEN; ????????????} ????????} ????????else ????????{ ????????????//通過包頭計算,還未收到完整的數(shù)據(jù)包 //????????????PROTOCOL_ERROR_PRINTF("parse_protocol->>data_len[%d]?>?max_data_len[%d]! ", //????????????????pMessageStruct->data_len, //????????????????pMessageStruct->max_data_len); ????????????return?PROTOCOL_RESULT_OUT_OF_LEN; ????????} ????} ????else ????{ ????????//待解析BUFF超過預定解析數(shù)據(jù)容量,避免內存越界 ????????PROTOCOL_ERROR_PRINTF("parse_protocol->>check_protocol_heade?err! "); ????????return?PROTOCOL_RESULT_CHECK_HEAD_ERR; ????} ????PROTOCOL_DEBUG_PRINTF("parse_protocol->>check_protocol_heade?ok! "); ????return?PROTOCOL_RESULT_ERR; }
軟件截圖
?
?
?
項目開源地址:
https://github.com/SEASKY-Master/vSailorProject
?
?
評論