Ввод строки в массив символов

Я нахожусь в процессе проекта, в котором я получаю строку типа «hello world» через Bluetooth на Arduino. Я хочу перечислить эту строку в виде отдельного символа, чтобы я мог вызвать любой символ, когда это необходимо. Это не работает, я получаю только нули в последовательном мониторе. пожалуйста, подскажите, что я делаю неправильно

char s;
int k[10];

void setup () {
  Serial.begin(9600);
}
void loop () {
  if (Serial.available() > 0) {
    s = Serial.read();
  }
  k[10] = s;
  for (int x = 0; x < 10; x++) {
    Serial.println(k[x]);
    delay(200);
  }
}

, 👍0


1 ответ


1

В вашем примере кода есть несколько проблем:


Вы проверяете наличие Serial.available()>0, но затем предполагаете/захватываете только один символ:

if (Serial.available() > 0) {
  s = Serial.read();
}

Возможно, в последовательном приемном буфере находится более одного байта, но вы захватываете только один.


k[10] = s;

Вы назначаете захваченный символ последнему элементу массива байтов, независимо от всего остального. Это представляет две основные проблемы

  1. Строка в стиле C должна завершаться нулевым символом ('\0'), и вы немедленно помещаете реальные данные в позицию, которая должна содержать завершающий байт.
  2. Не существует никакой возможности, чтобы байты 0-9 когда-либо имели какие-либо данные, записанные в них этим кодом.

Ваш код предполагает, что вся строка существует в k[] каждый раз через loop(). Вместо этого вы должны предположить, что может потребоваться сотни или тысячи раз через loop() только для того, чтобы закончить прием вашей строки. Входная строка должна иметь какой-либо маркер конца строки, например, новую строку ('\n') или возврат каретки ('\r') (или оба), чтобы ваша программа могла искать это и знать, когда ввод полностью получен.

Ниже представлена простая программа, которая получает строку. Обратите внимание, что в ней есть часть, помеченная для обработки полученных данных. Этот блок кода вводится только после получения новой строки и/или возврата каретки.

#DEFINE MAX_INPUT 90

char inputBuffer[MAX_INPUT+1]; // Обрабатывает до 90 байт в строке в стиле C с завершающим нулевым символом.

void setup() 
{
  Serial.begin(115200); // инициализация
  inputBuffer[0] = '\0'; //Инициализируем строку как пустую.
  Serial.println("Begin:");
}

void loop() {

  if (Serial.available()>0)
  {
    char input = Serial.read();
    static int s_len; // статические переменные по умолчанию равны 0
    if (s_len>=MAX_INPUT) {
      // Уже получено максимальное количество символов
      // Игнорировать все новые входные данные до тех пор, пока не произойдет завершение строки
    } else if (input != '\n' && input != '\r') {
      inputBuffer[s_len++] = input;
    } else {
      // Получили символ LF или CR

      // ВСТАВЬТЕ СВОЙ КОД ЗДЕСЬ ДЛЯ ОБРАБОТКИ ПОЛУЧЕННЫХ ДАННЫХ //
      // ВЫ МОЖЕТЕ КОПИРОВАТЬ В НОВУЮ ПЕРЕМЕННУЮ С ПОМОЩЬЮ strncpy() ИЛИ //
      // УСТАНОВИТЬ ФЛАГ, ЧТОБЫ СКАЗАТЬ, ЧТОБЫ НАЧАТЬ ДРУГУЮ ЗАДАЧУ //
      Serial.print("RECEIVED MSG: ");
      Serial.println(inputBuffer);

      memset(inputBuffer, 0, sizeof(inputBuffer));
      s_len = 0;             // Сбросьте входной буфер здесь, если вы
                             // уже скопировали данные.
                             // Если вы не сбросите здесь, то
                             // вы не можете начать получать больше
                             // данные последовательного порта. Это ваш
                             // 'программный' последовательный буфер, контраст
                             // с аппаратным последовательным буфером.
    }
  }
}
,