UWP SerialDevice读取Arduino

时间:2019-02-06 09:02:36

标签: c# uwp serial-port

我尝试读取使用USB连接从Arduino Uno发送的线路。 我在Arduino上的程序运行良好,并且在通用应用程序中从Arduino获取数据。

在Arduino IDE的串行监视器中,我可以看到数据已正确发送。

显示如下:

22.77;29.35;101352.00
22.77;29.36;101340.00
22.77;29.35;101347.00
22.77;29.35;101348.00

这是我的Arduino代码:

void loop() {
  float temp = htu.readTemperature();
  float humidity = htu.readHumidity();
  float pressure = bmp.readPressure();

  Serial.print(temp);
  Serial.print(";");
  Serial.print(humidity);
  Serial.print(";");
  Serial.print(pressure);
  Serial.print("\r\n");
}

在Visual Studio输出窗口中:

2201365.00
22.68;29.
35;101360.00
5;10136

这是我在C#中的代码:

private async Task RetrieveData()
{
    string filter = SerialDevice.GetDeviceSelector("COM7");
    var devices = await DeviceInformation.FindAllAsync(filter);

    if (devices.Any())
    {
        string deviceId = devices.First().Id;
        _device = await SerialDevice.FromIdAsync(deviceId);

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

            _dataReader = new DataReader(_device.InputStream);

            while (true)
            {
                var bytesRecieved = await this._dataReader.LoadAsync(21);
                if (bytesRecieved > 0)
                {
                    string data = _dataReader.ReadString(bytesRecieved);
                    string[] block = data.Split('\n');

                    Debug.WriteLine(data);

                    //await Window.Current.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
                    //{
                    //    _tblkTemperature.Text = block[0].Split('=')[1] + " °C";
                    //    _tblkHumidity.Text = block[1].Split('=')[1] + "% rH";
                    //    _tblkPressure.Text = block[2].Split('=')[1] + " Pa";
                    //});
                }

                await Task.Delay(500);
            }
        }
    }
}

我已经搜索了很长时间的解决方案,但没有发现任何问题。

1 个答案:

答案 0 :(得分:0)

我有解决方案... 我逐字节读取流,并将其转换为char。如果我看到CRLF,那么我的字符串是否完整完成,任务将返回该行。

                string line = await Task.Run(async () =>
                {
                    int next_char;
                    String data = "";
                    while (true)
                    {
                        await _dataReader.LoadAsync(1);
                        next_char = _dataReader.ReadByte();
                        if (next_char == '\n') { break; }
                        if (next_char == '\r') { continue; }
                        data += Convert.ToChar(next_char);
                    }
                    return data;
                });

非常感谢四个支持。 :-)