私たちは午前中ずっとこれについて頭を悩ませてきました。組み込み Linux デバイスと Ubuntu ボックスの間にいくつかのシリアル ラインをセットアップしました。私たちのコードは通常、実際に送信されたメッセージごとに 1 つのメッセージを読み取るのではなく、2 つ (場合によってはそれ以上、場合によっては正確に 1 つ) のメッセージを読み取るため、読み取りが台無しになります。
シリアルポートを開くコードは次のとおりです。InterCharTime は 4 に設定されています。
void COMClass::openPort()
{
struct termios tio;
this->fd = -1;
int tmpFD;
tempFD = open( port, O_RDWR | O_NOCTTY);
if (tempFD < 0)
{
cerr<< "the port is not opened"<< port <<"\n";
portOpen = 0;
return;
}
tio.c_cflag = BaudRate | CS8 | CLOCAL | CREAD ;
tio.c_oflag = 0;
tio.c_iflag = IGNPAR;
newtio.c_cc[VTIME] = InterCharTime;
newtio.c_cc[VMIN] = readBufferSize;
newtio.c_lflag = 0;
tcflush(tempFD, TCIFLUSH);
tcsetattr(tempFD,TCSANOW,&tio);
this->fd = tempFD;
portOpen = true;
}
もう一方の端は、通信用に同様に構成されており、特定のイテレストの小さなセクションが 1 つあります。
while (1)
{
sprintf(out, "\r\nHello world %lu", ++ulCount);
puts(out);
WritePort((BYTE *)out, strlen(out)+1);
sleep(2);
} //while
ここで、受信マシンで読み取りスレッドを実行すると、通常、「hello world」はいくつかのメッセージに分割されます。出力例を次に示します。
1: Hello
2: world 1
3: Hello
4: world 2
5: Hello
6: world 3
ここで、数字の後にコロンが続く場合は、受信したメッセージの 1 つです。私たちが犯しているエラーがわかりますか?
ありがとうございました。
編集: わかりやすくするために、Linux Serial Programming HOWTO のセクション 3.2 を参照してください。私の理解では、VTIME が数秒 (つまり、vtime が 10 から 50 の間のどこかに設定され、試行錯誤) で、VMIN が 1 の場合、メッセージが 2 つの別々のメッセージに分割される理由はないはずです。 .