【问题标题】:How to send serial data from Arduino to Visual Studio C# with zedgraph and vice versa simultaniously如何使用 zedgraph 将串行数据从 Arduino 发送到 Visual Studio C#,反之亦然
【发布时间】:2017-01-26 01:56:00
【问题描述】:

我正在做一个项目,从 Arduino 读取模拟数据,然后使用 zedgraph 在 Visual C# 中显示它。我的 GUI 上有一个开始按钮,可以开始从 Arduino 读取串行数据。我可以使用private void read_Tick 方法来做到这一点,该方法打开 arduino 端口,读取串行数据,在 zedgraph 上显示数据,然后每 1 秒关闭一次 arduino。如果您无法理解我的话,这里是方法:

private void read_Tick(object sender, EventArgs e)
{
    try
    {

        arduino.Open();

        LineItem kurvaKonsentrasi = zedGraphKonsentrasi.GraphPane.CurveList[0] as LineItem;


        IPointListEdit listKonsentrasi = kurvaKonsentrasi.Points as IPointListEdit;

        double time = (Environment.TickCount - timeStart) / 1000.0;

        float dataKonsentrasi = float.Parse(arduino.ReadLine(), CultureInfo.InvariantCulture.NumberFormat);
        listKonsentrasi.Add(time,Convert.ToDouble(dataKonsentrasi));

        arduino.Close();

        Scale xScale = zedGraphKonsentrasi.GraphPane.XAxis.Scale;
        if (time > xScale.Max - xScale.MajorStep)
        {
            xScale.Max = time + xScale.MajorStep;
            xScale.Min = xScale.Max - 30.0;
        }

        zedGraphKonsentrasi.AxisChange();

        zedGraphKonsentrasi.Invalidate();

    }
    catch (Exception fail)
    {
        if (arduino.IsOpen)
        {
            arduino.Close();
        }
    }

}

当我单击开始按钮时调用此方法。所以,我的问题是,我想在单击开始按钮时“打开”发送字符串数据。此字符串数据用于命令 Arduino 在模拟读数之前移动我在void loop() 中附有此代码的伺服器。

if(Serial.available()>0){
    start = Serial.read();
      if(start == "on"){
        servoMotor.write(40);
  }
}

我知道我正在做的事情有问题,因为我无法启动伺服。你能给我建议我应该怎么做才能让 Visual C# 将命令发送到 arduino 以启动伺服一次然后 arduino 开始读数然后 Visual C# 读取它?

【问题讨论】:

  • 你有 arduino 在另一边监听串行输入吗?
  • 对不起,这就是我的意思。您是否检查过以确保您的代码可以移动伺服,只是为了确保它是串行输入问题而不是其他类型的问题?这可能是另一个问题,例如,没有正确设置引脚或将伺服器连接到它
  • @swmcdonnell 我在 Visual C# 上有 SerialPort arduino = new SerialPort("COM3",115200);
  • @swmcdonnell 我已经做到了,但是当我结合模拟读数时,它就不起作用了。

标签: c# c visual-studio arduino


【解决方案1】:

Serial.read() 只返回一个字节,所以你不会“打开”。第一次你会得到“o”,如果你再读一遍,你会得到“n”。

如果你在“on”后面加上一个“\n”(换行符),你可以这样做:

char command[3];
if (Serial.available() > 0) {
   int bytesRead = Serial.readBytesUntil('\n', command, 2);
   command[2] = '\0';
   if strcmp(command, "on") == 0) {
      servoMotor.write(40);
   }
}

【讨论】:

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