DataReader не возвращает данные из входного потока в последовательной связи - PullRequest
0 голосов
/ 14 июня 2019

Я успешно подключил свой RFID-ридер и открыл порт, и он работает, я также записал в него байты с помощью класса DataWriter.Но теперь при попытке чтения байтов из RFID-ридера это не работает.PS: я пытаюсь добиться этого в приложении UWP, используя MVVM Pattern.и он работал в классическом приложении, поэтому все конфигурации правильные.

И это мой VMClass

        DataWriter dataWriter;
        //readobjects
        private CancellationTokenSource ReadCancellationTokenSource;
        private Object ReadCancelLock = new Object();
        //writeObjects
        private CancellationTokenSource WriteCancellationTokenSource;
        private Object WriteCancelLock = new Object();
        DataReader DataReaderObject;
        int id1;
        public viewModel()
        {
            // listOfDevices = new ObservableCollection<DeviceListEntry>();
            findAndOpenAsync();
        }
        public async Task findAndOpenAsync()
        {
            string selector = SerialDevice.GetDeviceSelector("COM5");
            DeviceInformationCollection devices = await DeviceInformation.FindAllAsync(selector);
            if (devices.Count > 0)
            {
                DeviceInformation deviceInfo = devices[0];
                serialDevice = await SerialDevice.FromIdAsync(deviceInfo.Id);

                serialDevice.BaudRate = 9600;
                serialDevice.DataBits = 8;
                serialDevice.StopBits = SerialStopBitCount.One;
                serialDevice.Parity = SerialParity.None;
                WriteCancellationTokenSource = new CancellationTokenSource();
                ReadCancellationTokenSource = new CancellationTokenSource();
                serialDevice.WriteTimeout = new TimeSpan(0, 0, 10);

                    await Write(WriteCancellationTokenSource.Token);
                int id2 = id1;


            }
            else
            {
                MessageDialog popup = new MessageDialog("Sorry, no device found.");
                await popup.ShowAsync();
            }
        }

        public async Task Write(CancellationToken cancellationToken)
        {
            try
            {
                while (!Recived)
                {
                    Task<UInt32> storeAsyncTask;
                    dataWriter = new DataWriter(serialDevice.OutputStream);

                    byte[] buffer = new byte[9];
                    buffer[0] = 0x7e; //head fixed 7eh
                    buffer[1] = 0x04; //length 4
                    buffer[2] = 0x01; //destination 
                    buffer[3] = 0x13; //function code
                    buffer[4] = 0xed; // destination xor function 
                    buffer[5] = 0x01; // sum (destination+function+xor)modulo256 

                    dataWriter.WriteBytes(buffer);


                    // uint a= await dataWriter.StoreAsync();

                    lock (WriteCancelLock)
                    {
                        cancellationToken.ThrowIfCancellationRequested();

                        storeAsyncTask = dataWriter.StoreAsync().AsTask(cancellationToken);

                    }
                    UInt32 bytesWritten = await storeAsyncTask;
                    dataWriter.DetachStream();

                    dataWriter.Dispose();

                    if (bytesWritten > 0)
                    {
                        DataReaderObject = new DataReader(serialDevice.InputStream);

                        await Read(ReadCancellationTokenSource.Token);


                    }
                }
            }
            catch (Exception ex) {
            }

        }

        private async Task Read(CancellationToken cancellationToken)
        {
            byte[] bufferRead = new byte[12];

                Task<UInt32> loadAsyncTask;

                uint ReadBufferLength = 1024;

                // Don't start any IO if we canceled the task



                lock (ReadCancelLock)
                {
                    cancellationToken.ThrowIfCancellationRequested();

                    DataReaderObject.InputStreamOptions = InputStreamOptions.Partial;
                    loadAsyncTask = DataReaderObject.LoadAsync(ReadBufferLength).AsTask(cancellationToken);
                }


                UInt32 bytesRead = await loadAsyncTask;

                if (bytesRead > 0)
                {
                try
                {
                    DataReaderObject.ReadBytes(bufferRead);
                    byte[] idBytes = new byte[4];
                    idBytes[0] = bufferRead[8];
                    idBytes[1] = bufferRead[7];
                    idBytes[2] = bufferRead[6];
                    idBytes[3] = bufferRead[5];
                    id1 = BitConverter.ToUInt16(idBytes, 0);
                    Recived = true;
                }
                catch (Exception ec)
                {

                }
                finally
                {
                    DataReaderObject.DetachStream();
                    DataReaderObject.DetachBuffer();
                    DataReaderObject.Dispose();

                }

            }



        }

        }

1 Ответ

0 голосов
/ 17 июня 2019

Я проверяю ваш код и получаю следующее исключение в этой строке: DataReaderObject.ReadBytes(bufferRead);

WinRT information: The operation attempted to access data outside the valid range

Пожалуйста, используйте это:

        if (bytesRead > 0)
        {
            try
            {
                byte[] bufferRead = new byte[bytesRead];
                DataReaderObject.ReadBytes(bufferRead);

Вместо

byte[] bufferRead = new byte[12];
...