2015-08-15 10 views
9

Czy to tylko ja, czy jest to błąd?Windows UWP Windows.Devices.SerialCommunication.SerialDevice Nie działa

serialPort = await SerialDevice.FromIdAsync(Id); 

serialPort zawsze jest null, nawet podczas Id nie jest.

Potrzebuję tego działa. Na razie właśnie piszę bardzo "szybki i brudny" kod do testowania komunikacji szeregowej z uniwersalnej aplikacji Windows 10. Debugowałem zarówno w x86, jak i x64 z tym samym wynikiem.

Oto gdzie jestem teraz, ale nie mogę iść bardzo daleko bez SerialPort tworzony ....

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

Dzięki za pomoc i rady ....

+0

Sprawdzanie "oficjalne" próbka SerialSample znaleźć na GitHub, to robi to samo. Dotyczy to wersji 10.0.10240.0 i systemu Windows 10 w wersji 10240 – BernardG

+0

Dokumenty są całkowicie zbyt tandetne, aby uzyskać świadomą odpowiedź. Przypuszczam, że tak, ponieważ nie ma jawnej metody Open(), nie można jej uzyskać, ponieważ urządzenie jest już w użyciu. Lub zapomniałeś poprosić o możliwość "komunikacji szeregowej" w manifeście. –

+0

Dziękuję za odpowiedź, Hans. Powinienem był powiedzieć, że dodałem zdolność do manifestu. Należy również pamiętać, że ta sama funkcja daje również zerową wartość w próbce wykonanej i dystrybuowanej przez Microsoft, więc nie jest to tylko mój kod. Zgaduję, że gdyby urządzenie było już w użyciu, wygenerowany zostałby wyjątek, a nie zwrócono wartości zerowej (domyślnie ..) – BernardG

Odpowiedz

2

Jeśli port szeregowy "COM3", który próbujesz otworzyć, jest wbudowanym portem szeregowym, wówczas aktualny projekt klasy komunikacji szeregowej nie zezwala na dostęp do portów szeregowych na płycie. Klasa komunikacji szeregowej obsługuje tylko komunikację USB-to-Serial, a nie bezpośrednią komunikację szeregową. W powyższym kodzie, jaka jest wartość myDevices [0] .Port.Name?

+0

Dzięki za twoją odpowiedź Prashant. Jest to port USB na port szeregowy (Arduino). W faat problem polegał na tym, że port był już zajęty, ale także, że nie jestem pewien, jak go otworzyć. sposób komunikacji szeregowej jest zaprogramowany na arduino, wysyła wiadomość powitalną zaraz po otworzeniu portu, ale nie mogę jej odebrać. – BernardG

+0

Tylko jeden proces może mieć port na raz, więc jeśli jest własnością innego procesu, aplikacja nie będzie mogła go otworzyć. Jest to zgodne z projektem ... –

+0

Co do przeczytanego ciągu powitalnego, czy możesz mi powiedzieć: 1. Z której płyty Arduino korzystasz (UNO R3, Leonardo, itp.)? 2. Z jakim programem błysnął Arduino? Czy widzisz ekran powitalny ze standardową próbką "mrugnięcia"? Czy może to mieć miejsce tylko w przypadku Twojej aplikacji? 3. Jeśli nie występuje w przypadku standardowej próbki, czy możesz wysłać przykładowy szkic Arduino, który odsyła ten problem? 4. Co widzisz po uruchomieniu "Terminala" wewnątrz Arduino IDE po zresetowaniu urządzenia Arduino? Jak to się ma do tego, co widzisz w swoim programie? –

8

Miałem ten sam problem z czujnikiem Maxbotix, który korzystał z układu FTDI do komunikacji między portami USB. Mógłbym połączyć się z urządzeniem grzywny w programie terminalowym i mogłem go używać z klasą rzeczywistego .NET Framework SerialPort, ale w obu wersjach UWP SerialSample od GitHub i mojego kodu, SerialDevice.FromIdAsync() zwrócił null.

Dla mnie rozwiązanie było podzielone na dwie części.

W pierwszej części było dodanie możliwości urządzenia w pliku Package.appxmanifest:

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

Druga część była pobrać zaktualizowany sterownik (użyłem wersji 2.12.06) z FTDI Web site. Jak tylko to zrobiłem, zaczęło działać.

Pełna próbka poniżej:

  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); 
       } 
      } 
+0

Czy masz pomysł, dlaczego nigdy nie kończy się dla mnie ZEdAsync? Ja też czekam tam, tak jak ty, ale po prostu działa nieskończenie ... – Exa

Powiązane problemy