UWP中的串行设备通信问题

时间:2018-03-13 12:51:21

标签: c# uwp serial-port

我有一个特殊的问题。

我正在尝试与需要在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中对属性初始化做任何错误。

1 个答案:

答案 0 :(得分:1)

我认为这与我遇到的问题相同。 我在此处重新发布了原因描述和可能的解决方案:

UWP SerialDevice 类目前只允许您设置“ReadTimeout”,它在幕后设置实际串行设备的“ReadIntervalTimeout”(https://docs.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)当串口设备打开时,将另外两个超时值初始化为已知值。