Я следовал вашему коду и внес некоторые изменения, чтобы вести себя как ваш пример.
Если ваша строка всегда такова, где !
всегда предшествует #
, и между ними всегда будет несколько чисел для работы, тогда вы можете сделать несколько циклов для ожидания этих маркеров.
Итак, в основном:
- l oop, чтобы продолжать проверять получение a
!
mark; - l oop для продолжения проверки действительных цифр с помощью функции
isdigit()
; - l oop для поиска метки закрытия,
#
Но, опять же, этот алгоритм работает с предоставленным вами примером.
#define MAXSIZE (200)
char Tmp[MAXSIZE];
void setup() {
Serial.begin(9600);
Serial.println("Enter a Message");
}
void loop() {
int counter, i;
char received;
while (Serial.available() <= 0) {
/* keep in the loop*/
}
while (Serial.read() != '!') {
/* keep waiting the '!' */
}
for (i = 0; i < 4; i++) {
if (isdigit((received = Serial.read())) == 0)
break;
Tmp[counter++] = received;
delay(10);
}
while (Serial.read() != '#') {
/* keep waiting the '!' */
}
Tmp[counter] = 0;
Serial.write(Tmp, strlen(Tmp));
newPack(Tmp);
// after you are done, make sure to clean up
// your buffer for the next round
counter = 0;
memset(Tmp, 0, MAXSIZE);
}
Кроме того, я заметил, что вы возвращаетесь в конце функции loop()
. Вы не должны этого делать, потому что встроенные системы, такие как Arduino, должны иметь бесконечное число l oop, чтобы продолжать работать.