Доброе время суток.
Имеем Arduini Nano со скетчем:
void setup() {
Serial.begin(9600);
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
int8_t i;
if (Serial.available()) {
val = Serial.read();
if (val == '1') {
for (i=0; i<5 ; i++) {
digitalWrite(LED_BUILTIN, HIGH);
delay(500);
digitalWrite(LED_BUILTIN, LOW);
delay(500);
}
}
Это упрощенная, для дебага, версия скетча эмулирующего пульт ДУ, просто вместо отправки пакетов на ИК светодиод он моргает встроенным. В исходном виде код работает аналогично, пульт эмулируется.
Если для отправки команд использовать программы picocom, minicom, монитор порта ардуино и любые другие терминалы всё работает. Но если просто плюнуть в порт командой:
echo "1" > /dev/ttyUSB0
Ничего не произойдет. Ардуинка его получает, начинает исполнять, но исполнение срывается. Команда начинает работать только в том случае если открыть на блокирующее чтение фал COM-порта ардуинки, любой командой способной это делать cat, grep и т.д.
cat > /dev/ttyUSB0
При этом на осциллограмме всегда одни и те же данные, щупы подключены непосредственно к выводам UART.
Первый байт это отправленная единица (что значат 4 старших бита я не знаю, они всегда одинаковые в младших передаётся число или буква), второй: “обратный слэш”, он подставляется автоматически.
Т.е. данные до процессора доходят всегда и всегда одинаковые, каких то изменений мне отловить не удалось. Но в одном случае код срабатывает, а в другом срывается. С повторяемостью 100% на 2-х разных платках Nano и разных ПК.
Кто-нибудь имеет представление, чем обусловлено такое поведение?
Под спойлером видео представление правильной и не правильной работы, для лучшего понимания.