【问题标题】:Send data from Arduino to C# through the serial port, accumulated sensor data通过串口从Arduino向C#发送数据,累计传感器数据
【发布时间】:2018-03-13 16:29:11
【问题描述】:

我正在开发一个项目,允许我通过串行端口将 DHT11 传感器数据发送到我的 PC。在我的 PC 中,我用 C# 代码捕获数据。问题是显然传感器记录仍然累积在串行端口中。像 25; 40 [温度和湿度分别] 这样的东西应该每 2 秒到达一次,但我得到类似的东西:25; 4026; 4323; 54

我可以做些什么来一次阅读一篇文章?感谢您的帮助。

Arduino 代码:

#include "DHT.h"

#define DHTPIN 2
#define DHTTYPE DHT11

String temperatura;
String humedad;
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  dht.begin();
}

void loop() {
  delay(1000);
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  float f = dht.readTemperature(true);
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
  float hif = dht.computeHeatIndex(f, h);
  float hic = dht.computeHeatIndex(t, h, false);
  String temperatura = String(t);
  String humedad = String(h);
  Serial.print(temperatura + ";" + humedad + "");
}

C# code:

async void getSerialData() {
  var date = DateTime.Now;
  string temperature;
  string humidity;
  bool getDataNow = false;
  serialPort = new SerialPort();
  // serialPort.PortName = "COM5";//Set your board COM
  serialPort.BaudRate = 9600;
  string portNumber = "COMXX";
  ManagementObjectCollection mbsList = null;
  ManagementObjectSearcher mbs = new ManagementObjectSearcher("Select * From Win32_SerialPort");
  mbsList = mbs.Get();
  if (mbsList.Count > 0) {
    foreach (ManagementObject mo in mbsList) {
      Console.WriteLine("Description:{0}", mo["Description"].ToString());
      Console.WriteLine("Puerto:{0}", mo["DeviceID"].ToString());
      if (mo["Description"].ToString().Contains("duino")) {
        portNumber = mo["DeviceID"].ToString();
        serialPort.PortName = mo["DeviceID"].ToString();
        serialPort.Open();
        getDataNow = true;
        button2.BackColor = Color.FromArgb(56, 228, 6);
        button2.Text = "Synchro OK";
        button2.Enabled = false;
      }
    }
    if (portNumber == "COMXX") {
      getDataNow = false;
      MessageBox.Show("Ninguno de los dispositivos conectados se identifico como sensor syncro", "syncro", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
    }
  } else {
    getDataNow = false;
    MessageBox.Show("Ningun dispositivo ha sido conectado", "synchro", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
  }
  while (getDataNow) {
    string a = "";
    if (serialPort.IsOpen == true) {
      a = serialPort.ReadExisting();
    } else {
      MessageBox.Show("El dispositivo ha sido desconectado", "synchro", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
      getDataNow = false;
    }
    await Task.Delay(4000);
    Console.Write("datos sensor  " + a.Length);
    Console.Write("datos sensor  " + a);
    if (a.Length > 0) {
      getDataSensor(a, out temperature, out humidity);
      lblHum.Text = "";
      lblTemp.Text = "";
      lblHum.Text = humidity;
      lblTemp.Text = temperature;
    }
  }
}

【问题讨论】:

  • 检查您的 Arduino 代码。如果您两次调用Serial.print(temperatura+";"+humedad+"");,您认为串行连接上会出现什么?您会在串行连接上看到temperatura+";"+humedad+""+temperatura+";"+humedad+""。你看到问题了吗? (如果你已经解决了这个问题,你的 C# 代码中会有另一个问题:你需要丢弃不完整的数据。数据读取可能不完整,例如当 C# 客户端读取串行数据而 Arduino 刚刚开始传输第二个数据时/third/...数据值的数字...)
  • 您可以在消息末尾添加“\n”,然后在 C# 端使用 ReadLine()

标签: c# c++ arduino serial-port arduino-uno


【解决方案1】:

变化:

Serial.print(temperatura + ";" + humedad + "");

收件人:

Serial.println(temperatura + ";" + humedad + "");

这样读数就会以不同的线条出现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多