簡體   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