Вообщем с убранной секцией default все заработало. В связи с этим возникло сильное подозрение на то, что из роутре сыплется больше чем нужно. Или какой-то мусор на UART приводит к ложному срабатыванию. Для того чтобы исключить я решил сделать пакетную команду. Вообщем повсидев и подумав, а так же изрядно походив по граблям я написал следующий скетч.
PHP код:
//setup
const int LEDpin = 13; //пин вывода сигнала на светодиод
const long UART_Speed = 57600; //Скорость UART
const byte Byte_Start = byte('a'); //старт-байт в пакете по UART
const byte Byte_Stop = byte('b'); //стоп-байт в пакете по UART
const byte Byte_LEDoff = byte('0'); //команда выключающая светодиод
const byte Byte_LEDon = byte('1'); //команда зажигающая светодиод
const byte Byte_LEDbl = byte('2'); //команда включающая мигание светодиода
const byte all_delay = 10; //задержка выполнения повтора программы, [мс]
const byte UART_delay_max = 100; //таймаут сброса приёмника по UART = all_delay * cnt_delay_max [мс]
const byte led_delay = 1000; //время задержки между фазами (вкл/откл) мигания светодиода [mс]
byte Din[3] = {0, 0, 0};
byte Data = 0;
byte cnt = 0; //счетчик кол-ва пришедших байт по UART
byte led_cnt_delay = 0; //счетчик кол-во раз выполнения программы для управления миганием светодиода
byte UART_delay = 0; //счетчик для таймаута по UART
byte ctrl = B00000100; //управляющий регистр, инициализирован на мигание светодиода после запуска МК
//ctrl[0]: =1 - в структуре собранного пакета обнаружены ошибки
//ctrl[1]: =1 - получена команда
//ctrl[2]: =1 - включен режим мигания светодиода
//ctrl[3]: уровень на светодиод
void setup() {
pinMode(LEDpin, OUTPUT);
Serial.begin(UART_Speed);
}
void loop() {
if (Serial.available() != 0) {
UART_delay = 0;
Din[cnt] = Serial.read();
if (cnt < 2) { //приём байтов и сборка пакета
cnt++;
} else { //если собрали пакет по UART, то проверяем его структуру
cnt = 0;
int i;
for (i = 0; i < 3; i++) {
switch (i) {
case 0:
if (Din[i] != Byte_Start) {
ctrl |= 1<<0;
}
break;
case 1:
break;
case 2:
if (Din[i] != Byte_Stop) {
ctrl |= 1<<0;
}
break;
}
}
if ((ctrl & (1<<0)) == 0) { //анали результат проверки пакета
ctrl |= 1<<1; //пакет собран и он без ошибок
Data = Din[1]; //данные полученные по UART
}
ctrl &= ~(1<<0);
}
} else {
if (UART_delay != UART_delay_max) {
UART_delay++;
} else { //сброс схемы приема по таймауту, ресет схемы UART
UART_delay = 0;
cnt = 0;
}
}
if ((ctrl & (1<<1)) != 0) { //если есть пакет по UART
switch (Data) {
case Byte_LEDoff:
ctrl &= ~(1<<2);
digitalWrite(LEDpin, LOW);
Serial.println("LED OFF");
break;
case Byte_LEDon:
ctrl &= ~(1<<2);
digitalWrite(LEDpin, HIGH);
Serial.println("LED ON");
break;
case Byte_LEDbl:
ctrl |= 1<<2;
Serial.println("LED BLINK");
break;
default:
Serial.print("BAD COMMAND: ");
Serial.println(Data, HEX);
break;
}
ctrl &= ~(1<<1); //сбрасываем бит регистра управления после отработки пришедшего пакета
}
delay(all_delay);
if (led_cnt_delay != led_delay/all_delay) {
led_cnt_delay++;
} else {
led_cnt_delay = 0;
if ((ctrl & (1<<3)) == 0) {
ctrl |= 1<<3;
} else {
ctrl &= ~(1<<3);
}
}
_blink();
}
void _blink() {
if ((ctrl & (1<<2)) != 0) {
if ((ctrl & (1<<3)) == 0) {
digitalWrite(LEDpin, LOW);
} else {
digitalWrite(LEDpin, HIGH);
}
}
}
Этот скетч работоспособен. Позволяет принимать 3 команды управления в пакете с старт- и стоп-байтами и фильтрует пакеты с сломанной структурой, а так же неожидаемые команды. После запуска светодиод мигает.
echo a1b > /dev/ttyUSB0 - светодиод перестает мигать и горит постоянно
echo a0b > /dev/ttyUSB0 - светодиод гаснет
echo a2b > /dev/ttyUSB0 - светодиод начинает мигать
Хорошо было бы понять теперь почему cat /dev/ttyUSB0 ничего не отдает в консоль...