我尝试读取使用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);
}
}
}
}
我已经搜索了很长时间的解决方案,但没有发现任何问题。
答案 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;
});
非常感谢四个支持。 :-)