2016-05-18 33 views
2

電子天びんの重量を読み取る必要がありますが、重量を返すようにコマンドを送信できますが、残高が応答していません。私はdevel 古いモデルHBの貿易です。UWP - シリアルポートCOMを読み取ることができません

これはWindows 10用に開発されたものですが、これまではVisual Fox Proで作成されたコードがありましたが、非常に古いものであり、アップグレードを希望しています。

私は天びんに接続して、私の体重を返すようにコマンドを送信することはできますが、天びんは決して応答しません。

private async void Button_Click(object sender, RoutedEventArgs e) 
    { 
     try 
     { 
      var deviceSelector = SerialDevice.GetDeviceSelector("COM5"); 
      var devices = await DeviceInformation.FindAllAsync(deviceSelector); 
      if (devices.Any()) 
      { 
       var deviceId = devices.First().Id; 
       serialPort = await SerialDevice.FromIdAsync(deviceId); 

       if (serialPort != null) 
       { 
        serialPort.BaudRate = 9600; 
        serialPort.StopBits = SerialStopBitCount.One; 
        serialPort.DataBits = 8; 
        serialPort.Parity = SerialParity.None; 
        serialPort.Handshake = SerialHandshake.None; 

        dataWriteObject = new DataWriter(serialPort.OutputStream); 
        await WriteAsync(WriteCancellationTokenSource.Token); 

        dataReaderObject = new DataReader(serialPort.InputStream); 
        await ReadAsync(ReadCancellationTokenSource.Token); 

       } 
      } 


     } 
     catch (Exception ex) 
     { 
      TxtRespuesta.Text = ex.Message; 
     } 
     finally 
     { 
      serialPort.Dispose(); 
      serialPort = null; 
     } 
    } 

    private async Task ReadAsync(CancellationToken cancellationToken) 
    { 

     Task<UInt32> loadAsyncTask; 

     uint ReadBufferLength = 1024; 

     // Don't start any IO if we canceled the task 
     lock (ReadCancelLock) 
     { 
      cancellationToken.ThrowIfCancellationRequested(); 

      // Cancellation Token will be used so we can stop the task operation explicitly 
      // The completion function should still be called so that we can properly handle a canceled task 
      dataReaderObject.InputStreamOptions = InputStreamOptions.Partial; 
      loadAsyncTask = dataReaderObject.LoadAsync(ReadBufferLength).AsTask(cancellationToken); 
     } 

     UInt32 bytesRead = await loadAsyncTask; 
     if (bytesRead > 0) 
     { 
      TxtRespuesta.Text += dataReaderObject.ReadString(bytesRead); 
     } 
     //rootPage.NotifyUser("Read completed - " + bytesRead.ToString() + " bytes were read", NotifyType.StatusMessage); 
    } 

    private async Task WriteAsync(CancellationToken cancellationToken) 
    { 

     Task<UInt32> storeAsyncTask; 
     String cadena = "@GI;23;"; 
     char[] buffer = cadena.ToArray(); 
     cadena.CopyTo(0, buffer, 0, cadena.Length); 
     String InputString = new string(buffer); 
     dataWriteObject.WriteString(InputString); 

     // Don't start any IO if we canceled the task 
     lock (WriteCancelLock) 
     { 
      cancellationToken.ThrowIfCancellationRequested(); 
      storeAsyncTask = dataWriteObject.StoreAsync().AsTask(cancellationToken); 
     } 

     UInt32 bytesWritten = await storeAsyncTask; 
     if (bytesWritten > 0) 
     { 

     } 
     //rootPage.NotifyUser("Write completed - " + bytesWritten.ToString() + " bytes written", NotifyType.StatusMessage); 
    } 
+0

エラー情報がありますか?あなたのbytesReadがnullを返すことを意味しましたか?私たちはあなたのテスト用のデバイスを持っていなかったので、より多くの情報が人々にあなたをより良く助けることができます。コードの問題またはデバイスの問題であることをテストするには、[公式サンプル](https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/CustomSerialDeviceAccess)を使用してください。 –

答えて

0

まず、当然のことながら、あなたのアプリケーションは、アプリケーションマニフェストでシリアル通信を行っていることを宣言する必要があります。

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

これが欠けているビットだろうか?

+0

また、

+0

を追加することもできます。プロジェクトではこの機能が有効になっています。 –

関連する問題