【问题标题】:Connect to Arduino with UWP使用 UWP 连接到 Arduino
【发布时间】:2020-06-17 16:58:14
【问题描述】:

我正在尝试写入 Arduino Uno 设备,但 SerialDevice.FromIdAsync 始终返回 null。这是我的代码:

    DeviceInformationCollection devices = await DeviceInformation.FindAllAsync();

    foreach (DeviceInformation deviceInfo in devices)
    {
        if (deviceInfo.Name.IndexOf("Arduino") >= 0) {
            Debug.Log("Arduino found with id="+deviceInfo.Id);
            serialDevice = await SerialDevice.FromIdAsync(deviceInfo.Id);
            if (serialDevice == null) Debug.Log("it's null");
            break;
        }
    }

运行此代码给我“Arduino found with id=\\?USB#VID_2341&PID_0001#55....”然后“它是空的”

在我的最大能力中,我有以下功能:

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

【问题讨论】:

    标签: uwp arduino serial-port usb usbserial


    【解决方案1】:

    使用 UWP 连接到 Arduino

    要获取SerialDevice,我们建议使用SerialDevice.GetDeviceSelector() 获取deviceSelector,并使用以下内容创建SerialDevice 观察者。我们提供了code sample,您可以直接参考。我已经测试过,它在我这边工作,该应用程序可以列出带有 USB\VID_2341&PID_0043\xxxxx 设备 ID 的 Arduino Uno 设备。

    var deviceWatcher = DeviceInformation.CreateWatcher(deviceSelector);
    

    【讨论】:

    • 谢谢,我会尝试使用这个方法。我下载了示例代码,但它无法为 ARM64 编译,所以我无法对其进行测试。
    • 如果你在arm平台上运行应用,请将目标版本降低到15063。
    • 我正在尝试在仅运行 arm64 的 HoloLens 2 上运行代码。示例代码在 arm 上编译得很好,但在 arm64 上编译得不好。
    • 你检查过这个blog吗?
    • 请将runtime.win10-arm64-aot.Microsoft.NETCore.UniversalWindowsPlatform nuget 包添加到nuget 包列表以成功恢复。
    【解决方案2】:

    Microsoft 提供了几个简单的示例,用于与通过 USB 电缆连接的 Arduino 进行通信。

    第一个是 https://github.com/microsoft/Windows-universal-samples/tree/master/Samples/SerialArduino 的 C# 示例

    第二个包含 C# 和 C++ UWP 示例,位于 https://github.com/microsoft/Windows-iotcore-samples/tree/develop/Samples/SerialUART

    我使用了 SerialUART 示例中的 C++ UWP 示例,它在 Visual Studio 2017 和 Arduino Uno 上运行良好。

    这是我使用的程序。

    我使用 USB 电缆将 Arduino 连接到 Windows 10 笔记本电脑。我检查了设备管理器,发现当我插入已经插入 Arduino USB 连接器的 USB 电缆时,创建了一个 USB 串行端口,在我的例子中是 COM3。

    我打开了 Arduino IDE 并克隆了示例 Blinky LED 项目,该项目使 Arduino 板上的内置 LED 闪烁。我刚好有这个草图,很容易修改。

    我添加了 SoftwareSerial.h 包含指令并使用 Serial 类在 setup() (Serial.begin(9600);) 中初始化串行连接,然后在 loop() 我创建了一个全局 static unsigned long ulCounter; 然后使用(Serial.print("line "); Serial.print(ulCounter); Serial.print("\n"); ulCounter++;) 以便我可以看到循环正在工作并且计数器正在递增。

    我编译了草图,下载了它,然后在 Arduino IDE 中打开了串行监视器工具,以确保打印语句正常工作并且计数器递增。然后我关闭了串行监视器窗口,以便为另一个应用程序释放串行端口。

    接下来我克隆了 SerialUART 文件夹,导航到 C++ 文件夹,打开解决方案文件,然后重新编译。我确实必须在属性中更改目标 Windows 版本。

    然后我在调试器中运行编译后的应用程序,它运行良好。似乎该行文本覆盖了文本框中已经存在的任何内容,这就是为什么使用计数器很有帮助的原因。 USB 的 VID 显示在示例应用程序窗口中。

    经验教训

    当Arduino通过USB线连接到USB端口时,在Windows 10下会创建一个分配了COM号的USB串口。

    一次只有一个应用程序可以访问 USB 串行端口。串行监视器和编译的示例应用程序不能同时在同一个 USB 串行端口上使用。

    Arduino IDE 的串行监视器可用于检查 Arduino 的输出是否正在打印。在文本中有一个递增的计数器可以更容易地知道循环正在工作。

    【讨论】:

      猜你喜欢
      • 2017-05-13
      • 1970-01-01
      • 2016-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 2014-08-06
      相关资源
      最近更新 更多