3

Linux でシリアル回線を介してデータを送受信していますが、文字間の遅延を見つけたいと考えています。

Modbus は、メッセージ フレームの境界を検出するために 3.5 文字の遅延を使用します。1.5 文字を超える遅延がある場合、メッセージ フレームは不完全であると宣言されます。

基本的にはCで簡単なプログラムを書いています

fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY | O_NONBLOCK);
// setup newtio
....
tcsetattr(fd, TCSANOW, &newtio);
for(;;) {
    res = read(fs, buf, 1);
    if (res > 0) {
        // store time in milliseconds?
        //do stuff
    }
}

ここで時間を測定する方法はありますか?または、別の方法でシリアルラインからデータを取得することを検討する必要がありますか?

また、SIGIO にフックして、データがあるときはいつでも信号を取得しようとしましたが、一度に 8 バイトのデータを取得しているようです。

(はい、いくつかの modbus ライブラリが存在することは知っていますが、これを他のアプリケーションで使用したいです)

4

4 に答える 4

6

簡単な答えは...できません(独自のシリアルドライバーを作成しないとできません)!

MODBUSマスターを作成している場合、いくつかの希望があります:何も受信せずに任意の時間 (3.5 文字より長い場合) 待機することで、スレーブ応答の終了を検出できます (ここでは select(2) が役立ちます)。または、応答を読みながらオンザフライで解析します (2 番目の方法は無駄な時間が大幅に短縮されます)。また、前の要求に対する応答を受信した後、新しい要求の送信を開始する前に、少なくとも3.5 文字時間待機するように注意する必要があります。「少なくとも」はここで有効です!それ以上待っても問題ありません。待ち時間が少なくなります。

あなたがMODBUSスレーブを書いているなら、あなたは運が悪い. ユーザー空間 Linux から確実に実行することはできません。独自のシリアル ドライバを作成する必要があります。

ところで、これは Linux のせいではありません。これは、MODBUS のフレーミング方式の信じられないほどの愚かさによるものです。

于 2010-05-12T17:33:42.270 に答える
4

MODbus は多くの古いプロトコルに似ており、最新のハードウェアを本当に嫌っています。

一度に 8 バイトを取得している理由は次のとおりです。PC には、ハードウェアで送受信時に (少なくとも) 16 バイトのシリアル FIFO があります。ほとんどは 64 バイト以上です。

UART デバイスにタイムアウトを指示し、char 回の回数後に受信した割り込みを発行することができます。

トリガーレベルは調整可能ですが、低レベルドライバーはそれを「賢く」設定します。setserial を使用して低遅延モードを試してください) 必要に応じて、シリアル ドライバーのコードをいじることができます。Google で検索してください (成人向けコンテンツの警告) きれいではありません。

したがって、ルーチンは疑似コードです

int actual=read (パケット、1.5 文字のタイムアウト)

実際の受信バイト数を確認する

パケット未満の場合、問題があり、破棄します。

良くない。

于 2009-11-16T03:51:27.587 に答える
0

あなたはこれについて間違った方法で進んでいると思います。文字がすべて一緒に来ることを保証するためのメカニズムが組み込まれています。

基本的に、およびパラメータを適切に使用ioctl()および設定する必要があります。この場合、(パケット内の最小文字数)と(文字間で許容される最小時間(10 分の 1 秒)) が必要なようです。VMINVTIMEVMIN0VTIME15

非常に基本的なコード例:

struct termio t;
t.c_cc[ VMIN ] = 0;
t.c_cc[ VTIME ] = 15;
if (ioctl( fd, TCSETAW, &t ) == -1)
{
    printf( msg, "ioctl(set) failed on port %s. Exiting...", yourPort);
    exit( 1 );
}

あなたの前にこれを行いますopen()が、あなたの前にread()。以下に、非常に役立つと思われるリンクをいくつか示します。

シリアルプログラミングガイド

VMIN と VMAX について

たとえそれがあなたの質問に対する完璧な答えでなくても、少なくとも正しい方向にあなたを助ける/指摘することを願っています.

于 2009-11-17T23:44:42.660 に答える