2017-03-14 6 views
0

Ich stieß auf ein wirklich seltsames Problem, als ich versuchte, meinen Raspberry Pi über Serial (usb) mit meinem Arduino Uno zu verbinden.SerialDevice.FromIdAsync() gibt null zurück

serialPort = await SerialDevice.FromIdAsync(myDevices[0].Id); 

Gibt immer null zurück. Ich habe viele Dinge ausprobiert und es wird nicht, bis ich es in eine Schleife und dann funktioniert es das zweite Mal. Also entfernte ich die Schleife und ließ sie 2 Mal laufen.

Das ist mein Ausgang

begintest 
testrange 
\\?\USB#VID_2341&PID_0001#55639313633351210252#{86e0d1e0-8089-11d0-9ce4-08003e301f73} 
test1 
null 
begintest 
ok 
ok2 
debugtest2 
gelukt 
Opened device for communication. 
test 
test2 

Und hier mein Code

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Net.Http; 
using Windows.ApplicationModel.Background; 
using Windows.Devices.Enumeration; 
using Windows.Devices.SerialCommunication; 
using System.Diagnostics; 

namespace BackgroundApplication2 
{ 
    public sealed class StartupTask : IBackgroundTask 
    { 
     private SerialDevice serialPort = null; 
     public void Run(IBackgroundTaskInstance taskInstance) 
     { 
      FindDevice(); 
      Debug.WriteLine("test1"); 

      if (serialPort == null) 
      { 
       Debug.WriteLine("null"); 
      } 
      FindDevice(); 
     } 


     private async void FindDevice() 
     { 
      Debug.WriteLine("begintest"); 
      UInt16 vid = 0x2341; 
      UInt16 pid = 0x0001; 

      string aqs = SerialDevice.GetDeviceSelectorFromUsbVidPid(vid, pid); 

      var myDevices = await DeviceInformation.FindAllAsync(aqs); 

      if (myDevices.Count == 0) 
      { 
       Debug.WriteLine("Device not found!"); 
       return; 
      } 

      try 
      { 
       Debug.WriteLine("testrange"); 
       Debug.WriteLine(myDevices[0].Id); 
       serialPort = await SerialDevice.FromIdAsync(myDevices[0].Id); 
       if (serialPort == null) 
       { 
        Debug.WriteLine("null2"); 
        return; 
       } 
       Debug.WriteLine("ok"); 
       serialPort.WriteTimeout = TimeSpan.FromMilliseconds(1000); 
       serialPort.ReadTimeout = TimeSpan.FromMilliseconds(1000); 
       serialPort.BaudRate = 9600; 
       serialPort.Parity = SerialParity.None; 
       serialPort.StopBits = SerialStopBitCount.One; 
       serialPort.DataBits = 8; 
       serialPort.Handshake = SerialHandshake.None; 
       Debug.WriteLine("ok2"); 
       /*String debugtest = "Serial port configured successfully: "; 
       debugtest += serialPort.BaudRate + "-"; 
       debugtest += serialPort.DataBits + "-"; 
       debugtest += serialPort.Parity.ToString() + "-"; 
       debugtest += serialPort.StopBits; 
       debugtest += (DeviceInformation)myDevices[0]; 

       Debug.WriteLine("debugtest1"); 
       Debug.WriteLine(debugtest);*/ 
       Debug.WriteLine("debugtest2"); 
       Listen(); 
      } 
      catch (Exception exception) 
      { 
       Debug.WriteLine(exception.Message.ToString()); 
       Debug.WriteLine("error"); 
      } 
      finally 
      { 
       Debug.WriteLine("Opened device for communication."); 
      } 
      Debug.WriteLine("test2"); 
     } 
     private async void Listen() 
     { 
      Debug.WriteLine("gelukt"); 
     } 
    } 
} 

Aus irgendeinem Grund ist dieser Teil macht es fest. Es hält nur dort ...

String debugtest = "Serial port configured successfully: "; 
debugtest += serialPort.BaudRate + "-"; 
debugtest += serialPort.DataBits + "-"; 
debugtest += serialPort.Parity.ToString() + "-"; 
debugtest += serialPort.StopBits; 
debugtest += (DeviceInformation)myDevices[0]; 

Debug.WriteLine("debugtest1"); 
Debug.WriteLine(debugtest); 

Dies ist der Ausgang:

begintest 
testrange 
\\?\USB#VID_2341&PID_0001#55639313633351210252#{86e0d1e0-8089-11d0-9ce4-08003e301f73} 
test1 
null 
begintest 
ok 
ok2 
The thread 0x508 has exited with code 0 (0x0). 
The program '[2308] serialsample.exe' has exited with code -1 (0xffffffff). 

Und meine letzte Frage warum es läuft automatisch stoppen? Meine Debuggen beenden sind immer mit diesem (oder Code -1 wie oben zu sehen):

The program '[240] backgroundTaskHost.exe' has exited with code 1 (0x1). 

Sorry, wenn es ein holländisches Wort hier und da in meinem Code.

+0

@ScottChamberlain Dies ist das erste Mal, dass ich etwas Codierung bin wie dieser so das meiste davon ist Kopie vorbei. Ich weiß nicht wirklich, warum es falsch ist, aber ich google es, danke! :) – Principis

+0

drehte meinen Kommentar zu einer vollständigen Antwort und zeigte, was du falsch machst. –

Antwort

0

Sie verwenden IBackgroundTask falsch, Sie müssen Ihre defal und notify registrieren, wenn es abgeschlossen ist. Dies geschieht, indem Sie Ihre async void Funktionen async task verändern und machen Run ein async void

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Net.Http; 
using Windows.ApplicationModel.Background; 
using Windows.Devices.Enumeration; 
using Windows.Devices.SerialCommunication; 
using System.Diagnostics; 
using System.Threading.Tasks; 

namespace BackgroundApplication2 
{ 
    public sealed class StartupTask : IBackgroundTask 
    { 
     private SerialDevice serialPort = null; 
     public void Run(IBackgroundTaskInstance taskInstance) 
     { 
      //This tells IBackgroundTask you will be doing some extra work in the background and it should not shut down. 
      var deferral = taskInstance.GetDeferral(); 
      try 
      { 
       await FindDevice(); 
       Debug.WriteLine("test1"); 

       if (serialPort == null) 
       { 
        Debug.WriteLine("null"); 
       } 
       await FindDevice(); 
      } 
      finally 
      { 
       //This tells IBackgroundTask that you are done with the last await. 
       deferral.Complete(); 
      } 
     } 


     private async Task FindDevice() 
     { 
      Debug.WriteLine("begintest"); 
      UInt16 vid = 0x2341; 
      UInt16 pid = 0x0001; 

      string aqs = SerialDevice.GetDeviceSelectorFromUsbVidPid(vid, pid); 

      var myDevices = await DeviceInformation.FindAllAsync(aqs); 

      if (myDevices.Count == 0) 
      { 
       Debug.WriteLine("Device not found!"); 
       return; 
      } 

      try 
      { 
       Debug.WriteLine("testrange"); 
       Debug.WriteLine(myDevices[0].Id); 
       serialPort = await SerialDevice.FromIdAsync(myDevices[0].Id); 
       if (serialPort == null) 
       { 
        Debug.WriteLine("null2"); 
        return; 
       } 
       Debug.WriteLine("ok"); 
       serialPort.WriteTimeout = TimeSpan.FromMilliseconds(1000); 
       serialPort.ReadTimeout = TimeSpan.FromMilliseconds(1000); 
       serialPort.BaudRate = 9600; 
       serialPort.Parity = SerialParity.None; 
       serialPort.StopBits = SerialStopBitCount.One; 
       serialPort.DataBits = 8; 
       serialPort.Handshake = SerialHandshake.None; 
       Debug.WriteLine("ok2"); 
       /*String debugtest = "Serial port configured successfully: "; 
       debugtest += serialPort.BaudRate + "-"; 
       debugtest += serialPort.DataBits + "-"; 
       debugtest += serialPort.Parity.ToString() + "-"; 
       debugtest += serialPort.StopBits; 
       debugtest += (DeviceInformation)myDevices[0]; 

       Debug.WriteLine("debugtest1"); 
       Debug.WriteLine(debugtest);*/ 
       Debug.WriteLine("debugtest2"); 
       await Listen(); 
      } 
      catch (Exception exception) 
      { 
       Debug.WriteLine(exception.Message.ToString()); 
       Debug.WriteLine("error"); 
      } 
      finally 
      { 
       Debug.WriteLine("Opened device for communication."); 
      } 
      Debug.WriteLine("test2"); 
     } 
     private async Task Listen() 
     { 
      Debug.WriteLine("gelukt"); 
     } 
    } 
} 
+0

Danke! Ich habe gerade gelesen: "Es gibt einen kritischen Punkt zu beachten: Standardmäßig wird die Anwendung heruntergefahren, wenn die Ausführen-Methode abgeschlossen ist." Danke für deine Antwort! – Principis