1

私たちは午前中ずっとこれについて頭を悩ませてきました。組み込み 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 つの別々のメッセージに分割される理由はないはずです。 .

4

2 に答える 2

3

なぜあなたが驚いているのか分かりません。

少なくとも 1 バイトを要求しています。read() がさらに要求している場合は、1 回の読み取りで文字列全体を取得できないことに驚いているため、可能性が高いと思われますが、read() のサイズまで利用可能なデータを取得できます。ただし、すべてのデータを 1 回の読み取りで利用できるわけではないため、文字列は読み取りごとに切り刻まれます。

このシナリオでは、タイマーはあまり重要ではありません。少なくとも 1 バイトが使用可能になるまで、タイマーは設定されません。しかし、最小値を 1 に設定しました。したがって、read() サイズのバイトまで利用可能なバイト数 (>= 1) を返すだけです。

于 2009-07-15T21:02:47.443 に答える
0

この問題がまだ発生しており (質問が古いことに気付いている)、コードが正確である場合は、VTIME と VMIN をnewtio構造体に設定し、残りのパラメーターをtio構造体に設定しています。

于 2012-04-25T03:50:30.227 に答える