我正在Minnowboard Turbot的Windows 10 IoT核心版上运行IoT Edge模块。该模块需要从USB端口读取流。我们正在使用System.Io.Ports(与.net core 2.1代码兼容的.net标准版本)。
我已经在装有Windows 10专业版的笔记本电脑上看到了这项工作,但是它不适用于Windows IoT核心版。我发现一些资料表明IoT核心版不支持System.Io.Ports,这是因为USB端口的命名方案(必须将其命名为COM {x}才能使SerialPort正常工作。SerialIOPrts示例随附的自述文件Windows IoT样本(https://go.microsoft.com/fwlink/?linkid=860459)中的
“此示例使用标准的.NET Core System.IO.Ports API访问串行设备。这些API仅与名为COM {x}的串行设备一起使用。因此,此方法与Windows 10 IoT Enterprise相关,但不是Windows 10 IoT Core。”
有人找到解决这个问题的方法吗?我可能可以在Windows 10 IoT Enterprise上运行它,但我真的想证明我们可以在最少的硬件/操作系统上运行此模块。
答案 0 :(得分:0)
使用Windows IoT核心版上的System.IO.Ports,您可以参考“ SerialWin32 Azure IoT Edge module”。 (注意:这些说明将在运行Windows 10 IoT Enterprise或Windows IoT Core内部版本17763的PC上运行。当前仅支持 x64 体系结构。将来会出现Arm32 )
(不适用于Azure IoT Edge模块)要访问Windows IoT Core上没有端口名称(COMx)的串行设备,可以使用Win32 API CreateFile。有一个项目模板可用于为Windows IoT核心版创建Win32控制台应用程序。
在这里,我使用设备ID创建示例以打开串行设备并进行读写:
#include <windows.h>
#include <iostream>
using namespace std;
int main()
{
DWORD errCode = 0;
LPCWSTR pDeviceId = L"\\\\?\\FTDIBUS#VID_0403+PID_6001+A50285BIA#0000#{86e0d1e0-8089-11d0-9ce4-08003e301f73}";
HANDLE serialDeviceHdl = CreateFile(pDeviceId, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
if (!serialDeviceHdl)
{
errCode = GetLastError();
cout << "Open device failed. Error code: " << errCode << endl;
return 0;
}
DWORD writenSize = 0;
BOOL result = WriteFile(serialDeviceHdl, "hello", 5, &writenSize, NULL);
if (FALSE == result)
{
errCode = GetLastError();
cout << "Write to device failed. Error code: " << errCode << endl;
}
CHAR readBuf[5];
DWORD readSize = 0;
result = ReadFile(serialDeviceHdl, readBuf, 5, &readSize, NULL);
if (FALSE == result)
{
errCode = GetLastError();
cout << "Read from device failed. Error code: " << errCode << endl;
}
}
例如,您可以通过官方示例“ SerialUART”-“ DeviceInformation.Id”找到设备ID。
如何在Windows IoT核心版上部署和调试win32 C ++控制台,您可以参考here。