シリアル ポート経由でデバイスと接続しようとしています。デバイスは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バイトずつデータを読み取り、メッセージを別の関数で構築する必要がありますか?