Serial port Windows UWP Windows.Devices.SerialCommunication.SerialDevice不工作

Serial port Windows UWP Windows.Devices.SerialCommunication.SerialDevice不工作,serial-port,uwp,Serial Port,Uwp,只是我,还是这只虫子 serialPort = await SerialDevice.FromIdAsync(Id); serialPort始终为空,即使Id不为空 我需要让它工作。目前,我正在编写非常“快速且肮脏”的代码,以测试来自Windows10通用应用程序的串行通信。我在x86和x64中调试,结果相同 这里是我现在的位置,但如果不创建serialPort,我就走不了多远 public class SerialComm { private SerialDevice

只是我,还是这只虫子

serialPort = await SerialDevice.FromIdAsync(Id);
serialPort
始终为空,即使
Id
不为空

我需要让它工作。目前,我正在编写非常“快速且肮脏”的代码,以测试来自Windows10通用应用程序的串行通信。我在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();
            }

感谢您的帮助和建议……

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

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

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

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

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

检查GitHub上的“官方”示例SerialSample,它也会这样做。这是在10.0.10240.0和Windows10版本10240中,这些文档都太粗制滥造了,没有一个合理的答案。我会随机猜测,因为没有显式的Open()方法,您无法获得一个,因为设备已经在使用中。或者你忘了在舱单上要求“串行通信”功能。谢谢你的回答,汉斯。我应该说我确实在清单中添加了这个功能。另外,请注意,在我的Microsoft制作和分发的示例中,相同的函数也给出了null,因此这不仅仅是我的代码。我猜,如果设备已经在使用中,将抛出一个异常,而不是返回null。。。(只是猜测…)我的FTDI设备也有同样的问题,包括我的代码和GitHub上的SerialSample。你找到解决方案了吗?答案很好,但为了未来谷歌的利益,如果你不
处理
SerialDevice
的一个实例,它将一直不可用,直到GC再次运行并表现出非常相似的症状。谢谢你的回答。它是一个USB到串行端口(Arduino)。在faat,问题是端口已经是busyn,但我也不知道如何实际打开它。按照arduino上串行通信的编程方式,端口打开后会立即发送欢迎消息,但我无法获取。一次只能有一个进程拥有该端口,因此如果该端口属于其他进程,则您的应用程序将无法打开它。这是出于设计……关于正在读取的欢迎字符串,您能告诉我以下内容吗:1。您使用的是哪个Arduino板(UNO R3、Leonardo等)?2.Arduino闪现了什么节目?i、 e.您能看到带有标准“闪烁”示例的欢迎屏幕吗?还是只在你的应用程序中出现?3.如果标准样品没有出现这种情况,您能否发送一份样品Arduino草图来重新处理问题?4.重置Arduino设备时,在Arduino IDE内运行“终端”时,您看到了什么?这与您在他们的程序中看到的相比如何?@PrashantHPhadke MSFT您在哪里看到“不允许板载串行端口”的声明?我也得到了空端口,但在上找不到该语句。我使用的是IPC,所以不能使用USB串行设备。有什么办法可以访问车载串行端口吗?你知道为什么它从IDASync一直没有完成吗?我也在那里等待,就像你一样,但它只是无限地运行。。。
            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);
                }
            }