C#和Arduino使用秒表类在WinForm中显示时间
我不熟悉Arduino和线程编程。 我在Arduino中编程了5个按钮-当你按下按钮时,会发生一些事情。 我想用C#接收数据(C#从Adruino发送的端口读取数据)。 这使我们能够知道启动哪个秒表)。 按下该按钮时,秒表将启动并连续显示经过的时间。 问题是我不能让它与多个按钮一起工作,例如:我有5个按钮可以随时按下, 但当前代码只能处理1个按钮。 我非常感谢你的帮助,因为我已经挣扎了好几天了 Arduino代码:C#和Arduino使用秒表类在WinForm中显示时间,c#,multithreading,arduino,serial-port,C#,Multithreading,Arduino,Serial Port,我不熟悉Arduino和线程编程。 我在Arduino中编程了5个按钮-当你按下按钮时,会发生一些事情。 我想用C#接收数据(C#从Adruino发送的端口读取数据)。 这使我们能够知道启动哪个秒表)。 按下该按钮时,秒表将启动并连续显示经过的时间。 问题是我不能让它与多个按钮一起工作,例如:我有5个按钮可以随时按下, 但当前代码只能处理1个按钮。 我非常感谢你的帮助,因为我已经挣扎了好几天了 Arduino代码: const int button1 = 3; const int button2
const int button1 = 3;
const int button2 = 5;
int counter1 = 0;
int counter2 = 0;
int buttonState1 = 0;
int buttonState2 = 0;
void setup()
{
pinMode(button1, INPUT);
pinMode(button2, INPUT);
Serial.begin(9600);
}
void loop()
{
buttonState1 = digitalRead(button1);
buttonState2 = digitalRead(button2);
// *** BUTTON 1 ***
if (buttonState1 == LOW && counter1==0)
{
//Serial.println("connected");
counter1++;
delay(100);
}
else if (buttonState1 == HIGH && counter1==1)
{
//Serial.println("ready");
counter1++;
delay(100);
}
else if(buttonState1 == LOW && counter1==2)
{
Serial.println("start");
counter1++;
delay(100);
}
else if(buttonState1 == HIGH && counter1==3)
{
Serial.println("stop");
counter1++;
delay(100);
}
// *** BUTTON 2 ***
if (buttonState2 == LOW && counter2 == 0)
{
//Serial.println("connected");
counter2++;
delay(100);
}
else if (buttonState2 == HIGH && counter2 == 1)
{
//Serial.println("ready");
counter2++;
delay(100);
}
else if(buttonState2 == LOW && counter2 == 2)
{
Serial.println("start2");
counter2++;
delay(100);
}
else if(buttonState2 == HIGH && counter2 == 3)
{
Serial.println("stop2");
counter2++;
delay(100);
}
}
C#代码:
编辑:它起作用。
当按下按钮时,我打开端口并启动一个新线程。循环检查来自端口和启动/停止秒表的值
public void PortReadLine()
{
for (int i = 0; i < 4; i++)
{
string portValue = myPort.ReadLine();
switch (portValue)
{
case "start\r":
stopwatch.Start();
break;
case "start2\r":
stopwatch2.Start();
break;
case "stop\r":
stopwatch.Stop();
break;
case "stop2\r":
stopwatch2.Stop();
break;
}
}
}
private void button1_start_Click(object sender, EventArgs e)
{
myPort.BaudRate = 9600;
myPort.PortName = "COM3";
myPort.Open();
Thread threadPort = new Thread(PortReadLine);
threadPort.Start();
}
public void PortReadLine()
{
对于(int i=0;i<4;i++)
{
字符串portValue=myPort.ReadLine();
开关(端口值)
{
案例“开始\r”:
秒表。开始();
打破
案例“start2\r”:
秒表2.Start();
打破
案例“停止\r”:
秒表;
打破
案例“stop2\r”:
秒表2.Stop();
打破
}
}
}
私有无效按钮1\u开始\u单击(对象发送者,事件参数e)
{
myPort.BaudRate=9600;
myPort.PortName=“COM3”;
myPort.Open();
线程端口=新线程(PortReadLine);
threadPort.Start();
}
第一次按下按钮并调用ThreadMethodStop()
时,看起来您正在禁用串行端口:
if (data == "stop\r")
{
stopwatch.Stop();
myPort.Close(); // <== here
}
if (data == "stop2\r")
{
stopwatch2.Stop();
myPort.Close(); // <== and here
}
查看如何在递增计数器2
后,其值将为4,因此不再满足if
语句中的条件?我认为因此你需要
else if(buttonState2 == HIGH && counter2 == 3)
{
Serial.println("stop2");
counter2 = 2; // make ready to return to start2 condition OR
counter2 = 0; // return to initial state, do one of these...
delay(100);
}
当然,对另一个按钮也要这样做。那么哪一个有效?查看Arduino代码的相关部分也可能会有所启发。如果这是个问题,我很乐意回答,但是您是否同时启用了Timer1和Timer2并设置了它们的间隔属性?如果您先按button1,然后按button2,则只执行button1,因为它是先按的。如果先按按钮2,则按钮1不起作用。我粘贴了Arduino代码。是的,计时器已启用并工作。我也尝试过根本不关闭端口,但仍然不工作。请查看我编辑的答案和。这是一个选项(我的想法是通过C代码重置计数器),但问题出在C代码中。我不知道如何从Arduino连续读取数据,同时运行秒表并实时显示经过的时间。现在它只在第一次迭代中起作用(按钮1之后按下的按钮2不起作用,反之亦然)。
else if(buttonState2 == LOW && counter2 == 2)
{
Serial.println("start2");
counter2++;
delay(100);
}
else if(buttonState2 == HIGH && counter2 == 3)
{
Serial.println("stop2");
counter2++;
delay(100);
}
else if(buttonState2 == HIGH && counter2 == 3)
{
Serial.println("stop2");
counter2 = 2; // make ready to return to start2 condition OR
counter2 = 0; // return to initial state, do one of these...
delay(100);
}