14

コンピューターからサーボを管理する必要があります。

そのため、コンピューターから Arduino に管理メッセージを送信する必要があります。サーボの数とコーナーを管理する必要があります。「1;130」(最初のサーボとコーナー130、区切り記号「;」)のようなものを送信することを考えています。

これを達成するためのより良い方法はありますか?

ここに私のこのコードがあります:

String foo = "";
void setup(){
   Serial.begin(9600);
}

void loop(){
   readSignalFromComp();
}

void readSignalFromComp() {
  if (Serial.available() > 0)
      foo = '';
  while (Serial.available() > 0){
     foo += Serial.read(); 
  }
  if (!foo.equals(""))
    Serial.print(foo);
}

これはうまくいきません。どうしたの?

4

7 に答える 7

5

他の回答のほとんどは非常に冗長または非常に一般的であるため、Arduinoライブラリを使用して特定の例でそれを行う方法の例を挙げたいと思いました:

メソッドSerial.readStringUntilSerialを使用して、ポートから区切り文字まで読み取ることができます。

次に、toIntを使用して文字列を整数に変換します。

完全な例については、次のとおりです。

void loop() 
{
    if (Serial.available() > 0)
    {
        // First read the string until the ';' in your example
        // "1;130" this would read the "1" as a String
        String servo_str = Serial.readStringUntil(';');

        // But since we want it as an integer we parse it.
        int servo = servo_str.toInt();

        // We now have "130\n" left in the Serial buffer, so we read that.
        // The end of line character '\n' or '\r\n' is sent over the serial
        // terminal to signify the end of line, so we can read the
        // remaining buffer until we find that.
        String corner_str = Serial.readStringUntil('\n');

        // And again parse that as an int.
        int corner = corner_str.toInt();

        // Do something awesome!
    }
}

もちろん、これを少し単純化できます。

void loop() 
{
    if (Serial.available() > 0)
    {
        int servo = Serial.readStringUntil(';').toInt();
        int corner = Serial.readStringUntil('\n').toInt();

        // Do something awesome!
    }
}
于 2015-12-29T19:14:31.627 に答える
2

読み取りバッファを作成し、2つのフィールド(サーボ番号とコーナー)の開始位置と終了位置を計算する必要があります。次に、それらを読み込んで、文字を整数に変換し、コードの残りの部分で使用できます。このようなものが機能するはずです(Arduinoではテストされていませんが、標準Cでテストされています):

void loop()
        {
            int pos = 0; // position in read buffer
            int servoNumber = 0; // your first field of message
            int corner = 0; // second field of message
            int cornerStartPos = 0; // starting offset of corner in string
            char buffer[32];

            // send data only when you receive data:
            while (Serial.available() > 0)
            {
                // read the incoming byte:
                char inByte = Serial.read();

                // add to our read buffer
                buffer[pos++] = inByte;

                // check for delimiter
                if (itoa(inByte) == ';')
                {
                    cornerStartPos = pos;
                    buffer[pos-1] = 0;
                    servoNumber = atoi(buffer);

                    printf("Servo num: %d", servoNumber);
                }
            }
            else 
            {
                buffer[pos++] = 0; // delimit
                corner = atoi((char*)(buffer+cornerStartPos));

                printf("Corner: %d", corner);
            }
        }
于 2012-06-25T20:59:10.687 に答える
1

修正するしかないようです

  foo = '';  >>to>>  foo = "";

  foo += Serial.read();  >>to>>  foo += char(Serial.read());

私も似たようなものを作りました..:

void loop(){
  while (myExp == "") {
    myExp = myReadSerialStr();
    delay(100);
  }
}    

String myReadSerialStr() {
  String str = "";
  while (Serial.available () > 0) {
    str += char(Serial.read ());
  }
  return str;
}
于 2015-11-22T23:00:50.653 に答える
0

このコードは、文字が表示されるまで文字列を読み取り'>'ます

void loop() {
  // put your main code here, to run repeatedly:
  String msg = getMessage();
}

String getMessage() {
  String msg = "";

  while (Serial.available()>0) {
    msg =  Serial.readStringUntil('>');
  }
  return msg;
}
于 2020-06-02T17:32:46.233 に答える