Arduino - Serial1不可用

时间:2017-01-14 21:08:53

标签: bluetooth arduino serial-port

我用arduino和c#学习编码。我的程序通过蓝牙命令发送到带步进电机的平台(简单的移动列表)。 第一步 - 在recive信息之后,准备使用它们(格式!,。(...)@(例如!1,100.3,90。@意味着向前移动(1)持续100 ms,向左移动(3)90 ms。 -start of stream @ - stream of stream) 第二步 - 执行移动 第三步 - 如果没有,继续循环直到下一个信息到达Serial1(这意味着首先开始步骤。 它甚至可以工作,但在第一次收到字符串后,我的Serial1.available()返回false; / 我不知道为什么?他忙还是什么?我无法重现第二串命令

#define a1 4  //stepper motor connection
#define a2 3
#define b1 5
#define b2 6
int licznikRuch = 0; // counter for tabMove
int licznikCzas = 0;// counter for tabTime
 int kolejka = 0;
bool CiagRuch = false;
bool CiagCzas = false; // 
bool Zakonczono = false; // 
int SubPoczatek, SubKoniec; // substring start / substring end
bool Wykonaj = false;
String tabMove[100];
String tabTime[100];
String inputString = "";

String StringCzas = "";
void setup() {
  // put your setup code here, to run once:
 Serial.begin(9600);
 Serial1.begin(9600); //
 Serial2.begin(9600);
 inputString.reserve(200);
 for(int i = 0; i < 100; i++){
  tabMove[i] = "";
  tabTime[i] = "";
 }
 pinMode(19, OUTPUT);pinMode(17,OUTPUT);
 pinMode(51,OUTPUT);

  pinMode(a1, OUTPUT); pinMode(a2, OUTPUT);
  pinMode(b1, OUTPUT);  pinMode(b2, OUTPUT);
  digitalWrite(a1,LOW);  digitalWrite(a2,LOW);
  digitalWrite(b1,LOW);  digitalWrite(b2,LOW);
}

void loop() {
  // put your main code here, to run repeatedly:
if(Zakonczono){  // operacje na wczytanym ciagu. wydobycie rozkazow i czasu
    Serial.println(inputString);    
    for(int i = 0; i < inputString.length();i++){
      if(inputString[i] == '!'){
        for(int l =0;l<100;l++){
          Wykonaj = false;
          tabTime[l] = "";
          tabMove[l] = "";
          licznikCzas = 0;
          licznikRuch = 0;
          }
        }
        if(inputString[i] == '@'){
          Wykonaj = true;
          }     
      if(inputString[i] == '.'){
        SubKoniec = i;
        tabTime[licznikCzas++] = inputString.substring(SubPoczatek+1,SubKoniec);
        CiagCzas = false; 
        StringCzas = "";               
        }
      if(inputString[i] == ','){
        tabMove[licznikRuch++] = inputString[i-1];
        CiagCzas = true;
        SubPoczatek = i;
        }         
      }
      for(int i = 0; i< licznikCzas;i++)
      Serial.println(i+"Ruch"+tabMove[i]+"Czas:"+tabTime[i]);    
    Zakonczono = false;
    inputString= "";
  }      
     while(Wykonaj) // if you cut off whole this loop Serial1 is still available and recive commands
      {    
        if(tabMove[kolejka] == "1")    // move forward     
        {          
        digitalWrite(a1,LOW);
        digitalWrite(a2,HIGH);
        digitalWrite(b1,LOW);
        digitalWrite(b2,HIGH);       
        delay(tabTime[kolejka].c_str());
         Serial.print("1");
        digitalWrite(a1,LOW);
        digitalWrite(a2,LOW);
        digitalWrite(b1,LOW);
        digitalWrite(b2,LOW); 
          kolejka++;
                // Serial.print(kolejka);
          }
          if(tabMove[kolejka] == "2"){ // left
            digitalWrite(a1,LOW);
            digitalWrite(a2,HIGH);
            digitalWrite(b1,HIGH);
            digitalWrite(b2,LOW);
            delay(tabTime[kolejka].c_str());
            Serial.print("2");
            digitalWrite(a1,LOW);
            digitalWrite(a2,LOW);
            digitalWrite(b1,LOW);
            digitalWrite(b2,LOW);
            kolejka++;
            }
             if(tabMove[kolejka] == "3"){ // right
            digitalWrite(a1,HIGH);
            digitalWrite(a2,LOW);
            digitalWrite(b1,LOW);
            digitalWrite(b2,HIGH);
            delay(tabTime[kolejka].c_str());
            Serial.print("3");
            digitalWrite(a1,LOW);
            digitalWrite(a2,LOW);
            digitalWrite(b1,LOW);
            digitalWrite(b2,LOW);
            kolejka++;
            }
            if(tabMove[kolejka] == "4"){ // back
            digitalWrite(a1,HIGH);
            digitalWrite(a2,LOW);
            digitalWrite(b1,HIGH);
            digitalWrite(b2,LOW);
            delay(tabTime[kolejka].c_str());
            Serial.print("3");
            digitalWrite(a1,LOW);
            digitalWrite(a2,LOW);
            digitalWrite(b1,LOW);
            digitalWrite(b2,LOW);
            kolejka++;
            }
            if(tabMove[kolejka] == ""){
              Wykonaj = false; 
              if(!Serial1.available())                         
              Serial.print("Serial1 not avaliable ;(");     // ???                    
              break;
              }              
       }

}

void serialEvent1(){
     char Znak = "_";
   //  char PoprzedniZnak = Znak; 
  while(Serial1.available()){
    // Serial.write(Znak);  
     Znak = (char)Serial1.read();    
     inputString+= Znak;   
     if(Znak == '\n')
     Zakonczono = true; 
     kolejka = 0;
    }

  }

1 个答案:

答案 0 :(得分:-1)

好吧,首先,让我们摆脱愚蠢的事情:

  1. 您是否已尝试将usb从电脑连接/重新连接到arduino?
  2. 您是否尝试过重新启动电脑并拔掉USB电源?
  3. 上传密码后,您是否检查过没有连线到引脚0(RX)引脚?这是一个非常常见的错误,如果是这样的情况,在你上传之前从引脚0取出电线,然后在上传完全完成后上传并再次放入电线(你会得到白色的文字,当它是)
  4. 确保您的电脑驱动器是最新的,并且您可以在您的periferials中看到序列,并且IDE和它已正确连接
  5. 好了,现在已经有了一些建议:

    1. 在帖子中写错误号,Serial.available为false,没有任何意义,如果Serial.available = true然后发生了什么事情,你触发Serial.available的条件为假?
    2. 你的代码很乱(没有冒犯),如果你想让别人试一试,你一定要把它变得更好一点!
    3. 现在解决您的问题:

      我不知道你的代码是坏的还是串口作为串口的猿。

      所以这是2个解决方案

      代码:

      你在这里写的内容不起作用,这就是为什么序列不可用

      void serialEvent1(){
           char Znak = "_";
         //  char PoprzedniZnak = Znak; 
        while(Serial1.available()){  //What kind of condition is this?
          // Serial.write(Znak);  
           Znak = (char)Serial1.read(); //This does not work! Why using char and convert when
      //You can use a string!
      
           inputString+= Znak;   
           if(Znak == '\n')
           Zakonczono = true; 
           kolejka = 0;
          }
      
        }
      

      应该是这样的:

      void serialEvent1(){
           String Znak = "_";
      
        while(Serial1.available() == 0){
          // Serial.write(Znak);  
           Znak = Serial1.readString();    
           inputString+= Znak;   
           if(Znak == '\n')  //This is quite weird if a char or a String == 
      //enter(button)?
      
           Zakonczono = true; 
           kolejka = 0;
          }
      
        }
      

      0,如果你想让它开始输入到串口,加上我会严重建议你不要使用while循环,如果这是一个选择程序,除非你包含while循环中的所有选项然后你有另一个while循环来处理其他选择

      但是说让我们回顾第二个解决方案:

      串口如硬件:

      你必须给我写错误号码否则我无法帮助你,检查我上面的步骤并确保你没有犯这些错误,如果你不是,请在帖子中写下你的错误号码。

      希望它有所帮助! 而且我并不太苛刻;)