html シリアルデバイスサーバー:TCPの読み取りとメッセージ境界 | FCTELE
                                   +8618758069661 [email protected]
製品検索 検索ガイド: スペース = AND(かつ)、 | = OR(または)、 ! = NOT(除外)

ご質問はありますか? 今すぐお電話ください!

+8618758069661

またはメッセージをお送りください

オンラインお問い合わせ

シリアルデバイスサーバーとTCPストリーム:読み取り時にメッセージが分割・結合される理由

閲覧数: 176 +2FCTELEによるオリジナル記事著者:FCTELE技術チーム
概要

1回のTCP読み取りに、シリアル機器からの完全な応答が1つ含まれるとは限らないのはなぜですか?

UARTのタイミングは文字を復元し、機器のアプリケーションプロトコルはメッセージを定義します。サーバーはバイトをバッファリングし、TCPは読み取り境界が変わり得る順序付きストリームを届けます。正しい受信処理では、未完のバイト列を保持し、実際のプロトコルに従って検証済みのメッセージを抽出します。読み取りサイズを変えて件数、順序、ペイロードを検証してください。パケット化遅延の変更は、正しい解析の代わりにはならず、転送が滞ったシリアル入力を無制限に保護することもできません。

3つの仕組みと検証の適用範囲信号の流れを追い、実際のサービスを検証する

01文字を復元する

Reconstruct charactersUART start, data and stop timing define characters rather than business messages.S01234567TIllustrative 8N1 characterS: start · 0–7: data · T: stopUse the actual device character settings

UARTのスタート、データ、ストップのタイミングが定義するのは文字であり、業務メッセージではありません。

02読み取り境界の変化を許容する

Allow changing read boundariesThe same ordered bytes can arrive through several valid read groupings.ABCDEFABCDEFSame ordered bytesRead boundaries are not command boundaries

同じ順序のバイト列でも、複数の異なる正常な読み取り単位で到着する場合があります。

03パーサーの状態を保持する

Keep parser stateAppend bytes, validate complete messages and retain the trailing partial message.Append bytesComplete?ValidateKeep partial tailExtract valid messages; retain remaining bytes

バイトを追加し、完全なメッセージを検証して、末尾の未完メッセージを保持します。

スワイプして3つの図を比較 →

概念を説明するための図であり、実測波形、設置配線図、特定製品の内部構成を示すものではありません。
  • 文字を復元する

    両端の設定を実際のシリアル形式に合わせてください。

  • 読み取り境界の変化を許容する

    意図的な分割や複数メッセージの結合をテストしてください。

  • パーサーの状態を保持する

    長さに上限を設け、不正データや再接続後の復旧方法を定義してください。

選定・検証チェックリスト確認項目と関連ガイドを展開する
対象サービスと実際の運用条件に関する確認事項
確認項目確認する内容検証方法
文字を復元するUARTのスタート、データ、ストップのタイミングが定義するのは文字であり、業務メッセージではありません。両端の設定を実際のシリアル形式に合わせてください。
読み取り境界の変化を許容する同じ順序のバイト列でも、複数の異なる正常な読み取り単位で到着する場合があります。意図的な分割や複数メッセージの結合をテストしてください。
パーサーの状態を保持するバイトを追加し、完全なメッセージを検証して、末尾の未完メッセージを保持します。長さに上限を設け、不正データや再接続後の復旧方法を定義してください。

FCTEL オリジナル技術記事 · FCTEL技術チーム
初公開:2026-10-04 · 最終更新:2026-10-04

RS232またはRS485の機器をEthernetに接続しても、1回の読み取りで返されるデータが、その機器からの完全なメッセージ1つであるとは限りません。メッセージの分割や結合は、多くの場合、データ損失ではなく、シリアル層、ネットワーク層、アプリケーション層で境界が異なることを反映しています。これらの層を理解すれば、信頼性の高いパーサーを構築し、障害の実際の原因を特定できます。本記事では一般的な仕組みを説明します。特定のFCTEL製品が対応するモード、バッファの動作、パラメーターの範囲は、その製品のマニュアルで確認する必要があります。

詳細は元の画像を開いて確認してください。図を横方向にスクロールすると、すべてのラベルを原寸で読めます。

UARTの8N1タイミングとシリアル受信バッファ

図1。UARTは個々の文字をフレーム化します。アプリケーションプロトコルは、バイト列がどのようにメッセージを構成するかを定義します。

UARTは文字をフレーム化し、アプリケーションプロトコルはメッセージを定義する

UARTは通常、スタートビットで文字を開始し、合意した数のデータビットを送り、必要に応じてパリティを付加し、ストップビットで終了します。受信側は、設定されたボーレートと形式に従って文字を復元します。ボーレート、データビット、パリティ、ストップビットを一致させる必要があります。そのため、不適切な信号レベル、ノイズ、サンプリングエラーによって、ネットワークが関与する前の段階で文字エラーが生じることがあります。

8N1では、8ビットのバイトにもスタートビット1つとストップビット1つが必要で、合計10ビット時間となります。例として9,600 bit/sの場合、1文字に要する時間は約1.04 msです。これは計算例であり、製品の性能仕様ではありません。有効なバイトスループットが公称ビットレートより低くなる理由と、到着する文字をバッファが受け入れる必要がある理由を示しています。

RS232、RS422、RS485はそれぞれ異なる電気的インターフェースと接続構成を表し、UARTは文字のタイミングを表します。いずれも、それ自体でアプリケーションメッセージを定義するものではありません。温度の問い合わせは複数のバイトで構成される場合があります。機器は、長さ、区切り文字、固定形式、またはプロトコルで規定された時間間隔によって、メッセージ境界を別途定義する必要があります。

シリアルデバイスサーバーが2つの仕組みをつなぐ方法

受信方向では、まずシリアルインターフェースが電気信号からバイトを復元します。バイトはFIFOまたはソフトウェアバッファに入ります。その後、パケット化ロジックが、実装された長さ条件や待機条件に従って一部のバイトをネットワークスタックに渡します。逆方向では、バイトがネットワーク受信バッファから取り出され、UARTによって1文字ずつ送信されます。各方向には独自のバッファリングとスケジューリングがあります。

1つのアプリケーションメッセージが複数のシリアル受信単位にまたがる場合も、1つの受信単位に複数のメッセージが含まれる場合もあります。パケット化は待機時間と送信効率のトレードオフを調整するものであり、あらゆる上位層プロトコルを自動的に理解するわけではありません。FCTELの公開シリアルサーバー資料には、TCPサーバーモードとTCPクライアントモードが記載されています。特定のフレーミング方式が利用できるかどうか、およびその設定名と範囲は、該当モデルのマニュアルで確認する必要があります。

アップリンクが遮断されている間もシリアル送信元が送信を続けると、バッファの使用量が増加します。TCPのバックプレッシャーはネットワーク送信を制限できますが、適切なフロー制御を備えていないシリアル送信元を停止させることはできません。バッファ容量、対応するハードウェアまたはソフトウェアフロー制御、送信元の動作、切断時の処理方針を合わせて評価する必要があります。TCPによる信頼性の高い転送は、任意の輻輳条件下で無制限に損失なく動作できることを意味しません。

詳細は元の画像を開いて確認してください。図を横方向にスクロールすると、すべてのラベルを原寸で読めます。

TCPバイトストリームと異なる読み取り境界

図2。2つの正常な読み取りパターンでは、アプリケーションメッセージが分割・結合されても、同じバイト列が同じ順序で届けられます。

TCPが保持するのはバイトの順序であり、個々の送信境界ではない

TCPは接続を順序付きバイトストリームとして提供します。シーケンス番号がバイト位置を識別し、確認応答、再送、フロー制御が転送を管理します。TCPセグメントはネットワーク上の転送単位であり、業務メッセージはアプリケーションプロトコルに属します。送信側の1回の呼び出しと同じ量のデータを、受信側が1回の読み取りで取得する必要はありません。

機器が6バイトのメッセージAに続いて4バイトのメッセージBを生成するとします。正常な転送では、同じ10バイトが同じ順序で届けられます。プログラムは、最初にAの先頭2バイトを読み取り、次に残りの8バイトを読み取ることも、10バイトすべてを一度に読み取ることもあります。これらは一般にメッセージの分割や結合と呼ばれます。バイトが欠けずに正しい順序で届いている場合、どちらもそれ自体ではデータの破損を示しません。

読み取り長は、利用可能なデータ、受信バッファリング、スレッドのスケジューリング、インターフェースの引数に依存します。ネットワークでのセグメント分割は、経路とスタックにも依存します。アプリケーションは、キャプチャしたTCPセグメントの長さから業務メッセージの長さを推定したり、読み取りが返るたびに機器からの応答1つとして扱ったりすることはできません。接続が閉じられた場合も、受信済みの完全なデータを処理し、末尾の未完メッセージを識別する必要があります。

詳細は元の画像を開いて確認してください。図を横方向にスクロールすると、すべてのラベルを原寸で読めます。

状態を保持する受信バッファと長さベースのパーサー

図3。架空のプロトコルを用いて、未完フレームの保持、検証、引き渡し、および末尾のバイト列の保持を示します。

堅牢なパーサーは読み取り間で状態を保持する

継続的に保持するバイトバッファを用意します。読み取りのたびにデータを追加します。解析ループでは、まずヘッダーが揃っているかを確認し、次にプロトコルの長さ規則または終端規則を適用します。完全なメッセージだけを検証し、業務層に渡します。未完のバイト列は次の読み取りまで保持し、複数の完全なメッセージは、残りを破棄せずに個別に解析します。

同期マーカー、長さ、ペイロード、チェックサムを含む独自プロトコルでは、長さにヘッダーを含むかどうか、バイトオーダー、許容される最大サイズ、チェックサムの対象範囲を規定してください。図は説明用の架空の形式を使用しており、FCTELのプロトコルではありません。実環境では実際の機器のプロトコルを使用し、バッファの増大に上限を設け、あり得ない長さを拒否してください。1つの不正なバイトによって以降のすべてのメッセージの位置がずれないように、検証失敗後の再同期方法を定義してください。

区切り文字ベースのプロトコルでは、エスケープ処理や、バイナリペイロード内に現れる区切り文字と同じ値への対応が必要です。固定長プロトコルでは、メッセージ種別によって長さが異なる場合を考慮する必要があります。タイミングベースのシリアルプロトコルでは、シリアル回線上で観測される間隔と、ネットワークアプリケーションが認識する到着時刻を区別してください。バッファリングとスケジューリングによって、それらの間隔は変化します。TCPの読み取り間隔が、元のシリアルのフレーム間隔になるとは限りません。

パケット化の待機時間によって変わるもの

待機時間を長くすると、送出前により多くのシリアルバイトをまとめ、小さな転送のオーバーヘッドを削減できる場合がありますが、最初のバイトの送出が遅れる可能性があります。待機時間を短くすると、より早くバイトを転送できる一方で、アプリケーションが受け取る未完メッセージが増える場合があります。どちらも正しい解析の代わりにはなりません。1回の読み取りにつき1メッセージを要求するのではなく、業務上の遅延とデータの完全性を最適化してください。

要求・応答型通信では、機器の処理、シリアル送信、サーバーのバッファリング、ネットワークの往復時間、アプリケーションのスケジューリングを個別に考慮してください。条件を管理したテストを用い、これらの段階をカバーするようにタイムアウトを設定します。再試行の動作は業務上の意味に従う必要があります。タイムアウト後に無条件で再送を無期限に繰り返すのではなく、書き込みコマンドや動作コマンドを繰り返しても安全かどうかを判断してください。

受け入れテストでは内容、タイミング、復旧を検証する

条件を管理したテストでは、識別しやすいシーケンス番号と長さを使用してください。単独のメッセージ、連続するメッセージ、分割された入力、長いペイロード、短い休止を対象に含めます。同じパーサーを意図的に異なる読み取りサイズで動作させ、最終的なメッセージ件数、順序、ペイロード、検証結果を確認してください。これは、単に正常に見える端末画面よりも確かな根拠となります。例は顧客の測定値ではなく、テスト入力として記録してください。

次に、シリアル形式の不一致、アップリンクの中断、輻輳、再接続をそれぞれ個別にテストします。シリアルの文字エラーとネットワーク再送、バッファオーバーフローと通常の分割、業務上のタイムアウトとデータ完全性の障害を区別してください。入力バイト数、解析済みメッセージ、バッファの残存内容、エラー原因、復旧時間を記録し、パケットキャプチャとシリアルログで使用した時刻基準を保持してください。

FCTELのシリアルデバイスサーバーを選定する際は、実際のインターフェース、動作モード、フロー制御、切断時の動作を確認してください。設計上の重要な区別は、サーバーが接続とデータ転送を担い、アプリケーションプロトコルがメッセージを定義し、パーサーが複数回の読み取りにまたがってメッセージを復元するという点です。役割を明確にすることで、通常のストリーム動作をハードウェア障害と誤認するのを防げます。

技術参考資料: IETF RFC 9293、TCPバイトストリームサービス。関連するFCTEL資料: 技術記事 および シリアルデバイスサーバーの製品資料(中国語).

実務上のよくある質問

UARTの文字形式が正しければ、機器コマンドの長さも決まりますか?

いいえ。ボーレートとフレーミングによって復元されるのは文字であり、それらのバイトがどのようにコマンドや応答を構成するかは、引き続きアプリケーションプロトコルが定義します。長さ、区切り文字、規定されたタイミングのルールは、シリアルの電気的インターフェースとは別に確認してください。

シリアルサーバーのパケット化遅延を長くすれば、1回のTCP読み取りで必ず1つのプロトコルメッセージを取得できますか?

いいえ。バッファリングと送信のタイミングは変わりますが、受信側の読み取りでは依然としてデータが分割・結合される場合があります。実際のプロトコルに従ってメッセージを復元し、TCPに送信側の呼び出し境界を保持させようとするのではなく、遅延を測定してください。

TCPの読み取りがシリアル応答の途中で終わった場合、パーサーはどう処理すべきですか?

プロトコルの制限とタイムアウト規則に従って、未完のバイト列を次の読み取りまで保持してください。完全で検証済みのメッセージだけを渡し、末尾のデータを保持して、再同期方法を定義します。読み取りが返ったという理由だけで未完メッセージを破棄しないでください。

出典と適用範囲

これらの補足は一般的な仕組みを説明するものです。対応機能、接続の詳細、受入判定基準は、実際の機器、ソフトウェア、運用条件に合わせて検証する必要があります。図は測定結果や認証の証拠ではありません。

この記事を共有する