C# UWP中的串行设备通信问题

C# UWP中的串行设备通信问题,c#,uwp,serial-port,C#,Uwp,Serial Port,我有一个特殊的问题 我试图与一个需要在UWP项目中进行串行通信的外围设备进行通信。我正在使用Windows.Devices.SerialCommunication 为了演示,我制作了一个新页面,它有两个按钮,两个不同的点击处理程序。一个用于打开端口,另一个用于向外围设备发送消息 一个处理程序是: SerialDevice device; private async void Button_Click_1(object sender, RoutedEventArgs e)

我有一个特殊的问题

我试图与一个需要在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);
    }
当我打开电源时,外围设备上有一个红灯。当执行//*******上面的行时,灯关闭。当时外设没有响应任何消息。当我停止程序时,灯又亮了

我制作了一个.NETFramework应用程序,它工作得非常好。它功能齐全。我在那里使用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中的属性初始化,我没有犯任何错误

我想这和我的问题是一样的。 我在这里再次说明原因和可能的解决方案:

UWP SerialDevice类目前只允许您设置“ReadTimeout”,它在引擎盖下设置实际串行设备()的“ReadIntervalTimeout”。还有两个其他超时值会显著影响读取操作行为:1)ReadTotalTimeOut乘数和2)ReadTotalTimeoutConstant

UWP SerialDevice类不允许用户设置这两个其他读取超时值,更糟糕的是,当串行设备打开时,UWP SerialDevice类不将这两个其他超时值设置为已知值。这意味着另外两个超时值将是串行驱动程序使用的默认值,或者更糟糕的是,是某个串行端口应用程序在上次执行另一个应用程序时设置这两个值的值

这样做的总体效果是UWP应用程序的串行设备读取行为未定义,无法可靠地使用。例如,如果这两个其他超时值恰好设置为一种方式,则读取操作可能会永远阻止等待要读取的数据的第一个字节,但如果其他超时值恰好设置为另一种方式,则读取操作可能会立即返回,而根本不读取数据。目前,UWP应用程序无法控制此行为,不同串行端口的行为将不同,甚至可能在每次执行UWP应用程序时都不同

UWP SerialDevice类需要

1) 允许用户设置这两个其他读取超时值(首选),或
2) 当串行设备打开时,将这两个其他超时值初始化为已知值。

查看@Eutherpy谢谢,但我已经看到了。尽管如此,对于研究这个问题的人来说可能还是有用的。嗯,我记得这里有一个关于uwp应用程序安全限制的主题。@EssigHurst任何详细信息,链接可能吗?@Shocky2你能分享你读取接收数据的代码吗?我面临着相同或类似的症状(尽管我根据产品和供应商ID选择SerialDevice),而且似乎在收到时,字符串数据基本上没有在预期的UTF8格式内被识别。哇,这是一个彻底的答案。谢谢你。尽管如此,据我们所知,这个问题仍然没有解决办法。也许就这个问题联系微软的人会是个好主意。