Задача чтения на SerialDevice в Windows Iot Core - PullRequest
0 голосов
/ 16 мая 2019

Я пытаюсь написать Task, который будет работать до отмены, который будет считывать любые данные, полученные UART, и продолжать отправлять полученные данные через определенный event.Я хочу, чтобы цикл чтения считывался в течение 200 мс, прежде чем вернуться с любыми данными, которые он мог прочитать в этом временном интервале (включая, возможно, нулевые данные) или когда был прочитан полный буфер, в зависимости от того, что произойдет раньше;подавляющее большинство времени тайм-аут будет происходить первым.Я успешно отправил данные из UART, но мне не удалось получить какие-либо данные, хотя было подтверждено, что устройство получило данные по проводам.

SerialDevice device;

// Instantiate the SerialDevice.

device.ReadTimeout = new TimeSpan( 0, 0, 0, 0, 200 );
ReadDataCancellationTokenSource = new CancellationTokenSource();

const uint BufferSize_bytes = 50;

ReadDataTask = Task.Factory.StartNew( async () =>
{
    using( DataReader reader = new DataReader( device.InputStream ) )
    {
       reader.InputStreamOptions = InputStreamOptions.Partial;

       while( !ReadDataCancellationTokenSource.IsCancellationRequested )
       {
          uint dataRead = await reader.LoadAsync( BufferSize_bytes ).AsTask();

          if( dataRead > 0 )
          {
             IBuffer buffer = reader.ReadBuffer( dataRead );
             if( buffer.Length > 0 )
                PropogateReceivedData( ReadBuffer( buffer ) );
          }
       }
    }
}, ReadDataCancellationTokenSource.Token );

Вызов PropogateReceivedData( ReadBuffer( buffer ) ) читает все данные в буфере, а затем данные отправляются;известно, что это работает правильно.Элемент ReadDataCancellationTokenSource сохраняется для отключения Task при необходимости.

Учитывая трудности, с которыми я столкнулся, пытаясь получить этот подход, мне интересно, должен ли он работать или нет, что мне нужно делатьчтобы заставить его работать.

1 Ответ

1 голос
/ 17 мая 2019

Я успешно отправил данные из UART, но мне не удалось получать любые данные, даже если они были подтверждены полученным устройством данные на провод.

Я не уверен, как вы «подтвердили, что устройство получило данные по проводам». Если вы установите InputStreamOptions.Partial, так что даже если в проводе будет только один байт, эта строка await reader.LoadAsync( BufferSize_bytes ).AsTask(); вернет вас, вы получите этот один байт в буфере.

Также я понятия не имею, как вы обрабатываете полученные данные в PropogateReceivedData( ReadBuffer( buffer ) ), здесь я использую следующие строки для преобразования данных в строку и отображения в пользовательском интерфейсе, к которому вы можете обратиться:

                                var dataReader = DataReader.FromBuffer(buffer);
                                rcvdText.Text = dataReader.ReadString(buffer.Length);

Я предлагаю вам использовать reader.ReadString(dataRead);, если вы хотите получить строковые данные, и использовать reader.ReadBytes(readData);, если вы хотите получить поток байтов. Более поддерживаемые API вы можете обратиться к DataReader .

Учитывая трудности, с которыми я столкнулся, пытаясь получить такой подход, я мне интересно, должно ли это работать или нет, что мне нужно сделать, чтобы получить его на работу.

Да, ваша логика должна работать, кроме меня, тайм-аут чтения никогда не происходит. Можете ли вы подтвердить, что тайм-аут чтения работает для вас, когда вы установили device.ReadTimeout = new TimeSpan( 0, 0, 0, 0, 200 );? Есть ли информация о тайм-ауте?

Ниже приведены целые строки кода, которые я получаю из вашего вопроса для проверки, он работает для меня.

                device.ReadTimeout = new TimeSpan(0, 0, 0, 0, 200);
                var ReadDataCancellationTokenSource = new CancellationTokenSource();

                const uint BufferSize_bytes = 50;

                using (DataReader reader = new DataReader(device.InputStream))
                {
                    reader.InputStreamOptions = InputStreamOptions.Partial;

                    while (!ReadDataCancellationTokenSource.IsCancellationRequested)
                    {
                        uint dataRead = await reader.LoadAsync(BufferSize_bytes).AsTask();

                        if (dataRead > 0)
                        {
                            IBuffer buffer = reader.ReadBuffer(dataRead);
                            if (buffer.Length > 0)
                            {
                                //    rcvdText.Text = reader.ReadString(dataRead);

                                //    var readData = new Byte[dataRead];
                                //    reader.ReadBytes(readData);

                                var dataReader = DataReader.FromBuffer(buffer);
                                rcvdText.Text = dataReader.ReadString(buffer.Length);
                                status.Text = "bytes read successfully!";
                            }
                        }
                    }
                }

Официальный серийный образец , на который вы можете сослаться.

...