UWP中串行设备通信的问题

4

我有一个奇怪的问题。

我正在尝试在UWP项目中与需要串行通信的外围设备进行通信。我正在使用 Windows.Devices.SerialCommunication

为了演示目的,我创建了一个新页面,其中包含两个按钮和两个不同的点击处理程序。一个用于打开端口,另一个用于向外围设备发送消息。

其中一个处理程序是:

    SerialDevice device;
    
    private async void Button_Click_1(object sender, RoutedEventArgs e)
    {
         string selector = SerialDevice.GetDeviceSelector("COM7");
         DeviceInformationCollection devices = await DeviceInformation.FindAllAsync(selector);
             if (devices.Any())
             {
                 DeviceInformation deviceInfo = devices.First();
                 device = await SerialDevice.FromIdAsync(deviceInfo.Id);
                 //*********************
                 device.BaudRate = 9600;
                 device.DataBits = 8;
                 device.Parity = SerialParity.None;
                 device.StopBits = SerialStopBitCount.One;
                 device.ReadTimeout = device.WriteTimeout = TimeSpan.FromMilliseconds(1000);
                 device.Handshake = SerialHandshake.None;
             }
             _dataReader = new DataReader(device.InputStream);
             _dataWriter = new DataWriter(device.OutputStream);
    }

当我启用电源时,外设上会有一个红色的指示灯。当执行上面//*********这行代码时,指示灯会关闭。然后外设不会响应任何消息。当我停止程序时,指示灯会重新亮起。

我制作了一个完美运行的.NET Framework应用程序,它是完全功能的。我在其中使用了System.IO.Ports。我注意到了一些事情:

如果我只在.NET Framework应用程序中提取并运行此部分代码:

SerialPort comPort = new SerialPort();            
_ComPort.PortName = PortName;
_ComPort.BaudRate = BaudRate;
_ComPort.DataBits = 8;
_ComPort.Parity = Parity.None;
_ComPort.StopBits = StopBits.One;
_ComPort.DataReceived += new SerialDataReceivedEventHandler(_ComPort_DataReceived);
_ComPort.Open();

没有更多内容。

再次运行UWP应用程序,端口完美打开,灯变红,设备响应消息。我可以关闭设备,并从UWP应用程序初始化它任意多次。当我重新启动计算机时,我无法再次从UWP应用程序初始化设备(直到我从.NET Framework应用程序运行所述的代码块)。

如果您想知道,外围设备是Suzo Happ制造的钞票单元。

我在UWP中没有关于属性初始化方面的任何错误。


1
请查看以下链接:https://dev59.com/iFwY5IYBdhLWcg3w9rso - Eutherpy
@Eutherpy 谢谢,但我已经看到了。不过,对于查看此问题的某些人可能会有用。 - Shocky2
1
@Essigwurst 有详细信息或链接吗? - Eutherpy
@Shocky2,你能分享一下读取接收数据的代码吗?我遇到了相同或类似的症状(虽然我是基于产品和供应商ID选择SerialDevice),似乎在接收数据时字符串数据基本上无法识别预期的UTF8格式。 - SteakNinja
@SteakNinja 哇,那真是很久以前的事了... 我使用了 .NET 框架解决了这个问题。制作了一个应用程序,它是设备和主 UWP 应用程序之间的代理。如果你还感兴趣,我们可以交换联系方式。 - Shocky2
显示剩余2条评论
1个回答

1
我认为这与我正在遇到的问题相同。以下是原因和可能的解决方案:
UWP SerialDevice类目前仅允许设置“ReadTimeout”,在底层,它设置了实际串行设备的“ReadIntervalTimeout” (https://learn.microsoft.com/en-us/windows/desktop/api/winbase/ns-winbase-_commtimeouts)。有两个其他超时值会极大地影响读取操作的行为:1) ReadTotalTimeoutMultiplier和2) ReadTotalTimeoutConstant。
UWP SerialDevice类不允许用户设置这两个其他读取超时值,更糟糕的是,当串行设备被打开时,UWP SerialDevice类不会将这两个超时值设置为已知值。这意味着另外两个超时值将是串行驱动程序使用的任何默认值,或者更糟糕的是,无论另一个应用程序上次执行时某些串行端口应用程序设置这两个值为什么值。
这样做的总体效果是,你的UWP应用程序的串行设备读取行为是未定义的,并且不能可靠地使用。例如,如果这两个超时值设置了一种方式,那么读取操作可能会永远阻塞等待第一个字节的数据被读取,但是如果其他超时值以不同的方式设置,则读取操作可能立即返回,而根本没有读取任何数据。目前,UWP应用程序无法控制此行为,并且该行为将在不同的串行端口之间有所不同,甚至每次执行UWP应用程序时都可能不同。
UWP SerialDevice类需要做以下两点中的一点: 1)允许用户设置这两个其他读取超时值(首选),或者 2)当打开串行设备时将这两个其他超时值初始化为已知值。

哇,这是一个非常详细的答案。向你致敬。然而,我们目前还没有解决这个问题的方法。也许联系微软的某个人来解决这个问题是一个好主意。 - Shocky2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接