【问题标题】:Problems with serial device communication in UWPUWP 中的串行设备通信问题
【发布时间】:2018-08-21 17:46:54
【问题描述】:

我有一个特殊的问题。

我正在尝试与需要在 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 中的属性初始化方面没有犯任何错误。

【问题讨论】:

  • @Eutherpy 谢谢,但我已经看到了。不过,对于查看此问题的人来说可能很有用。
  • 嗯,我记得这里有一个关于uwp应用程序安全限制的话题..
  • @Essigwurst 有什么详细信息,可以链接吗?
  • @Shocky2 你能分享你的代码来读取接收到的数据吗?我面临相同或相似的症状(尽管我是根据产品和供应商 ID 选择 SerialDevice),并且似乎在收到预期的 UTF8 格式中基本上无法识别字符串数据。

标签: c# uwp serial-port


【解决方案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)当串口设备打开时,将另外两个超时值初始化为已知值。

【讨论】:

  • 哇,这是一个彻底的答案。向你致敬。尽管如此,我们所知道的这个问题仍然没有解决方案。也许就这个问题联系微软的人会是个好主意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-02
  • 1970-01-01
  • 1970-01-01
  • 2019-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多