私は最近、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 ドライバーを使用しています。私は何を間違っていますか?(上記のコード スニペット)