2009-03-31 3 views
2

私は非常に奇妙な問題を抱えています。シリアルポート経由で接続されたバーコードカードリーダーを使用するWindows CE 6デバイスがあります。私はこれを処理するためにCompact Frameworkの(v2.0)SerialPortクラスを使用しており、すべて正常に動作しています。データが以前に受信された場合、SerialPort.Open()がシステムをフリーズします(Compact Framework)

ただし、問題が1つあります。シリアルポートを開く前にカードをスワイプすると、システム全体がOpen()コールでフリーズします。例外も警告もなく、完全なシステムは何の理由もなく凍結します。私はポートを開く前にバッファをクリアしようとしましたが、明らかにそのメソッドは、InvalidOperationExceptionがあるので、ポートが開かれた後にしか使用できません。

私は複雑さが何かと関係しているかどうかを確認するために単純化したコードを作成しましたが、ポートを開くボタンが付いた簡単なフォームも同じようにフリーズします。ここでは単純化されたコードです:私は私が間違ってやっているかを見ることができない

private void btConnect_Click(object sender, EventArgs e) 
{ 
     try 
     { 
      this.serialPort = new SerialPort(this.txName.Text, Convert.ToInt32(this.txBaud.Text)); 
      this.serialPort.RtsEnable = this.chRTS.Checked; 

      this.serialPort.Open(); //it freezes here 
      this.btConnect.Text = "Disconnect"; 

      this.txName.Enabled = false; 
      this.txBaud.Enabled = false; 
      this.chRTS.Enabled = false; 
     } 
     catch 
     { 
      MessageBox.Show("Failed to open port. Please check your settings and try again.", "Operation failed", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1); 
     } 
} 

、私はそれがコンパクトなフレームワークのバグだと考え始めています。カードリーダーは、F03030DKD03003\r\nなどのパケットを送信します。何か案は?前もって感謝します。

答えて

1

私がシリアルドライバを実行していたとき、私は、FIFOがあったときに受信データレジスタにデータがあると、チップがロックアップするという16550 UART(少なくともかなりの数)のバグに遭遇しました有効になりました。

FIFOを有効にする前にドライバがチップをクリアするようにしてバグを修正しました。しかし、私はWinCE 6のような最新のものがこのバグを気にしなかった場合には驚いていますが、可能であると考えています(現在の最新の16550実装にはもうこのバグはありません)。私は特にWinCEに精通していません - いくつかのDDKで利用可能なシリアルドライバのソースですか?使用しているシリアルドライバのサポート/アップデートオプションはありますか?

+0

残念ながら、シリアルドライバはOEMによって提供されています。CEにはサンプルが同梱されていますが、多くの多くのOEMが旧バージョンのドライバを持っています。 – ctacke

3

MSが提供するSerialPortクラスは、多くのことが望まれます。あなたが本当に知る必要があるのは、ネイティブコールでは、物が詰まっているところです。私の推測では、内部のバッファにはデータが入っているか、あるいはオーバーランさえ設定されていて、管理されたラッパーがそれを押しているということです。

私の提案は、無料で完全なソースが付属してOpenNETCF serial libraryを取得することです。これは、MSが提供するクラスとのインターフェイス互換です。ドライバの呼び出しまでコードを移動して、何が起こっているのかを確認することができます。

関連する問題