Ввод строки в массив символов
Я нахожусь в процессе проекта, в котором я получаю строку типа «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);
}
}
@sandeep sharma, 👍0
1 ответ
В вашем примере кода есть несколько проблем:
Вы проверяете наличие Serial.available()>0
, но затем предполагаете/захватываете только один символ:
if (Serial.available() > 0) {
s = Serial.read();
}
Возможно, в последовательном приемном буфере находится более одного байта, но вы захватываете только один.
k[10] = s;
Вы назначаете захваченный символ последнему элементу массива байтов, независимо от всего остального. Это представляет две основные проблемы
- Строка в стиле C должна завершаться нулевым символом (
'\0'
), и вы немедленно помещаете реальные данные в позицию, которая должна содержать завершающий байт. - Не существует никакой возможности, чтобы байты 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; // Сбросьте входной буфер здесь, если вы
// уже скопировали данные.
// Если вы не сбросите здесь, то
// вы не можете начать получать больше
// данные последовательного порта. Это ваш
// 'программный' последовательный буфер, контраст
// с аппаратным последовательным буфером.
}
}
}
- Как преобразовать строку в шестнадцатеричный массив
- Очень простая операция Arduino Uno Serial.readString()
- Хранение значений широты и долготы в виде символов с заданной точностью
- Из string в int, проблема
- Матричный дисплей с Arduino UNO (ПРОБЛЕМА)
- Использование индекса для поиска нескольких символов
- Ардуино - Извлечение нескольких строк из последовательного чтения
- Отправлять строки через SPI в обе стороны, используя два Arduino UNO (ведущий к ведомому и ведомый к ведущему)