0

ArduinoでGコードリーダーを作ったのですが、読み込めなくなりました。多くの「休憩」があります。また、whileループやスイッチもたくさんあるので、ループ/スイッチでブレークするとすべてが壊れると考えています。

別のアイデアは、ある種のループになるというものですが、ループする場所がわかりません。

これが私のコードです:

void Gcode(){
  String yy,xx,gg;
  char text[64];
  int number=1;
while(number!=3){
while (Serial.available()>0) {
  delay(3);  //delay to allow buffer to fill
  char c = Serial.read();
  Serial.println(c);
  switch(c){
    case 'G':
      //read_number()
      while (Serial.available()>0) {
        char k = Serial.read();
    if(k==' ' || k=='\n'){
          break; 
    }
        else{
          gg+=k;
    }
      }
      switch(gg.toInt()){
        case 1:
        Serial.println(gg);
      while (Serial.available()>0) {
        c = Serial.read();
            Serial.println(c);
        switch(c){
          case 'X':
            while (Serial.available()>0) {
          char k = Serial.read();
            if(k==' ' || k=='\n'){
              break; 
            }
            else{
              xx+=k;
            }
            }
                char buf[xx.length()];
                xx.toCharArray(buf,xx.length());
                x2=atof(buf);
                Serial.println(x2);
                break; 
              case 'Y':
            while (Serial.available()>0) {
              char k = Serial.read();
              if(k==' ' || k=='\n'){
                break;
                  }
              else{
                    yy+=k;
              }
            }
                Serial.println(yy);
                char buf2[yy.length()];
                yy.toCharArray(buf2,yy.length());
                y2=atof(buf2);
            break;
              case 'E':
            break;
              case 'F':
            break;
              default:
            Serial.print("the end");
          }
         Serial.print("out of switch");
        }
        break;
      case 2:
        break;
      default: 
    Serial.print("nothing");
      }
      break;
    case '\n':
      number=3;
      break;
    default:
      Serial.print("default");
  }

}
}
if(sizeof(yy)>0){
  yy="";
  xx="";
  gg="";
}
Serial.print("quit");
}

G1 X10.00 Y-100.00 を送信すると\nのみが印刷されます: G 1 X 10.00 out of s

4

1 に答える 1

0

あなたの大きな問題の 1 つは、文字がなくなったときに終了することです。これは、ループが書き込まれるよりも速くバッファを消費する場合を意味します (注意: 9600 ボーは 960 バイト/秒を意味し、arduino は遅くても 16.000.000 操作/秒を計算できます...)。

もう 1 つの大きな問題は、RAM の不足である可能性があります。出力が切り捨てられる場合があります。RAMのリアルタイムの使用状況をチェックする関数がいくつかあります。コードはそれほど難しくありません。

したがって、PC は「G1 X10.00 Y-100.00 \n」を送信しますが、時間 X で aruino は「G1 X10.00」を取得します。現在、バッファーを非常に高速に読み取ると (1/960 秒よりも速く、arduino はそれよりずっと速い!)

したがって、理想的には、使用可能なシリアルを削除する while 条件をすべて変更する必要がありますが、代わりに使用する条件を if に入れ、ブレークします。最初から

while (Serial.available()>0)

なりました

while ( (k=Serial.read()) != ' ' && k != '\n') //yes it is a bit weird like this

kが有効な文字であることを確認し、タイムアウト

unsigned long timeout_ms = 1000; //timeout after 1 seconds from NOW!
unsigned long start_ms = millis();
int k=Serial.read();
while ( k != ' ' && millis()-start_ms < timeout_ms){// because here we expect "Gx ", why are you was also using k != '\n'? removed, feel free to add it back
    if (k == -1){
        k=Serial.read(); //read the next char
        continue; //return to the beginning of the while
    }
    [... do thigs...]
    k=Serial.read(); //read the next char
    //here you may add "start_ms = millis();" if you want to reset the timeout
}
于 2014-12-31T12:56:20.230 に答える