LinuxのtermiosのVTIMEが動作しませんか?
-
16-09-2019 - |
質問
私たちは、すべての朝、この1のオフに私たちの頭をバッシングしてきました。私たちは、組み込みLinuxのデバイスとUbuntuのボックスの間にいくつかのシリアル回線のセットアップを持っています。私たちは、私たちのコードは、通常のメッセージの代わりに送信された実際のメッセージごとに読んで一つのメッセージを読み込みます。
(時には正確に一つの、時にはそれ以上)は2を返しますので、めちゃくちゃになっている読み込みここでシリアルポートを開くコードです。 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;
}
他端は、通信のために同様に構成され、特定のiterestの一つの小さな部分を有している:
while (1)
{
sprintf(out, "\r\nHello world %lu", ++ulCount);
puts(out);
WritePort((BYTE *)out, strlen(out)+1);
sleep(2);
} //while
私は受信機の読み取りスレッドを実行すると、さて、「こんにちは世界」は、通常のカップルのメッセージを介して分解されます。ここではいくつかのサンプル出力されます:
1: Hello
2: world 1
3: Hello
4: world 2
5: Hello
6: world 3
コロン数が受け取っつのメッセージがあります。あなたは私たちが作っているすべてのエラーを見ることはできますか?
ありがとうございます。
編集: 明確にするために、Linuxのシリアルプログラミングのセクション3.2を参照してくださいHOWTO に。私の理解に、数秒(VTIMEはどこか10と50の間で設定されている意味、試行錯誤)のVTIME、および1のVMINと、メッセージは二つの別々のメッセージの上に分割されない理由があってはなりませんます。
解決
私はあなたが驚いている理由は表示されません。
あなたは、少なくとも1つのバイトを求めています。あなたの読み取りが()あなたは、単一の読み取りで、文字列全体を取得されていません驚いているので、可能性思われる、より多くを求めている場合は、読み取り()サイズまで利用できるものは何でもデータを取得することができます。あなたの文字列が読み込ま間切り刻まれるように、しかし、すべてのデータが単一の読み取りでは使用できません。
このシナリオでは、タイマーは本当に重要ではありません。少なくとも1つのバイトが利用可能になるまでのタイマーが設定されません。しかし、あなたは1で最小に設定しているので、それだけで(> = 1))(sizeバイトを読み取ることまで可能ですどんなバイト数。
を返します他のヒント
あなたはまだこの問題(ある古い質問を実現)、そしてあなたのコードが正確である、あなたは、newtio
構造体であなたのVTIMEとVMINを設定しているとtio
の構造体の他のパラメータの残りの部分を経験している場合。