知識マップ: シリアル通信アプリの落とし穴 - 再接続とログ設計まで
記事「シリアル通信アプリの落とし穴 - 再接続とログ設計まで」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。
この記事は、装置連携などで使うC#のシリアル通信アプリで、たまにだけ壊れる不具合を防ぐための設計ガイドです。シリアル通信は順序付きのbyte streamにすぎずメッセージ境界を持たないため、DataReceivedイベントを1メッセージ到着の通知として扱うことは推奨されず、受信をいったん蓄積してからフレームパーサーで切り出す設計が推奨されます。送信は1本のワーカーに集約するsingle writerに寄せ、timeoutはopen・inter-byte・response・reconnect backoffという意味ごとに分けて設計します。フレームにリクエストIDが無いプロトコルでは応答のタイムアウト後に取り違えが起きうるため、単なる再接続ではなく受信バッファやparser状態まで作り直すセッション再生成が必要になります。
flowchart LR
accTitle: シリアル通信アプリの落とし穴の知識マップ
accDescr: シリアル通信がメッセージ境界を持たないbyte streamであることを起点に、フレームパーサーとsingle writer設計がその境界と送信順序をどう扱うか、timeoutの種別分割とリクエストIDの有無が応答の取り違えとセッション再生成にどうつながるかを示す図です。
serial_communication["シリアル通信"]
frame_parser["フレームパーサー(蓄積してから切り出す設計)"]
single_writer["single writer(単一書き込み口)"]
byte_stream["byte stream(順序付きbyte列)"]
frame_boundary["フレーム境界"]
datareceived_event["SerialPort.DataReceivedイベント"]
crc_check["CRCによるフレーム検証"]
inter_byte_timeout["inter-byte timeout"]
timeout_taxonomy["タイムアウトの種別分割"]
response_timeout["response timeout"]
reconnect_backoff["backoff付き再接続"]
response_mismatch_risk["応答の取り違えリスク"]
request_id["リクエストID"]
session_regeneration["session再生成(再接続設計)"]
flow_control_lines["フロー制御・DTR/RTS"]
hex_dump_logging["hex dumpを含む送受信ログ"]
serial_communication -->|"利用する"| byte_stream
byte_stream -->|"前提とする"| frame_boundary
frame_parser -->|"実装を担う"| frame_boundary
datareceived_event -->|"用いるのは非推奨"| frame_boundary
frame_parser -->|"推奨される対応"| byte_stream
single_writer -->|"推奨される対応"| serial_communication
frame_parser -.->|"利用する"| crc_check
frame_parser -.->|"利用する"| inter_byte_timeout
timeout_taxonomy -->|"利用する"| inter_byte_timeout
timeout_taxonomy -->|"利用する"| response_timeout
timeout_taxonomy -->|"利用する"| reconnect_backoff
response_timeout -.->|"原因になり得る"| response_mismatch_risk
request_id -->|"防止する"| response_mismatch_risk
session_regeneration -->|"推奨される対応"| response_mismatch_risk
session_regeneration -->|"利用する"| reconnect_backoff
serial_communication -.->|"前提とする"| flow_control_lines
hex_dump_logging -->|"推奨される対応"| serial_communication
single_writer -.->|"前提とする"| response_timeout
概念間の関係(全18件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- シリアル通信はbyte stream(順序付きbyte列)を利用します。
- byte stream(順序付きbyte列)はフレーム境界を前提とします。
- フレームパーサー(蓄積してから切り出す設計)はフレーム境界の実装を担います。
- SerialPort.DataReceivedイベントをフレーム境界に用いることは推奨されません。
- フレームパーサー(蓄積してから切り出す設計)はbyte stream(順序付きbyte列)に対する本記事の推奨です。
- single writer(単一書き込み口)はシリアル通信に対する本記事の推奨です。
- フレームパーサー(蓄積してから切り出す設計)はCRCによるフレーム検証を利用します。
- フレームパーサー(蓄積してから切り出す設計)はinter-byte timeoutを利用します。
- タイムアウトの種別分割はinter-byte timeoutを利用します。
- タイムアウトの種別分割はresponse timeoutを利用します。
- タイムアウトの種別分割はbackoff付き再接続を利用します。
- response timeoutは応答の取り違えリスクの原因になることがあります。
- リクエストIDは応答の取り違えリスクを防ぎます。
- session再生成(再接続設計)は応答の取り違えリスクに対する本記事の推奨です。
- session再生成(再接続設計)はbackoff付き再接続を利用します。
- シリアル通信はフロー制御・DTR/RTSを前提とします。
- hex dumpを含む送受信ログはシリアル通信に対する本記事の推奨です。
- single writer(単一書き込み口)はresponse timeoutを前提とします。
主要概念の定義
機械可読データ
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。