2009-04-21 11 views
1

以下のコードが欠落したり、データが失われたりする理由を誰にも教えてください。私は一晩中グーグルグーグルで行ってきましたが、何の指針も見つけられません。シリアルポートは次の設定を使用しています。 38400、n、8,1xon/xoffフロー制御。 ReceivedBytesThreshold = 1SerialPort + CF 2.0はデータの損失を防ぎます

isReceivingとstockReceivedは

 private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) 
    { 
     string dataReceived = serialPort1.ReadExisting(); 
     bytecount += dataReceived.Length; 
     processSerialData(dataReceived); 
    } 

    private void processSerialData(string dataReceived) 
    { 
     if (isReceiving == false) 
     { 
      int stxpos = dataReceived.IndexOf('\x02'); 
      if (stxpos != -1) 
      { 
       dataReceived = dataReceived.Replace("\x02", ""); 
       labelcaption = "Receiving... "; 
       this.Invoke(new EventHandler(SetLabel)); 
       isReceiving = true; 
      } 
     } 

     int etxpos = dataReceived.IndexOf('\x03'); 
     if (etxpos != -1) 
     { 
      dataReceived = dataReceived.Replace("\x03", ""); 
      //tmpFile.Write(dataReceived); 
      writeToFile(dataReceived); 
      tmpFile.Close(); 
      isReceiving = false; 
      stockReceived = true; 
     } 

     // Now we need to write the data to file 
     if (isReceiving == true) 
     { 
      if ((bytecount/recordSize) % 100 == 0) 
      { 
       labelcaption = "Receiving... " + (bytecount/recordSize); 
       this.Invoke(new EventHandler(SetLabel)); 
      } 
      //tmpFile.Write(dataReceived); 
      writeToFile(dataReceived); 
     } 
    } 

答えて

1

カップル潜在的な問題は、フォームの両方のメンバーである(彼らは問題であると言っていないが、彼らは私のために赤い旗を上げる)は次のとおりです。

  • 文字列を使用していて、印刷できない文字データを探しています。これは疑わしい処理アイデアIMOです。バイトを受け取ってから、バイト値を探しているはずです。基本的なエンコーディングが何をするのかは誰が知っていますか?特にASCIIエンコーディングを使用している場合、一部の文字の損失は私を少し驚かせることはありません。
  • これは潜在的なスレッドの問題のようにも見えます。 DataRecievedイベントを取得すると、データを読み込んだ後、受信ハンドラのコンテキストでデータを処理して処理します。最後のイベントを処理中に別のイベントが発生した場合はどうなりますか?私はbyteCount変数がホースされることを賭けている。個人的に私はデータを受け取ることに専用のスレッドとそれを処理するためのスレッドを持っていました。少なくとも私はそこにいくつかの種類の同期オブジェクトを追加します。
+0

ありがとうChris 私はロックブロックで同じコードを処理しました。しかしそれはうまくいかなかった。あなたの意見では、lock(syncObject)以外の何かを使うべきでしょうか? 私はSTXとETXを探していますが、ASCIIエンコーディングにするべきではありませんか?失われたデータは、大量のファイルでのみ発生します。私がテストしているファイルは約484KBであり、文字通りファイルの中央の奇数の文字です。コードは、いつもstx/etx okを受け取りそうです。 –

+0

ありがとうChris私はロックブロック内で同じコードを処理しようとしました。しかしそれはうまくいかなかった。あなたの意見では、lock(syncObject)以外の何かを使うべきでしょうか?私はSTXとETXを探していますが、それはASCIIエンコーディングにするべきですか?失われたデータは、大量のファイルでのみ発生します。私がテストしているファイルは約484KBであり、文字通りファイルの中央の奇数の文字です。コードはいつもstx/etx okを受け取りそうです –

1

複数のSTXまたはETXを1つのDataReceivedパケットで受信するケースは処理しません。

0

serialPort1_DataReceivedはトリガーイベントであるため、メインスレッドでのみ発生します。したがって、2つのスレッドで同時に入力することはできません。これを証明するには、実行中のスレッド(Thread.CurrentThread.ManagedThreadId)のスレッドIDを出力します。

serialPort1_DataReceived呼び出しでデータをスプールすることができます。シリアルリンクのアクティビティの「停止時間」を保証できる場合は、その処理がいつ開始されるかを知るまでスプールしてください。

など。データはXバイト/文字まで入力されます。その後、別の文字セットは500ms間来ないでしょう。受信したバイトを処理するために500msが必要です。

関連する問題