所以我试图使用我在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这个名字。只是我正在做的事情。
答案 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数据类型的问题。假设我想在表单上传递诸如鼠标坐标之类的信息,然后处理该数据以移动机器人,那么这种方法不可行。因此,我仍然将该线程保持打开状态,以获取更完整的答案。谢谢。