繁体   English   中英

为什么 Serial.read() 没有在 Arduino 中循环

[英]Why is Serial.read() not looped in Arduino

我一直在尝试将 Gui(图形用户界面)连接到我的 Arduino 来控制我的电机。 有 4 个按钮:L(低)、M(中)、H(高)、S(停止)。当我点击那里时,4 个字符之一将发送到我的 Arduino。结合我的红外避障信号(输出引脚连接到Arduino上的引脚2),我的电机将相应地运行一段时间:L(3s),M(5s),H(10s),S(不运行)。 但是,当我用手覆盖传感器点击这 3 个按钮(L、M、H)中的任何一个时,即使我松开手,我的电机仍会继续运行。 只有当我松开手并单击这 3 个按钮或 S 按钮中的任何一个时,电机才会停止运行。 这是我的 Arduino 代码:

#include<AFMotor.h>
AF_DCMotor motor(4);
int sensor=2;
char sig;
int t;
void setup() {
  Serial.begin(9600);
  pinMode(sensor,INPUT);
}

void loop() {
      t = digitalRead(sensor);
      delay(100);
      sig = Serial.read();
        if(sig=='L')
         {  
              if(t==LOW)
                {
                 runMotor(3000);
                }
               else if(t==HIGH)
                {
                  stopMotor();
                }
         }

         else if(sig=='M')
         {
              if(t==LOW)
                {
                  runMotor(5000);
                }
               else if(t==HIGH)
                {
                  stopMotor();
                }
         } 

         else if(sig=='H')
         {
              if(t==LOW)
                {
                  runMotor(10000);
                }
               else if(t==HIGH)
                {
                 stopMotor();
                }
         } 

         else if(sig == 'S')
          {
                  stopMotor();
          }
}

void runMotor(int n)
{
   motor.setSpeed(200);
   motor.run(FORWARD);
   delay(n);
}

void stopMotor()
{
   motor.setSpeed(200);
   motor.run(RELEASE);
   delay(200);
}

这是我的 Winform 代码

private: System::Void run_Click(System::Object^ sender, System::EventArgs^ e) {
    
        serialPort1->Close();
        serialPort1->Open();
        if (listBox1->Text == "Low")
        {
            serialPort1->Write("L");
        }
        else if (listBox1->Text == "Medium")
        {
            serialPort1->Write("M");
        }
        else if (listBox1->Text == "High")
        {
            serialPort1->Write("H");
        }
        
    
}
private: System::Void stop_Click(System::Object^ sender, System::EventArgs^ e) {
    
    serialPort1->Close();
    serialPort1->Open();
    serialPort1->Write("S");
    
    
}

我的设计:

在此处输入图像描述

我一直试图弄清楚我的代码有什么问题,但一直没能找到。

如果不查看 Winforms 代码,我无法确定问题所在,但我相信问题可能与让代码在内部停止电机有关,如果读取串行输入的语句使其工作,winforms 应用程序应该写入当前的值一直按下按钮,以便能够到达 stopMotor function。

请记住,如果没有要读取的输入, Serial.read()根据文档将返回 -1,因此除非您的 winforms 应用程序不断发送按钮的值,否则您将不会到达停止方法(因为if 语句)。 请参阅以下简化示例。

char sig;
int t;
void setup() {
  Serial.begin(9600);
}
void loop() {
    delay(1000);
    sig = Serial.read();
    Serial.println(sig);
    if(sig=='L')
    {  
        Serial.println("Case L");
    }
    else if(sig=='M')
    {
        Serial.println("Case M");
    } else
    {
      Serial.println("Read nothing");
    }
}

从串行监视器输出代码

正如您在这里看到的,我们仅在收到输入时才进入 if 语句。

一种解决方案是仅在读取的值是您的设置之一时更新 sig 变量,这样 sig 就不会被空串行读取覆盖,并且您不需要在 UI 中添加任何额外代码。

char readValue = Serial.read();
if (readValue== 'L' || readValue == 'M' || readValue == 'H'){
   sig = readValue;
}

所以基本上在发送信号后,计算机不会向 Arduino 发送任何内容,因此 Serial.read() 将等待下一个信号发送。 在那个时候,Arduino什么都不做,仍然是电机的前一级

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM