2017-05-08 4 views
0

Je dois envoyer une commande à un capteur laser. Il est connecté à l'USB via un adaptateur RS232 vers USB. Il fonctionne en utilisant l '"ancienne" classe SerialPort, ce qui signifie que le laser reçoit la commande et s'allume (je peux voir le faisceau pendant 3 secondes, puis il disparaît, comme prévu). Le code est le suivant:Envoi de commandes à un périphérique série dans UWP

private void OpenAndCloseLaser() 
     { 
      serialPort = new SerialPort(); 
      serialPort.PortName = "COM1"; 
      serialPort.BaudRate = 19200; 
      serialPort.DataBits = 7; 
      serialPort.StopBits = StopBits.One; 
      serialPort.Parity = Parity.Even; 

      serialPort.Open(); 

      //initialization command 
      serialPort.WriteLine("s0c"); 

      //open laser 
      serialPort.WriteLine("s0o"); 

      Thread.Sleep(3000); 
      //shut down laser 
      serialPort.WriteLine("s0p"); 

      serialPort.Close(); 
     } 

J'ai essayé de reproduire la même fonctionnalité en utilisant la classe SerialDevice basée sur cette tutorial.

Le code est le suivant:

D'abord, je trouve l'appareil (et cela fonctionne, je reçois « COM1 » comme PortName)

private async Task GetDeviceAsync() 
     { 
      string aqs = SerialDevice.GetDeviceSelector(); 

      var dis = await DeviceInformation.FindAllAsync(aqs); 

      device = await SerialDevice.FromIdAsync(dis[0].Id); 

      device.BaudRate = 19200; 
      device.DataBits = 7; 
      device.StopBits = SerialStopBitCount.One; 
      device.Parity = SerialParity.Even; 
      device.ReadTimeout = TimeSpan.FromMilliseconds(2000); 
      device.WriteTimeout = TimeSpan.FromMilliseconds(2000); 

      device.ErrorReceived += Device_ErrorReceived; 
     } 

C'est ce que j'utilise pour envoyer des commandes à lui:

private async Task WriteCommand(string command) 
     { 

      var dataWriter = new DataWriter(device.OutputStream); 

      dataWriter.WriteString(command); 
      await dataWriter.StoreAsync(); 

      dataWriter.DetachStream(); 
      dataWriter = null; 

     } 

Et voici comment j'envoie les commandes réelles:

private async Task OpenAndCloseLaser() 
     { 
      //initialize 
      await WriteCommand(INIT_COMMAND); 
      // open laser 
      await WriteCommand("s0o"); 

      await Task.Delay(3000); 
      //shutdown laser 
      await WriteCommand("s0p"); 
     } 

Lorsque vous utilisez la classe SerialDevice et le DataWriter, il semble qu'aucune commande n'est envoyée ... le laser ne s'allume pas et s'éteint et je ne reçois aucune erreur. Des idées?

Répondre

0

Le problème ici est que je n'ai pas envoyé une terminaison \r\n avec le commande.Système « ancien » Net Framework avec la classe SerialPort était probablement en train de faire cela par défaut (la méthode est appelée écriture ligne).

Alors maintenant, il travaille avec ceci:

device.IsDataTerminalReadyEnabled = true; 
      device.IsRequestToSendEnabled = true; 

      var dataWriter = new DataWriter(device.OutputStream); 

      dataWriter.WriteString(command + "\r\n"); 

      await dataWriter.StoreAsync(); 

      dataWriter.DetachStream(); 
      dataWriter = null; 

Et avec ceci:

device.IsDataTerminalReadyEnabled = true; 
     device.IsRequestToSendEnabled = true; 

     var dataWriter = new DataWriter(device.OutputStream); 

     byte[] message = System.Text.Encoding.ASCII.GetBytes(command + "\r\n"); 
     dataWriter.WriteBytes(message); 

     await dataWriter.StoreAsync(); 

     dataWriter.DetachStream(); 
     dataWriter = null;