2010-03-26 7 views
2

В настоящее время я пытаюсь создать очень базовую серийную оболочку с моим arduino.Добавление символов в строку

Я могу получить выход с устройства с помощью Serial.read() и получить полученный символ, но я не могу решить, как добавить этот символ дольше, чтобы сформировать полную команду.

Я попытался логическую вещь, но она не работает:

char Command[]; 

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

Может кто-нибудь помочь? Спасибо.

ответ

0

Используйте std :: string, если можете. Если вы не можете:

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

или (Remeber, чтобы проверить, что команда не растут слишком много ...)

size_t len = strlen(Command); 
Command[len] = clinput; 
Command[len + 1] = '\0'; 
+0

команда точки оленья кожа на что-либо, SizeOf (команда) = 4 (или, может быть, 2 на Arduino) – pm100

+0

спасибо, я буквально провел день прибегая к помощи: D – Jamescun

-1
char command[MAX_COMMAND]; 
void loop(){ 
    char *p = command; 
    if(Serial.available() > 0){ 
     int clinput = Serial.read(); 
    command[p++] = (char)clinput; 
    } 
    } 
+0

следует проверить на переполнение буфера, хотя. –

+1

Почти наверняка seg fault, если он даже компилируется. p - указатель на char, а не индекс в массив символов. –

+0

@simon ты серьезно? char * отлично указывает на char array. Надеюсь, вы отмените принятый ответ, так как он пишет единичному указателю. – pm100

0

Использование std::ostringstream с std::string:

 
#include <sstream> 
#include <string> 

std::string loop() 
{ 
    std::ostringstream oss; 
    while (Serial.available() > 0){ 
     oss << static_cast<char>(Serial.read()); 
    } 
    return oss.str(); 
} 

Вы также можете конкатенировать несколько экземпляров std :: string с помощью оператора +.

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); 
} 
+0

strcat принимает символ * в качестве второго аргумента –

+0

@Simon Nickerson: обновлено. благодаря! –

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

BTW: Это не полный. Например. commandLength должен быть инициализированы 0.

1

Вам нужно выделить достаточно мест в command держать длинную ввод команды, а затем записать символы в него, как войти. Когда вы бежите из символов, вы обнулить завершить команду и затем вернитесь.

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 
} 
Смежные вопросы