UWP 中的串行设备通信问题

2024-04-15

我有一个特殊的问题。

我正在尝试与 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 制造的 Bill to Bill 装置。

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


我认为这和我遇到的问题是一样的。 我在这里重新发布原因的描述和可能的解决方案:

UWP SerialDevice 类当前仅允许您设置“ReadTimeout”,它在幕后设置实际串行设备的“ReadIntervalTimeout”(https://learn.microsoft.com/en-us/windows/desktop/api/winbase/ns-winbase-_commtimeouts 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)当串口设备打开时,将另外两个超时值初始化为已知值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UWP 中的串行设备通信问题 的相关文章

随机推荐