2011-07-19 11 views
2

現在、私のPCのcomポート経由で受信者から2つの無線間で送信された信号を読み込んでいます。私が抱えている問題は、それがリストボックスに正しく表示されているかどうかです。先頭から始まらないので、出力の上に空白行がたくさん表示され、下にスクロールして私のループが奇妙な動作をしています。2つの無線、シリアル通信の間で送信された信号の読み取り

void Cserial_NewDlg::OnBnClickedButton1() 
{ 
    CString tempStr; 
    bool bReading = true; 
    //memset(&port, 0, sizeof(port)); 
    //memset(buffer,0,BUFFER_SIZE); 
    while(bReading) { 
     ReadFile(file,&buffer[0],BUFFER_SIZE,&bytesRead,NULL); //reading opened port 
     if(bytesRead == 0) 
      break; 
     tempStr = buffer; 
     int Pos = tempStr.Find("TX",0); //finding the start of each transmission 
     if(Pos > 0){/*memcpy*/} 
     else { 
      memmove(processBuffer,&buffer[Pos],PROCESS_SIZE); //copying buffer to a new buffer of correct size 
      m_ListBox.AddString(processBuffer); //displaying 
     } 
     /*if(bytesRead == PROCESS_SIZE) 
      bReading = false;*/ 
    } 
} 

初めて「読み取り」ボタンが(それがtranmissionの長さであるとして、29バイト)、それは罰金を読み込み、私はprocessBufferに問題を抱えてい押される:ここで コードです前回のバッファからデータを再コピーしないでください(64バイト、何らかのオーバーフローを許します)。これにより、最初にループをラウンドした後に、再度読込みボタンを押す必要があります。これは私が意図したものではなく、問題、任意のアイデア?

+0

これは長続きしていないので、私はそれを以下の答えに移しています。 – Nate

答えて

1

リスティングのブランチはデッドブランチですが、 "TX"が最初であるか、まったく見つからない場合にのみelseが実行されるため、これは問題です。今までにバッファを読み込んで "TX"が表示されない場合は、バッファの読み込みエラーが発生します。バッファのインデックス-1から開始します。

基本的に、メッセージ全体を返さない短い読書があるとか、探している「TX」キーが含まれていない書式の悪いメッセージがあるとします。CString: :Find関数は-1を返します。つまり、「見つからない」ことを意味します。そのような場合は、メッセージを追加する前にメッセージの最後が見つかるまで、読んだり(たぶんそこに眠りにつくかもしれません)、読み続ける必要があります。これにより、複数のボタンが押されるのを防ぐことができます。

期待されるメッセージがどのように表示されるかを詳細に説明することをお勧めします。

0

processBufferにはstd::deque<char>を使用する方がよいでしょう。名前が示すように、そのクラスは両端キュー用に設計されています。 bufferのバイトを単純に追加し、先頭からバイトを取ります。

関連する問題