0

私は最近、3 つのバーコード リーダー (2 つの Magellan 3300HSi と 1 つの Gryphon 4400) をどちらも Datalogic から入手しました。製造元は、私がインストールした USB to COM ドライバーを提供し、SerialPort クラスを使用してスキャナーと通信できるようにします。スキャナーを (USB 経由で) 接続すると、デバイス マネージャーに COM ポートが追加され、その上で Open() メソッドを呼び出すことができます。

私が構築しているアプリケーションの一部は、スキャナーとの通信が正常であることをテストしています。これは、テスト スキャンを実行することによって行われます。このスキャンで使用される方法は次のとおりです。

1. スキャナーを開く

public static SerialPort OpenPort(string comPortName)
{
    bool error;
    this.comport = new SerialPort();
    this.comport.BaudRate = 9600;
    this.comport.DataBits = 8;
    this.comport.StopBits = (StopBits)Enum.Parse(typeof(StopBits), "One");
    this.comport.Parity = (Parity)Enum.Parse(typeof(Parity), "None");
    this.comport.PortName = comPortName;

    try{
        this.comport.Open();
    }
    catch (UnauthorizedAccessException) { error = true; }
    catch (IOException) { error = true; }
    catch (ArgumentException) { error = true; }

    if (error)
    {
            return null;
    }

    return comport;

}

2. データ ハンドラー リスナー

    public void PortDataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        SerialPort comport = sender as SerialPort;

        if (!comport.IsOpen) return;

        string data = comport.ReadExisting();

        MessageBox.Show("Data received " + data);
    }

3. データハンドラのアタッチ

    this.comPort.DataReceived += new SerialDataReceivedEventHandler(PortDataReceived);

4. Close / Detach メソッドの記述

    public void CloseScanner()
    {
        if (this.comport.IsOpen)
        {
            this.comport.Close();
            this.comPort.DataReceived -= new SerialDataReceivedEventHandler(PortDataReceived);
        }

テスト スキャンを実行するためにボタンをクリックすると、OpenPort が呼び出され、SerialPort オブジェクトが返されます。データハンドラーを取り付けます。スキャンを実行します。スキャンしたデータが表示されます。スキャナーを閉じます。

問題は次のとおりです。

一度だけやれば、これは魅力のように機能します。シリアル ポートを閉じた後、同じポートを使用して別のテストを実行したい場合、ポートは正常に開かれますが、データが受信されません。スキャナー (デバイス) は、2 回目に閉じたときにエラーのビープ音を出します。

奇妙なことに、これは私の Magellan スキャナでのみ発生します。グリフォンは、その後の再開操作で魔法のように機能します。

さらに奇妙なことに、Putty のシリアル モードを使用してポートに接続しました。Putty を閉じて、新しいセッションのために再度開くと、Magellan スキャナーは問題なく動作します。

私の推測では、これはシリアル ポートが .NET で閉じられている方法に関係していると思われます。たぶん、リソースの割り当てが解除されていないか、何かです。最初は、これはスキャナーの問題であるに違いないと考えていました。接続を閉じるには、特定のプロトコルに従う必要がありました。しかし、Putty は問題なく動作しているようです。(Putty は、スキャナーとの通信に別のクラスを使用していると思います。おそらく WIN32 API でさえも)。

何が原因かわかる方、アドバイスお願いします。代わりに、これはいくつかのスレッドの問題でしょうか? Putty のソース コードを調べて、これにどのように取り組んでいるか、または WIN32 API を使用することを真剣に考えています (ただし、これは私にとっては複雑すぎます)。

TLTR: SerialPort を閉じてから再度開くと、バーコード スキャナーからデータを受信できなくなります。ポートが最初に開かれたときにのみ機能します。メーカーの USB to COM ドライバーを使用しています。私は何を間違っていますか?(上記のコード スニペット)

4

2 に答える 2

1

デバイスの特定のメーカーを対象とするバーコード リーダー アプリを開発している場合は、.Net ジェネリック SerialPort クラスを使用する代わりに、それらの sdk/オブジェクトを使用することをお勧めします。.Net フレームワークは、その分野では改善されていません。それはまだちょっと遅くてバグがあります。

.Net と Win32 の両方で多くの例が含まれている Jan Axelson のサイトを調べることができます。

于 2012-11-10T05:19:42.050 に答える