Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#和Arduino使用秒表类在WinForm中显示时间_C#_Multithreading_Arduino_Serial Port - Fatal编程技术网

C#和Arduino使用秒表类在WinForm中显示时间

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

我不熟悉Arduino和线程编程。 我在Arduino中编程了5个按钮-当你按下按钮时,会发生一些事情。 我想用C#接收数据(C#从Adruino发送的端口读取数据)。 这使我们能够知道启动哪个秒表)。 按下该按钮时,秒表将启动并连续显示经过的时间。 问题是我不能让它与多个按钮一起工作,例如:我有5个按钮可以随时按下, 但当前代码只能处理1个按钮。 我非常感谢你的帮助,因为我已经挣扎了好几天了

Arduino代码:

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);
}