1

シリアル端末からの{と}の間にコマンドテキストを格納するコードを書き込もうとしています。これまでのところ:

byte index = 0; // Index into array; where to store the character
char cmdArr[10];

boolean startOfLine = false;
boolean endOfLine = false;

void setup()
{
  Serial.begin(38400);
}

void serialEvent()
{
  while (Serial.available())
  {
    char cmd = (char)Serial.read();

    if (cmd == '{')
    { 
      startOfLine = true;
    }

    if (cmd == '}')
    { 
      endOfLine = true;
      //cmdArr[index] = '\0'; //null terminate the C string; I'm not sure if this is needed
    }

    if (startOfLine && cmd != '{'  && cmd != '}')
    {
      cmdArr[index++] = cmd;
    }

    if (startOfLine && endOfLine)
    {
      int i;

      for (i = 0; i < 10; i++)
      {
        //Do something with the command
      }

      startOfLine = false;
      endOfLine = false;
      break;
    }
  }
}

void loop()
{ 
}

cmdArrを繰り返し処理して、配列値を出力することができます。たとえば、現在、コマンドは次のように格納されています。char cmdArr [10] = {'p'、'h'、'c'、'\ 0'}; char cmdArr [10] = {"phc"};のようなコマンドを保存することは可能ですか?また、次のコマンドの準備をするために、そのコマンドをクリア/空にするにはどうすればよいですか?

動作しているように見える新しいコード。最も簡単なアプローチのように思えたので、私は文字列を使用することにしました。

String cmdData; //Store the complete command on one line to send to sensor board.

boolean startOfLine = false;
boolean endOfLine = false;

void setup()
{
  Serial.begin(38400);
  Serial3.begin(38400);
}

void serialEvent()
{
  while (Serial.available())
  {
    char cmd = (char)Serial.read();

    if (cmd == '{')
    { 
      startOfLine = true;
    }

    if (cmd == '}')
    { 
      endOfLine = true;
    }

    if (startOfLine && cmd != '{'  && cmd != '}')
    {
      //Serial.print("Send command");
      cmdData += cmd;
    }

    if (startOfLine && endOfLine)
    { 
      startOfLine = false;
      endOfLine = false;

      cmdData += '\r';

      Serial3.print(cmdData);

      cmdData = "";
    }
  }
}

void serialEvent3()
{
  char cmd3 = (char)Serial3.read();
  Serial.print(cmd3);
}

void loop()
{ 
}
4

1 に答える 1

1

cmdArr は連続したメモリ ブロックです。ある意味では、データはすでに「phc\0」としてそこに保存されています。cmdArr をポインターとして使用して、文字を 1 つずつアクセスする代わりに、データを文字列として出力できるようにする必要があります (ただし、ポインターを使用して 1 つずつ文字にアクセスすることもできます)。あなたのソリューションでは、配列をクリアする必要はないと思います。インデックスを 0 に設定し、すべての文字を書き込んだときに文字列を \0 で終了することを確認するだけで十分です (既に行っていること)。C の文字列はゼロで終了します。ループ内でコンテンツを 1 つずつ処理する場合は、ゼロに遭遇したらループを終了する必要があります。

于 2012-06-04T21:50:07.930 に答える