我最近从 Datalogic 购买了 3 个条形码阅读器(2 个 Magellan 3300HSi 和 1 个 Gryphon 4400)。制造商提供了一个我已安装的 USB 到 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. 编写关闭/分离方法
public void CloseScanner()
{
if (this.comport.IsOpen)
{
this.comport.Close();
this.comPort.DataReceived -= new SerialDataReceivedEventHandler(PortDataReceived);
}
为了进行测试扫描,我单击一个按钮,调用 OpenPort,返回一个 SerialPort 对象。我附上数据处理程序。我执行扫描。显示扫描的数据。我关闭扫描仪。
这是问题所在:
如果我只做一次,这就像一种魅力。如果关闭串口后,我想用同一个端口进行另一次测试,端口成功打开,但没有接收到数据。扫描仪(设备)在第二次关闭时发出错误提示音。
奇怪的是,这只发生在我的 Magellan 扫描仪上。Gryphon 在随后的重新开放操作中就像一个魅力。
更奇怪的是,我使用 Putty 的串行模式连接到端口。当关闭 Putty 并再次打开它以进行新会话时,Magellan 扫描仪工作正常。
我的猜测是,这与串行端口在 .NET 中的关闭方式有关。也许资源没有被释放或其他东西。最初我认为这一定是扫描仪问题,需要我遵循某种协议来关闭连接。但是,Putty 似乎可以很好地使用它。(我猜 Putty 正在使用不同的类与扫描仪进行通信,甚至可能是 WIN32 API)。
如果有人知道这可能是什么原因,请告知。这可能是一些线程问题吗?我正在认真考虑查看 Putty 的源代码,看看他们如何解决这个问题或使用 WIN32 API(不过这对我来说会使事情变得过于复杂)。
TLTR: 关闭并重新打开 SerialPort,使我无法从条形码扫描仪接收数据。它仅在第一次打开端口时起作用。我正在使用制造商的 USB 到 COM 驱动程序。我究竟做错了什么?(上面的代码片段)