通过WinForms控制Arduino

时间:2019-06-12 17:42:36

标签: c# arduino

所以我试图使用我在Visaul C#中制作的WinForms应用程序通过串行端口控制Arduino。该应用程序是,该窗体具有一个串行端口,一个ON和一个OFF按钮。当我按下“打开”按钮时,该窗体通过连接到我的arduino的COM3上的串行端口发送字符串“ ON”,当我按下“关闭”按钮时,它将发送“ OFF”。在arduino端,串行数据通过serialEvent()函数进行处理,该函数可以打开和关闭板载LED。

由于某种原因,只有第一个“ ON”命令有效,此后无论我按下关闭按钮多少次,LED都会保持点亮状态。

Arduino Side:

int ledPin = 13;

String serialData;

void setup()
{
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
  Serial.begin(9600);
  Serial.setTimeout(10);
}

void loop()
{

}
void serialEvent()
{
  serialData = Serial.readString();

  if(serialData = "ON")
  {
    digitalWrite(ledPin, HIGH);
  }
  else if (serialData = "OFF")
  {
    digitalWrite(ledPin, LOW);
  }

}

表格侧:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Swear_Detection
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            port.Open();
        }

        private void Button1_Click(object sender, EventArgs e)
        {
            port.Write("ON");
        }

        private void Button2_Click(object sender, EventArgs e)
        {
            port.Write("OFF");
        }
    }
}

P.S。不用担心Swear_Detection XD这个名字。只是我正在做的事情。

1 个答案:

答案 0 :(得分:0)

好吧,我采用了另一种方法,并完全删除了serialEvent()函数并将其全部放入loop()中。这是arduino现在的样子:

int ledPin = 13;

void setup()
{
  Serial.begin(9600);
  pinMode(ledPin,OUTPUT);
}

void loop()
{
  char input = Serial.read();

  switch(input)
  {
    case '0':
    digitalWrite(ledPin, LOW);
    break;
    case '1':
    digitalWrite(ledPin, HIGH);
    break;
  }
}

相应地,我还更改了C#代码,并用“ 1”和“ 0”替换了“ ON”和“ OFF”。

但是,这只能解决if then数据类型的问题。假设我想在表单上传递诸如鼠标坐标之类的信息,然后处理该数据以移动机器人,那么这种方法不可行。因此,我仍然将该线程保持打开状态,以获取更完整的答案。谢谢。