知識マップ: シリアル通信アプリの落とし穴 - 再接続とログ設計まで

記事「シリアル通信アプリの落とし穴 - 再接続とログ設計まで」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。

この記事は、装置連携などで使うC#のシリアル通信アプリで、たまにだけ壊れる不具合を防ぐための設計ガイドです。シリアル通信は順序付きのbyte streamにすぎずメッセージ境界を持たないため、DataReceivedイベントを1メッセージ到着の通知として扱うことは推奨されず、受信をいったん蓄積してからフレームパーサーで切り出す設計が推奨されます。送信は1本のワーカーに集約するsingle writerに寄せ、timeoutはopen・inter-byte・response・reconnect backoffという意味ごとに分けて設計します。フレームにリクエストIDが無いプロトコルでは応答のタイムアウト後に取り違えが起きうるため、単なる再接続ではなく受信バッファやparser状態まで作り直すセッション再生成が必要になります。

シリアル通信アプリの落とし穴の知識マップシリアル通信がメッセージ境界を持たないbyte streamであることを起点に、フレームパーサーとsingle writer設計がその境界と送信順序をどう扱うか、timeoutの種別分割とリクエストIDの有無が応答の取り違えとセッション再生成にどうつながるかを示す図です。利用する前提とする実装を担う用いるのは非推奨推奨される対応推奨される対応利用する利用する利用する利用する利用する原因になり得る防止する推奨される対応利用する前提とする推奨される対応前提とするシリアル通信フレームパーサー(蓄積してから切り出す設計)single writer(単一書き込み口)byte stream(順序付きbyte列)フレーム境界SerialPort.DataReceivedイベントCRCによるフレーム検証inter-byte timeoutタイムアウトの種別分割response timeoutbackoff付き再接続応答の取り違えリスクリクエストIDsession再生成(再接続設計)フロー制御・DTR/RTShex dumpを含む送受信ログ

概念間の関係(全18件)

図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。

主要概念の定義

シリアル通信
1本の通信路で順序付きのbyte列をやり取りする通信方式。メッセージの境界は自分でプロトコルとして定義する必要がある。
フレームパーサー(蓄積してから切り出す設計)
受信したbyte列をいったんバッファへ蓄積し、フレーム境界の定義に沿ってメッセージを切り出す受信側の設計。
single writer(単一書き込み口)
呼び出し側が何スレッドあっても、書き込み先(ログファイルやシリアルポートなど)への実際の書き込みは1か所(1スレッド)だけに絞る設計。
byte stream(順序付きbyte列)
送受信の順序だけが保証され、メッセージの境界を持たないbyteの列。1回の書き込みが受信側では分割されたり連結されたりして届く。
SerialPort.DataReceivedイベント
.NETのSerialPortが提供する受信通知イベント。受信byteごとに発火するとは限らず、UIスレッドでもない。
タイムアウトの種別分割
open・inter-byte・response・reconnect backoffなど、意味ごとに分けて設計するタイムアウトの考え方。1個の数字で全部を表現しようとすると原因の切り分けが難しくなる。
response timeout
コマンド発行から応答完了までを打ち切るまでの時間。
リクエストID
コマンドとその応答を一意に対応づけるための識別子。フレームに持たせないと、遅延応答を次のコマンドの応答と誤認するおそれがある。
session再生成(再接続設計)
受信バッファ・parser状態・pending request・初期化シーケンスまで含めて作り直す再接続の設計。単なるOpen()のやり直しでは足りない。
hex dumpを含む送受信ログ
送受信時刻・ポート設定・送受信フレームのhex dump・parserエラー・応答の対応関係・再接続理由を残すログ設計。

機械可読データ

このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。