0

シリアル ポート経由でデバイスと接続しようとしています。デバイスは10 byte、700 ミリ秒ごとに「ハートビート」としてポーリングを送信します。ハートビートを読むたびに、12 byte長い応答で返信する必要があります。

この応答内で、デバイスがポーリングの間に特定のデータを送信するように要求できます。データ量はリクエストごとに異なります。サイズに関係なく、常に 1 つのチャンクでメッセージを読み取るようにシリアル ポートを設定する方法はありますか?

私の現在の端末設定は次のとおりです。

int ttySetRaw(int fd, struct termios *prevTermios)
{
    struct termios t;
    if (tcgetattr(fd, &t) == -1)
        return -1;

    if (prevTermios != NULL)
        *prevTermios = t;

    t.c_lflag &= ~(ICANON | ISIG | IEXTEN | ECHO);
    t.c_iflag &= ~(BRKINT | ICRNL | IGNBRK | IGNCR | INLCR | INPCK | ISTRIP | IXON | PARMRK);
    t.c_oflag &= ~OPOST; /* Disable all output processing */
    t.c_cc[VMIN] = 12; /* 12 chars at a time, enough for the poll and the reply to be sent/received in one chunk, when I change this I no longer receive the poll*/
    t.c_cc[VTIME] = 10; /* maximum timeout 1 second */

    t.c_cflag |= PARENB;
    t.c_cflag |= PARODD;

    if (tcsetattr(fd, TCSAFLUSH, &t) == -1)
       return -1;

    return 0;
}

VMIN と VTIME を変更しようとしましたが、VTIME = 7 に設定すると、700ms が経過するまでバッファー内のすべてを読み取ることになると思いましたが、これは失敗します。また、ポーリング間隔内でデバイスに別のより長いメッセージを送信させたい場合にも十分ではありません。

私が望むものを達成できるセットアップはありますか、それとも弾丸をバイトして一度に1バイトずつデータを読み取り、メッセージを別の関数で構築する必要がありますか?

4

1 に答える 1

2

サイズに関係なく、常に 1 つのチャンクでメッセージを読み取るようにシリアル ポートを設定する方法はありますか?

一般的に、いいえ。TCP ストリームと同様に、シリアル リンクはバイト ストリームであり、1 バイトを超えるメッセージ境界はありません。

メッセージをバイト ストリームから解析できるプロトコルが必要です。

とは言うものの、一部のシリアル ハードウェアとドライバでは「ブレーク」信号の送信と検出が許可されていますが、その機能を使用している人は、たとえ利用可能であっても、もう知りません。

于 2013-11-05T11:26:07.480 に答える