2

我目前正在尝试用我的 arduino 构建一个非常基本的串行 shell。

我可以使用 Serial.read() 从设备获取输出,并且可以获取它输出的字符,但是我无法弄清楚如何将该字符添加到更长的位置以形成完整的命令。

我尝试了合乎逻辑的事情,但它不起作用:

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);

或(请记住检查 Command 不会增长太多...)

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::ostringstream oss;
    而(Serial.available()> 0){
        oss << static_cast<char>(Serial.read());
    }
    返回 oss.str();
}

您还可以使用 operator+ 连接多个 std::string 实例。

于 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 回答