2

私は現在、arduinoで非常に基本的なシリアルシェルを構築しようとしています。

Serial.read()を使用してデバイスから出力を取得し、出力された文字を取得することはできますが、その文字をlongerに追加して完全なコマンドを形成する方法を理解できません。

私は論理的なことを試しましたが、うまくいきません:

char Command[];

void loop(){
  if(Serial.available() > 0){
    int clinput = Serial.read();
    Command = Command + char(clinput);
}

誰か助けてもらえますか?ありがとうございました。

4

6 に答える 6

3

文字ごとに配列に書き込む必要があります。たとえば、次のようになります。

#define MAX_COMMAND_LENGTH 20

char Command[MAX_COMMAND_LENGTH];
int commandLength;    

void loop(){
  if(Serial.available() > 0){
    int clinput = Serial.read();
    if (commandLength < MAX_COMMAND_LENGTH) {
      Command[commandLength++] = (char)clinput;
    }
}

ところで:これは完全ではありません。たとえば、commandLengthは0で初期化する必要があります。

于 2010-03-26T23:34:05.267 に答える
1

最長のコマンドを保持するのに十分なスペースを割り当てcommandてから、入ってくるときに文字を書き込む必要があります。文字がなくなったら、コマンドをnullで終了してから戻ります。

char Command[MAX_COMMAND_CHARS];

void loop() {
  int ix = 0; 
  // uncomment this to append to the Command buffer
  //ix = strlen(Command);

  while(ix < MAX_COMMAND_CHARS-1 && Serial.available() > 0) {
     Command[ix] = Serial.read();
     ++ix;
  }

  Command[ix] = 0; // null terminate the command
}
于 2010-03-26T23:58:35.923 に答える
0

可能であれば、std::stringを使用してください。できない場合:

snprintf(Command, sizeof(Command), "%s%c", Command, clinput);

または(コマンドが大きくなりすぎないことを確認することを忘れないでください...)

size_t len = strlen(Command);
Command[len] = clinput;
Command[len + 1] = '\0';
于 2010-03-26T23:30:32.993 に答える
0

std::ostringstreamstd::string:と一緒に使用します

#include <sstream>
#include<文字列>

std :: string loop()
{{
    std :: ostringstream oss;
    while(Serial.available()> 0){
        oss << static_cast <char>(Serial.read());
    }
    oss.str();を返します。
}

std::stringの複数のインスタンスをoperator+で連結することもできます。

于 2010-03-26T23:32:21.870 に答える
0

Cもタグ付けされているので、

char *command = (char *)malloc(sizeof(char) * MAXLENGTH);
*command = '\0';

void loop(){
  char clinput[2] = {}; //for nullifying the array
  if(Serial.available() > 0){
    clinput[0] = (char)Serial.read();
    strcat(command, clinput);
}
于 2010-03-26T23:33:31.397 に答える
-1
 char command[MAX_COMMAND];
 void loop(){
     char *p = command;
    if(Serial.available() > 0){
      int clinput = Serial.read();
    command[p++] = (char)clinput;
   }
  }
于 2010-03-26T23:32:04.333 に答える