早上好,
我正在开发一个C#WPF应用程序,该应用程序从DATALOGIC扫描仪(DS4800-1000)连续读取条形码(大约每分钟一次)并将它们发送到服务器,该服务器回复有关该特定条形码的详细信息。此扫描仪通过MOXA(型号UPort 1100)的USB转串口转换器连接到运行Windows 8.1(非RT)的平板电脑。
每当读取新的条形码时,都会触发DataReceived事件并使用以下方法处理:
private void port1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Log.log(Log.LogLevel.Info, "MainScreen.port1_DataReceived");
Thread.Sleep(100);
String data = "";
// If the com port has been closed, do nothing
if (!comport1.IsOpen)
{
Log.log(Log.LogLevel.Info, "MainScreen.port1_DataReceived - COM CLOSED");
data = "COM CLOSED"; // Must be < 16 chars
}
else
{
// Obtain the number of bytes waiting in the port's buffer
int bytes = comport1.BytesToRead;
// Create a byte array buffer to hold the incoming data
byte[] buffer = new byte[bytes];
// Read the data from the port and store it in our buffer
comport1.Read(buffer, 0, bytes);
data = Encoding.Default.GetString(buffer);
Log.log(Log.LogLevel.Info, "Data received from barcode scanner number 1: " + data);
}
// COM port is handled by a different thread; this.Dispatcher calls the original thread
this.Dispatcher.Invoke((Action)(() =>
{
ExtractBarcodeData(data);
} ));
}
我正在观察一个奇怪的行为:在随机时间,我看到应用程序根本没有反应,虽然扫描仪实际上读取了新的条形码,而我期望新的DataReceived事件作为先前的条形码。日志告诉我端口实际上是打开的,我也可以使用一个关闭并重新打开它的特定按钮来关闭它。出现异常(在Open()调用上):连接到系统的设备无法正常运行。
我无法以任何方式重现此错误,它完全不可预测且随机!任何人都知道为什么DataReceived事件没有触发?
谢谢, FZ
答案 0 :(得分:2)
大多数USB转串口转换器都存在此问题。它们可能会从系统中消失并再次出现。在这种情况下所有打开的句柄都将失效。
请打开设备管理器并验证其中每个USB集线器的电源管理选项卡。系统不应关闭集线器电源。