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

标签 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 中的属性初始化方面没有犯任何错误。

最佳答案

我认为这与我遇到的问题相同。
我在这里重新发布了原因的描述和可能的解决方案:
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)当串口设备打开时,将另外两个超时值初始化为已知值。

关于c# - UWP 中串行设备通信的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49256707/

相关文章:

c# - 在 Nhibernate 中执行简单的过程调用

c# - 运行 System.Diagnostics 进程时如何在线程之间传递对象

c# - 如何在uwp中使用ssl证书

windows - Windows 7打开串口命令

Windows USB 端口 'address'

c# - 如何用 NUnit 单元测试比较复杂对象

c# - Azure 是否公开了 api 来支持在 azure 门户中创建资源?

c# - 我可以检查指南针传感器是否在 UWP 中校准了吗?

c# - x :Bind not binding to attached property

c++ - 使用 Objective-c 通过串行向 Arduino 发送颜色