web-dev-qa-db-ja.com

Windows UWPWindows.Devices.SerialCommunication.SerialDeviceが機能していません

それは私だけですか、それともこれはバグですか?

serialPort = await SerialDevice.FromIdAsync(Id);

serialPortは常にnullですが、Idはnullではありません。

これを機能させる必要があります。今のところ、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();
            }

あなたの助けとアドバイスをありがとう....

11
BernardG

USBからシリアルへの通信にFTDIチップを使用していたMaxbotixセンサーでも同じ問題が発生しました。ターミナルプログラムでデバイスに正常に接続でき、実際の.NETFrameworkのSerialPortクラスから使用できましたが、GitHubのUWPSerialSampleと私のコードの両方でSerialDevice.FromIdAsync()nullを返しました。

私にとって、解決策は2つの部分に分かれていました。

最初の部分は、Package.appxmanifestファイルにデバイス機能を追加することでした。

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

2番目の部分は、更新されたドライバー(バージョン2.12.06を使用)を FTDI Webサイト からダウンロードすることでした。私がこれをするとすぐに、それは働き始めました。

以下の完全なサンプル:

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

開こうとしている「COM3」シリアルポートがオンボードシリアルポートである場合、シリアル通信クラスの現在の設計では、オンボードシリアルポートにアクセスできません。シリアル通信クラスは、USBからシリアルへの通信のみをサポートし、直接シリアル通信はサポートしません。上記のコードでは、myDevices [0] .Port.Nameの値は何ですか?