Windows UWP Windows.Devices.SerialCommunication.SerialDevice Не работает

Это только у меня или это баг?

serialPort = await SerialDevice.FromIdAsync(Id);

serialPort всегда равно нулю, даже если Id нет.

Мне нужно, чтобы это работало. На данный момент я просто пишу очень «быстрый и грязный» код для тестирования последовательной связи из универсального приложения Windows 10. Я отлаживал как x86, так и x64 с тем же результатом.

Вот где я сейчас, но я не могу далеко уйти без создания серийного порта....

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();
            }

Спасибо за помощь и советы....


person BernardG    schedule 15.08.2015    source источник
comment
Проверка официального образца SerialSample, найденного на GitHub, делает то же самое. Это с 10.0.10240.0 и Windows 10 версии 10240.   -  person BernardG    schedule 15.08.2015
comment
Документы слишком дрянные, чтобы дать обоснованный ответ. Я случайным образом предположу, что, поскольку явного метода Open() нет, вы не можете его получить, потому что устройство уже используется. Или вы забыли указать возможность последовательной связи в манифесте.   -  person Hans Passant    schedule 15.08.2015
comment
Спасибо за ответ, Ганс. Я должен был сказать, что ДЕЙСТВИТЕЛЬНО добавил эту возможность в манифест. Также обратите внимание, что та же функция также дает null в образце, созданном и распространенном моей Microsoft, так что это не только мой код. Я предполагаю, что если бы устройство уже использовалось, было бы выброшено исключение, а не возвращен нуль... (просто предположение..)   -  person BernardG    schedule 15.08.2015
comment
У меня такая же проблема с устройством FTDI, как с моим кодом, так и с SerialSample на GitHub. Вы когда-нибудь находили решение?   -  person Nicholas Piasecki    schedule 08.09.2015
comment
Отличный ответ, но для будущих пользователей Google: если вы не Dispose экземпляра SerialDevice, он останется недоступным до тех пор, пока GC снова не запустится и не проявит очень похожие симптомы.   -  person RubberDuck    schedule 24.06.2016


Ответы (2)


У меня была такая же проблема с датчиком Maxbotix, который использовал чип FTDI для связи USB-последовательный порт. Я мог нормально подключиться к устройству в программе терминала, и я мог использовать его из реального класса .NET Framework SerialPort, но как в UWP SerialSample из GitHub, так и в моем коде SerialDevice.FromIdAsync() возвращал null.

Для меня решение состояло из двух частей.

Первая часть заключалась в том, чтобы добавить возможности устройства в файл Package.appxmanifest:

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

Вторая часть заключалась в загрузке обновленного драйвера (я использовал версию 2.12.06) с веб-сайта FTDI. Как только я это сделал, он начал работать.

Полный образец ниже:

            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);
                }
            }
person Nicholas Piasecki    schedule 08.09.2015
comment
У вас есть идеи, почему у меня никогда не заканчивается FromIdAsync? Я тоже жду там, как и ты, но он просто бежит бесконечно... - person Exa; 06.05.2017

Если последовательный порт COM3, который вы пытаетесь открыть, является встроенным последовательным портом, то текущий дизайн класса последовательной связи не позволяет получить доступ к встроенным последовательным портам. Класс последовательной связи поддерживает только связь USB-To-Serial, а не прямую последовательную связь. Каково значение myDevices[0].Port.Name в приведенном выше коде?

person Prashant H Phadke - MSFT    schedule 17.08.2015
comment
Спасибо за ваш ответ, Прашант. Это USB-последовательный порт (Arduino). На самом деле проблема заключалась в том, что порт уже был занят, но также и в том, что я не уверен, как его открыть. способ последовательной связи запрограммирован на Arduino, он отправляет приветственное сообщение, как только порт открывается, но я не могу его получить. - person BernardG; 18.08.2015
comment
Одновременно только один процесс может иметь порт, поэтому, если он принадлежит какому-то другому процессу, ваше приложение не сможет его открыть. Это по дизайну... - person Prashant H Phadke - MSFT; 18.08.2015
comment
Что касается читаемой строки приветствия, можете ли вы сказать мне следующее: 1. Какую плату Arduino вы используете (UNO R3, Leonardo и т. д.)? 2. Какой программой был прошит Arduino? т. е. вы видите экран приветствия со стандартным образцом «мигания»? Или это происходит только с вашим приложением? 3. Если это не происходит со стандартным образцом, можете ли вы отправить образец эскиза Arduino, который воспроизводит проблему? 4. Что вы видите, когда запускаете «Терминал» внутри Arduino IDE при перезагрузке устройства Arduino? Как это соотносится с тем, что вы видите в их программе? - person Prashant H Phadke - MSFT; 18.08.2015
comment
@PrashantHPhadke-MSFT Где вы увидели, что утверждение не разрешает встроенные последовательные порты? У меня тоже нулевой порт, но я не могу найти этот оператор на Центр разработки Майкрософт. Я использую IPC, поэтому использовать USB-Serial Device нельзя. Любое обходное решение для доступа к встроенному последовательному порту? - person joe; 25.01.2018