オープンソースの QT シリアル ポート オシロスコープを共有します。これは完全にオープン ソースであり、シリアル ポート、TCP、波形表示、および通信プロトコルをサポートします。
セーラープロジェクトの機能説明
シリアルポートデバッグアシスタント機能
-
従来のシリアル ポート デバッグ アシスタントの基本的な送受信機能をサポートし、大量のデータを遅延なく更新できます。
-
受信データの保存をサポート
-
最大 200 個の編集可能な命令の設定をサポートし、複数の送信に使用されます
-
タイマー送信をサポート
-
改行文字置換タイムスタンプ機能をサポート
-
より多くの中国語エンコード形式をサポート
-
Linux での単純なシリアル ポート デバッグをサポートしていることは注目に値します。
-
200 の編集可能な命令への CSV テーブル データのロードをサポート
-
一部のウィンドウ構成の保存と回復の再開をサポート (構成ファイルを削除しない場合)
説明書
QT の組み込みテキスト表示ウィンドウは、大量のデータをロードした後にソフトウェア ラグを引き起こすことに注意してください。現在の解決策は、表示バッファを設定することです。必要に応じて、データ リフレッシュ フェーズ (つまり、シリアル ポート受信データ フェーズ) 中に、リフレッシュ状態を維持するため(受信データのリアルタイム表示)、表示バッファの内容のみが表示されます。マウスを使用してスクロールバーを上に移動すると、データのリフレッシュを停止できます。スクロール バーをある程度上に移動すると、すべてのデータの読み込みが開始されます。データ ステータスのリアルタイム更新をトリガーしたい場合は、スクロール バーを最下端まで移動し、データが受信されていることを確認してください。
保存データはディスプレイインターフェースのデータのため、リフレッシュ状態では全データを保存できませんので、シリアルポートを閉じてスクロールバーを一番上に移動し、全データをロードしてから保存するのが正しい方法です。次にウィンドウデータを保存します。
TCPサーバーインターフェース
SEASKYシリアル通信プロトコル
通信方式はシリアル ポートで、ボー レート 115200、8 データ ビット、1 ストップ ビット、ハードウェア フロー制御なし、パリティ ビットなしで構成されています。
1. 通信プロトコルフォーマット
フレームヘッダー | 設備の種類 | デバイスID | データID | フレームの終わり |
---|---|---|---|---|
プロトコルヘッダー(4バイト) | 機器の種類(2バイト) | 機器ID(2バイト) | データID(2バイト) | Frame_tail(2バイト、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