仕様書はここに。
https://modbus.org/docs/PI_MBUS_300.pdf
このP9に仕様が書かれている。英文は以下。
Following the last transmitted character, a similar interval of at least 3.5 character
times marks the end of the message. A new message can begin after this interval.
The entire message frame must be transmitted as a continuous stream. If a silent
interval of more than 1.5 character times occurs before completion of the frame,
the receiving device flushes the incomplete message and assumes that the next
byte will be the address field of a new message.
Similarly, if a new message begins earlier than 3.5 character times following a
previous message, the receiving device will consider it a continuation of the
previous message. This will set an error, as the value in the final CRC field will not
be valid for the combined messages.
しかし、これの解釈がどうもマチマチ。要は、日本人なんで、英文が読めない。これを自分なりに読み込んでみた。
(日本語訳)最後に送られてきた文字に続き、3.5文字以上のインターバルでメッセージの終了とする。このインターバルから次の新しいメッセージが始まる。完全なるメッセージフレームは連続ストリームとして送信されなくてはいけない。もし、フレームが完成する前に1.5文字以上のインターバルがあったら受信器は不完全メッセージをフラッシュし、(このインターバル後の)次のバイトは新規メッセージのアドレスフィールドとする。
同様に、前のメッセージ(=完成したフレーム)受信完了直後、3.5文字時間以内に次のメッセージが来た場合、受信器は(そのメッセージを)前のメッセージの続きと解釈する。この場合、結合メッセージはCRCエラーとなる。(以上、翻訳終了)
解釈が割れるのが、1.5文字以上3.5文字未満のインターバルが来たらどうするのか?である。そんなことどこにも書いていないんだけど、フレーム完成前に1.5文字以上のインターバルが来たら、という文言に引きずられ、誤解釈している。この英文を素直に読むと、フレーム開始は3.5文字以上のインターバルに始まる。次の文字はアドレス。この後、(書いていないけど)フレーム解析を行いつつバッファリングする。CRCまで受信し、フレームの受信完了となったら、次は3.5文字以上のインターバルを確認する。でも、フレーム受信完了直後、3.5文字未満のインターバルが来たらどうするか?それは連続フレームとして受信し、結果としてCRCエラーとする。一方、フレーム受信完了前に1.5文字以上のインターバルが見つかった場合、そのフレームを破棄して次の開始を待つ(仕様通り見るなら、次のバイトはアドレス、つまり新規フレームになっている)。インターバルはフレーム受信中、受信完了時で解釈が違いますよ、と言っているに過ぎない。
どうだろうか?合っているだろうか?