2017-05-08 39 views
0

我需要向激光傳感器發送命令。它通過RS232到USB適配器連接到USB。向UWP中的串行設備發送命令

它使用「舊」SerialPort類,這意味着激光接收命令並打開(我可以看到光束3秒,然後消失,如預期的那樣)。該代碼是這樣的:

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

我試圖複製使用基於此tutorial的SerialDevice類相同的功能。

的代碼是這樣的:

首先,我找到該設備(和它的作品,我得到「COM1」作爲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; 
     } 

這是我在用發送命令到它:

private async Task WriteCommand(string command) 
     { 

      var dataWriter = new DataWriter(device.OutputStream); 

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

      dataWriter.DetachStream(); 
      dataWriter = null; 

     } 

而且這是我送的實際命令:

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

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

當使用SerialDevice類和DataWriter時,似乎沒有命令被髮送......激光沒有打開和關閉,我也沒有收到任何錯誤。有任何想法嗎?

回答

0

這裏的問題是我沒有發送\r\n終止命令。帶有Seri​​alPort類的「舊」.Net Framework可能默認是這樣做的(該方法被稱爲Write Line)。

所以現在它的工作原理與此:

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

      var dataWriter = new DataWriter(device.OutputStream); 

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

      await dataWriter.StoreAsync(); 

      dataWriter.DetachStream(); 
      dataWriter = null; 

而與此:

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; 
相關問題