Arduino串口输入停止和启动

时间:2015-11-19 00:52:21

标签: arduino serial-port

我正在尝试等待用户输入以启动程序操作,然后当用户发送停止命令时,循环停止运行。在循环运行时,我无法让串口继续读取输入。

所以我希望用户按1然后它将进入循环并显示来自中断的数据。但我希望它继续监视串行输入,所以当我键入2时,我将退出循环并停止打印到串行端口。

串口未注册我的第二个输入。

我遗漏了一些代码,但重要的东西应该在那里。

int userStart = 0;   // Holder for user input to start program
int userStop = 0; // Holder for user input to stop program

void setup() {
  Serial.begin(115200);
  pinMode(motorEncoderA, INPUT);
  digitalWrite(motorEncoderA, HIGH); // Pull up resistor
  pinMode(motorEncoderB, INPUT);
  digitalWrite(motorEncoderB,HIGH); // Pull up resistor

  // Interrupt on change of Pin A
  attachInterrupt(digitalPinToInterrupt(2), encoderFunc, CHANGE); 

  Serial.print("Press 1 to start the Process & 2 to Stop");
}

void loop() {
if (Serial.available() > 0) 
{
   userStart = Serial.read();
   if (userStart = 1) {
       Serial.print('\n');
       while(userStop != 2) {  

       unsigned long timee = millis(); 

       // Only update if the shaft has moved
       if (encoderPositionLast != rotationCounter) {
           Serial.print("Time: ");
           Serial.print(timee);
           Serial.print(" Count: "); 
           Serial.print (rotationCounter);
           Serial.print('\n');
           encoderPositionLast = rotationCounter;
           Serial.print(userStart);

     }
    if (Serial.available() > 0) {
    userStop = Serial.read();
    Serial.print(userStop);
 }
   }
  }
}

1 个答案:

答案 0 :(得分:0)

嗯,我认为您的问题是userStartuserStop不应该是12,而是'1''2'

那就是说,你的代码中有些东西我不喜欢。

首先,为什么每个人都使用int作为所有数字变量的基本类型?如果单个byte足够,请使用它。在32位计算机上intbyte几乎相同,但在使用int的8位计算机上浪费了空间和时间。

其次,我强烈反对阻止循环功能,否则你将无法做任何其他事情。相反,使用变量来跟踪您是否正在运行,使用串行接口更新它,然后在运行时执行代码。

此代码应该这样做。恕我直言,它比阻止循环要好得多:

bool running = false;

void setup()
{
    ...
    running = false;
}

void loop()
{
    if (Serial.available() > 0) 
    {
        switch(Serial.read())
        {
        case '1':
            running = true;
            Serial.print('\n');
            break;
        case '2':
            running = false;
            Serial.print("stopped");
            break;
        }
    }

    if (running)
    {
        unsigned long timee = millis(); 

        // Only update if the shaft has moved
        if (encoderPositionLast != rotationCounter) {
            Serial.print("Time: ");
            Serial.print(timee);
            Serial.print(" Count: "); 
            Serial.print (rotationCounter);
            Serial.print('\n');
            encoderPositionLast = rotationCounter;
            Serial.print("running");
        }
    }
}