【问题标题】:Windows UWP Windows.Devices.SerialCommunication.SerialDevice Not workingWindows UWP Windows.Devices.SerialCommunication.SerialDevice 不工作
【发布时间】:2015-11-08 12:47:34
【问题描述】:

只有我一个人,还是这是一个错误?

serialPort = await SerialDevice.FromIdAsync(Id);

serialPort 始终为 null,即使 Id 不是。

我需要让这个工作。现在我只是在编写非常“快速而肮脏”的代码来测试来自 Windows 10 通用应用程序的串行通信。我在 x86 和 x64 中都进行了调试,结果相同。

这是我现在所处的位置,但是如果不创建 serialPort,我就不能走太远......

public class SerialComm
    {
        private SerialDevice serialPort;
        DataWriter dataWriteObject = null;
        DataReader dataReaderObject = null;

        public async void StartTest()
        {

            var deviceSelector = SerialDevice.GetDeviceSelector("COM3");
            var myDevices = await Windows.Devices.Enumeration.DeviceInformation.FindAllAsync(deviceSelector);
            var myCurrentDevice = myDevices[0];
            string Id = myCurrentDevice.Id.ToString();

            try
            {
                serialPort = await SerialDevice.FromIdAsync(Id);
            }
            catch (Exception)
            {

                throw;
            }

            StringBuilder commandBuilder = new StringBuilder();

            while (true)
            {
                var rBuffer = (new byte[1]).AsBuffer();
                await serialPort.InputStream.ReadAsync(rBuffer, 1, InputStreamOptions.Partial);

                if ((char)rBuffer.ToArray()[0] != '\n')
                {
                    commandBuilder.Append((char)rBuffer.ToArray()[0]);
                }
                else
                {
                    string temp = "";

                    try
                    {
                        temp += rBuffer.ToString();
                    }
                    catch (Exception)
                    {
                        temp = "Error";
                    }

                    commandBuilder.Append(temp);
                }

                string stringToDisplay = commandBuilder.ToString();
            }

感谢您的帮助和建议......

【问题讨论】:

  • 检查在 GitHub 上找到的“官方”示例 SerialSample,它的作用相同。这是 10.0.10240.0 和 Windows 10 版本 10240
  • 文档太粗制滥造,无法提供明智的答案。我会随机猜测,由于没有明确的 Open() 方法,因此您无法获得一个,因为该设备已在使用中。或者您忘记在清单中要求“串行通信”功能。
  • 感谢您的回答,汉斯。我应该说我确实在清单中添加了该功能。另请注意,相同的函数在我的 Microsoft 制作和分发的示例中也给出了 null,所以它不仅仅是我的代码。我猜想,如果设备已经在使用中,就会抛出异常,而不是返回 null ......(只是猜测......)
  • 我在使用 FTDI 设备时遇到了同样的问题,无论是我的代码还是 GitHub 上的 SerialSample。你找到解决方案了吗?
  • 很好的答案,但是为了未来的 googlers 的利益,如果您不使用 DisposeSerialDevice 实例,它将一直不可用,直到 GC 再次运行并且会表现出非常相似的症状.

标签: serial-port uwp


【解决方案1】:

我在使用 FTDI 芯片进行 USB 到串行通信的 Maxbotix 传感器上遇到了同样的问题。我可以在终端程序中很好地连接到设备,并且可以从真正的 .NET Framework 的SerialPort 类中使用它,但是在来自 GitHub 的 UWP SerialSample 和我的代码中,SerialDevice.FromIdAsync() 返回了null

对我来说,解决方案分为两部分。

第一部分是在Package.appxmanifest文件中添加设备能力:

<DeviceCapability Name="serialcommunication">
  <Device Id="any">
    <Function Type="name:serialPort" />
  </Device>
</DeviceCapability>

第二部分是从FTDI Web site 下载更新的驱动程序(我使用的是 2.12.06 版)。我一这样做,它就开始工作了。

下面的完整示例:

            var aqsFilter = SerialDevice.GetDeviceSelector("COM3");
            var devices = await DeviceInformation.FindAllAsync(aqsFilter);
            if (devices.Any())
            {
                var deviceId = devices.First().Id;
                this.device = await SerialDevice.FromIdAsync(deviceId);

                if (this.device != null)
                {
                    this.device.BaudRate = 57600;
                    this.device.StopBits = SerialStopBitCount.One;
                    this.device.DataBits = 8;
                    this.device.Parity = SerialParity.None;
                    this.device.Handshake = SerialHandshake.None;

                    this.reader = new DataReader(this.device.InputStream);
                }
            }

【讨论】:

  • 你知道为什么它永远不会为我完成 FromIdAsync 吗?我也在那里等待,就像你一样,但它只是无限运行......
【解决方案2】:

如果您尝试打开的“COM3”串行端口是板载串行端口,则串行通信类的当前设计不允许访问板载串行端口。 Serial Communication 类仅支持 USB-To-Serial 通信,不支持直接串行通信。在上面的代码中,myDevices[0].Port.Name 的值是多少?

【讨论】:

  • 感谢您的回答 Prashant。它是一个 USB 转串口 (Arduino)。问题是端口已经很忙,而且我不确定如何实际打开它。在 arduino 上对串行通信进行编程的方式,它会在端口打开后立即发送欢迎消息,但我无法得到它。
  • 一次只能有一个进程拥有该端口,因此如果它被其他进程拥有,那么您的应用将无法打开它。这是设计使然...
  • 关于正在读取的欢迎字符串,您能否告诉我以下内容: 1. 您使用的是哪个 Arduino 板(UNO R3、Leonardo 等)? 2. Arduino 刷的是什么程序?即您能看到带有标准“闪烁”示例的欢迎屏幕吗?或者它只发生在您的应用程序中? 3. 如果标准样品没有出现这种情况,您能否发送一个可以重现该问题的 Arduino 草图示例? 4. 重置 Arduino 设备时,在 Arduino IDE 中运行“终端”会看到什么?这与您在他们的计划中看到的相比如何?
  • @PrashantHPhadke-MSFT 您在哪里看到“不允许板载串行端口”的声明?我也有空端口,但我在Microsoft dev center 上找不到该声明。我正在使用 IPC ,因此不能选择使用 USB 串行设备。访问板载串行端口的任何解决方法?
猜你喜欢
  • 2016-03-17
  • 1970-01-01
  • 1970-01-01
  • 2018-11-04
  • 1970-01-01
  • 1970-01-01
  • 2019-09-05
  • 2016-03-23
  • 1970-01-01
相关资源
最近更新 更多