2016-09-09 3 views
0

Я новичок в разработке программного обеспечения для Windows IOT. У меня есть информация о .Net 3.5 и 4. Когда я начинаю разрабатывать для Win IOT, я видел, что многое изменилось. Есть много новых слов async, wait, Task и т. Д.Разработка приложения Bluetooth для малины Pi3 на Win IOT

Теперь я хочу читать и записывать данные с Bluetooth. Я могу это сделать, но если я пытаюсь писать и читать данные в бесконечном цикле, он генерирует исключения.

У меня есть 2 функции

Read:

private async Task ReadAsync(CancellationToken cancellationToken) 
    { 
     uint ReadBufferLength = 1024; 

     Task<UInt32> loadAsyncTask; 

     // If task cancellation was requested, comply 
     cancellationToken.ThrowIfCancellationRequested(); 

     // Set InputStreamOptions to complete the asynchronous read operation when one or more bytes is available 
     dataReaderObject.InputStreamOptions = InputStreamOptions.Partial; 

     // Create a task object to wait for data on the serialPort.InputStream 
     loadAsyncTask = dataReaderObject.LoadAsync(ReadBufferLength).AsTask(cancellationToken); 

     // Launch the task and wait 
     UInt32 bytesRead = await loadAsyncTask; 
     if (bytesRead > 0) 
     { 
      receivedData = dataReaderObject.ReadString(bytesRead); 
     } 
     else 
     { 
      receivedData = ""; 
     } 
    } 

Запись:

private async Task SendData(string data) 
    { 
     if (deviceService != null) 
     { 
      //send data 
      if (string.IsNullOrEmpty(data)) 
      { 
       uiTxtError.Text = "Please specify the string you are going to send"; 
      } 
      else 
      { 
       //DataWriter dwriter = new DataWriter(streamSocket.OutputStream);    
       UInt32 len = dwriter.MeasureString(data); 
       dwriter.WriteUInt32(len); 
       dwriter.WriteString(data); 
       await dwriter.StoreAsync(); 
       await dwriter.FlushAsync(); 


      } 

     } 
     else 
     { 
      uiTxtError.Text = "Bluetooth is not connected correctly!"; 
     } 
    } 

Функция, которые используют чтение и запись.

 await SendData("010C" + Environment.NewLine); 
     await ReadAsync(ReadCancellationTokenSource.Token); 


     if (!string.IsNullOrEmpty(receivedData)) 
     { 
      string[] splitted = receivedData.Replace("\r", "").Replace(">", "").Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); 
      int a = 0; 
      int b = 0; 
      if (int.TryParse(splitted[splitted.Length - 1], System.Globalization.NumberStyles.HexNumber, null as IFormatProvider, out b)) 
      { 

       if(int.TryParse(splitted[splitted.Length - 2], System.Globalization.NumberStyles.HexNumber, null as IFormatProvider, out a)) 
       { 
        uiGaugeRpm.Value = ((a * 256) + b)/4; 
       } 

      } 

      receivedData = ""; 

     } 

Я вызываю функцию выше в бесконечном цикле с задержками 200 мс (Task.Delay (200)).

После того, как цикл начинается, он получает данные true и fine, но через несколько циклов он выдает исключения.

Если я создаю объект DataWriter в функции записи, он выдает необработанное исключение и останавливает приложение. Я решаю это, создавая этот объект только один раз после подключения. Теперь я получаю новое исключение.

loadAsyncTask = dataReaderObject.LoadAsync (ReadBufferLength) .AsTask (cancelationToken);

В этой строке я получаю ObjectDisposedException, я наблюдал за объектами, но я не мог видеть ничего расположенного.

Я подключаюсь к устройству Bluetooth ELM327 с протоколом rfcomm. Я новичок в разработке для Win IOT.

Также я не мог использовать привязки с асинхронными функциями.

Пожалуйста, помогите мне?

+0

Исключение кажется довольно ясно меня. Вы пытаетесь использовать объект, который был удален. Если вам нужна помощь здесь, вам нужно предоставить хороший [mcve], который надежно воспроизводит проблему. См. Также [ask] информацию о том, как представить свой вопрос ясным, ответным образом. –

ответ

0

Да, к сожалению, это все о задачах сейчас. Реализация Threading недоступна в структуре UWP. Только Core.

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

Например:

DispatcherTimer receiveTimer; 
DispatcherTimer senderTimer; 

//class MainPage : Page ... etc ... 


private async Task SetupAsync() 
{ 
    this.bluetoothApp = await Bluetooth.CreateAsync(); 

    this.receiveTimer = new DispatcherTimer(); 
    this.receiveTimer.Interval = TimeSpan.FromMilliseconds(1000); 
    this.receiveTimer.Tick += this.ReceiveTimer_Tick; 
    this.receiveTimer.Start(); 

    this.senderTimer = new DispatcherTimer(); 
    this.senderTimer.Interval = TimeSpan.FromMilliseconds(1000); 
    this.senderTimer.Tick += this.SenderTimer_Tick; 
    this.senderTimer.Start(); 
} 

Тогда несколько методов для каждого тикер:

private void ReceiveTimer_Tick(object sender, object e) 
{ 
    //Receive stuff 
} 


private void SenderTimer_Tick(object sender, object e) 
{ 
    //Send stuff 
} 

Наконец добавить, что к главной странице:

private async void Page_Loaded(object sender, RoutedEventArgs e) 
{ 
    await SetupAsync(); 
} 
+0

Я пробую одно приложение на своем компьютере. Я разработал фиктивное приложение elm327. Он отправляет данные скорости, об/мин и температуры. У меня есть модуль Bluetooth.Я подключаю его TTL-сторону с чипом FTDI и bluetooth с Bluetooth. Сторона TTL отправляет данные для команд. То же самое происходит на моем компьютере. Сначала несколько секунд, мое приложение получает данные и показывает их на датчиках. Позже возникает System.ObjectDisposedException. Я не мог понять, почему это происходит. – MIrchhh

+0

Я нахожу строку, в которой происходит исключение. после вызова функции DataReader.LoadAsync это исключение. Я нахожу http://stackoverflow.com/questions/16110561/winrt-datareader-loadasync-exception-with-streamsocket-tcp, но это решение не решает мою проблему. – MIrchhh

Смежные вопросы