Простейший пример: через COM-порт отправляю некоторое число в контроллер и он выдает значение на аналоговый выход:
#define OUT 3
int i = 125;
void setup() {
Serial.begin(9600);
}
void loop() {
if (Serial.available()) {
i = int(Serial.parseInt());
}
analogWrite(OUT,i);
Serial.print(i);
delay(1000);
}
Проблема: после первого же цикла переменная принимает значение “0“, значение выхода соответствующее.
Пока не отправил данные через COM, переменная имеет значение равное заданному по умолчанию (125), как только отправляю другое число - сначала она принимает нужное значение, но буквально в следующем цикле обнуляется.
Проблема в том, что переменная становится равной “0“ после первого цикла. А мне надо, чтобы она принимала указанное значение до следующего изменения или перезагрузки.
Разве функция “Serial.available” не должна работать только при наличии данных в com-порту?
А кто вам сказал, что у вас через КОМ-порт передается только ваше число? О том, что существует такая вещь, как служебные символы ASCII, вы что-нибудь слышали?
Судя по работы программы, у вас в мониторе порта включена настройка “завершать ввод символом перевода строки” - вот этот-то символ и сбрасывает вашу переменную в ноль.
Отсюда и два варианта решения - либо не передавать ничего, кроме чисел, либо в принимающей программе проверять, что принято, и на служебные символы не реагировать.