UWP SerialDevice Чтение Arduino - PullRequest
       4

UWP SerialDevice Чтение Arduino

0 голосов
/ 06 февраля 2019

Я пытаюсь прочитать строки, отправленные с Arduino Uno через USB-соединение.Моя программа на 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 голосов
/ 06 февраля 2019

У меня есть решение ... Я читаю потоковый байт в байт и преобразую его в символ.Если я вижу 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;
                });

Большое спасибо четырем за поддержку.: -)

...