Прочитать целое число с помощью Serial.read(), а затем прочитать строку с помощью Serial.readStringUntil(End-Char)

У меня есть такой скетч:

void loop()
    char End_Char = ‘\n’;
    if (Serial.available()) {
        aInt = Serial.read();
    }
    switch (aInt) {
    case 1:
        // выполняет задачу, которая запускается числом
        // Я получаю правильные ответы, если aInt=1
        break;
    case 2:
        bString = Serial.readStringUntil(End_Char);
        Serial.print(bString);
        // Скетч зависает и ничего не делает, если я ввожу 2, но перезапускается через случай 1, если я ввожу 1, когда скетч, по-видимому, заморожен
        break;
    Default:
        break;
    } // end of switch
} // end of loop

Я попытался переупорядочить операторы case, вставляя задержки в разные моменты, чтобы дать время прочитать строку, изменил Serial.setTimeout на 100 и 2000 в разные моменты, чтобы дать время прочитать строку. Однако скетч не может прочитать строку.

Этот код работает:

char end_char = '\n';
String texto;

void setup() {
    Serial.begin(9600);
}

void loop() {
    if (Serial.available()) {
        texto = Serial.readStringUntil(end_char);
        Serial.println(texto);
    }
}

Я использую Arduino UNO, HC-06 и приложение для Android.

Есть идеи?

, 👍1

Обсуждение

Вы действительно отправляете символ конечной строки в конце строки? Также: Вы используете Serial.read() для целого числа. Так вы действительно отправляете сначала двоичную цифру, а затем текст в кодировке ASCII?, @chrisl

Я намеренно не отправил символ конечной строки, но я думаю, что приложение делает это за меня, потому что скетч работает, если я использую Serial.readStringUntil вместо Serial. Да, я отправляю целое число, а затем строку., @Rob

То, что у вас есть char End_Char = /n; в приведенном выше, указывает на то, что вы не показываете реальный код. Также кажется маловероятным, что вы хотите, чтобы тело вашего утверждения if заканчивалось там, где оно есть., @timemage

Мой End_Char работает, если я использую Serial.readStringUntil вместо Serial.read. Где должно заканчиваться утверждение if? Я могу проверить это в других местах., @Rob

Чтобы быть ясным, char End_Char = /n; не будет компилироваться. Если вы думаете, что это компиляция, что-то еще не так., @timemage

Этот код работает как char end_char = '\n'; Текст строки; настройка пустоты() { Серийный номер.начало(9600); } void loop() { если(серийно.доступно()) { texto = Последовательный.readStringUntil(end_char); Serial.println(текст); } }, @Rob

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

Пожалуйста, примите стиль кодирования и придерживайтесь его. Вы сразу же увидите некоторые ошибки., @the busybee

Занятая пчела, не уверенная, помогаешь ли ты мне или смеешься надо мной. У вас есть ответ на мою проблему?, @Rob

Я прочитал комментарии, и кто-то уже указал на ошибку, но неясно, признал ли вы это. Знаете ли вы, что в вашем первом скетче у вас есть char End_Char = '/n'; (недопустимо), а во втором у вас есть char End_Char = '\n'; (допустимо)? По крайней мере, это то, что показано. Возможно, опечатка при вводе вопроса., @lurker

Да, опечатка, когда я ввел вопрос. Я исправил вопрос и показал рабочий код и нерабочий код., @Rob

Я думаю, что вы не поняли, что сказал @christl в их первоначальном комментарии; у вас есть " случай 1:. Это отличается от "случая " 1":. Если вы работаете с текстом и только с текстом, вам нужно последнее. "случай 1:" проверяет, отправили ли вы контрольный символ, а не цифру в тексте., @timemage

Я поддерживаю комментарий мага времени. Не могли бы вы объяснить, пожалуйста, как именно вы отправляете последовательные данные на Arduino? Используете ли вы последовательный монитор Arduino IDE? Или другая программа? Какие настройки использует эта программа? С помощью этой информации мы можем проверить, верна ли наша догадка, поэтому, пожалуйста, сообщайте нам все подробности, отвечая (на все!) мои вопросы., @chrisl

Привет. Я использую телефон на Android для отправки текста на arduino uno через HC06. Пример кода работает с end_char "\n " для получения строк. Мой код также работает для получения целых чисел. Но когда я пытаюсь объединить код, чтобы получить целые числа, которые запускают переключатель для получения текста, он не может прочитать текст., @Rob

как вы посылаете 1? может быть, вы посылаете "1"?, @Juraj