Доброго времени суток. Возникла нужда написать программу которая парсит нажатия клавиатуры устройства которое отдает данные о нажатых кнопках по UART. не найдя чего то похожего написал сам в меру своего понимания. Случился небольшой затык в обработчике состояния клавиатуры который будут брать состояние кнопок из массива. Прошу совета.
//=================================================================
String strData = "";
boolean recievedFlag;
//===============================================================================
byte buttons[2][33] = {{0x07,0x06,0x05,0x0F,0x0E,0x0D,0x17,0x16,0x15,0x1E,0x1F,0x1D,0x27,0x26,0x25,0x04,0x03,0x1C,0x24,0x23,0x0C,0x0B,0x14,0x13,0x1B,0x2F,0x2D,0x2E,0x36,0x2C,0x37,0x35,0x34},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}};
char data[2];
//=================================================================
void setup()
{
Serial1.begin(9600);
Serial.begin(9600);
}
//=================================================================
void loop()
{
if(Serial1.available() > 0)// если есть что то на вход
{
strData = ""; // очистить строку
while (Serial1.available()>0) // пока идут данные
{
strData += (char)Serial1.read(); // забиваем строку принятыми данными
delay(2); // обязательно задержка, иначе вылетим из цикла раньше времени
}
recievedFlag = true; // поднять флаг что получили данные
}//конец if(Serial1.available() > 0)// если есть что то на вход
if(recievedFlag) // если есть принятые данные
{
strData.toCharArray(data, 3);//записывает строку в массив – буфер buf (типа char []) с начала и до длины len.
Serial.print("prefix "); Serial.print(data[0], HEX); Serial.print(" data "); Serial.println(data[1], HEX);
Serial.println("recievedFlag ");
for(byte i=0; i<32; i++)
{
if(buttons[0][i] == data[1])
{
if (data[0] == 0x5F)//нажатие
{
buttons[1][i] = 1;
Serial.println("button ON ");
i = 32;
}
if (data[0] == 0x6F)//отпускание
{
buttons[1][i] = 0;
Serial.println("button OFF ");
i = 32;
}
}//конец if(buttons[0][i] == data[1])
}//конец for(byte i=0; i<32; i++)
for(byte i=0; i<32; i++)
{
Serial.print("0x"); Serial.print(buttons[0][i], HEX); Serial.print(" ");
}
Serial.println();
for(byte i=0; i<32; i++)
{
Serial.print(buttons[1][i]); Serial.print(",");
}
Serial.println();
}//конец if(recievedFlag)
recievedFlag = false; // данные обработаны и сохранены, выходим !
//ОТСЮДА И НИЖЕ МОЖНО ПИСАТЬ или писать))
}
//=================================================================.//введите или вставьте сюда код
это скан коды клавиатуры для справки
Спойлер
Кнопка "1" - нажата 0x5F, 0x07 отпускание 0x6F, 0x07.
Кнопка "2" - нажата 0x5F, 0x06 отпускание 0x6F, 0x06.
Кнопка "3" - нажата 0x5F, 0x05 отпускание 0x6F, 0x05.
Кнопка "4" - нажата 0x5F, 0x0F отпускание 0x6F, 0x0F.
Кнопка "5" - нажата 0x5F, 0x0E отпускание 0x6F, 0x0E.
Кнопка "6" - нажата 0x5F, 0x0D тпускание 0x6F, 0x0D.
Кнопка "7" - нажата 0x5F, 0x17 отпускание 0x6F, 0x17.
Кнопка "8" - нажата 0x5F, 0x16 отпускание 0x6F, 0x16.
Кнопка "9" - нажата 0x5F, 0x15 отпускание 0x6F, 0x15.
Кнопка "0" - нажата 0x5F, 0x1E отпускание 0x6F, 0x1E.
Кнопка "*" - нажата 0x5F, 0x1F отпускание 0x6F, 0x1F.
Кнопка "#" - нажата 0x5F, 0x1D отпускание 0x6F, 0x1D.
Кнопка "СИО" - нажата 0x5F, 0x27 отпускание 0x6F, 0x27.
Кнопка "Запрос" - нажата 0x5F, 0x26 отпускание 0x6F, 0x26.
Кнопка "Повтор" - нажата 0x5F, 0x25 отпускание 0x6F, 0x25.
Кнопка "Сообщение" - нажата 0x5F, 0x04 отпускание 0x6F, 0x04.
Кнопка "Авто" - нажата 0x5F, 0x03 отпускание 0x6F, 0x03.
Кнопка "Режим" - нажата 0x5F, 0x1C отпускание 0x6F, 0x1C.
Кнопка "Видио" - нажата 0x5F, 0x24 отпускание 0x6F, 0x24.
Кнопка "Помощ" - нажата 0x5F, 0x23 отпускание 0x6F, 0x23.
Кнопка "резерв 1" - нажата 0x5F, 0x0C отпускание 0x6F, 0x0C.
Кнопка "резерв 2" - нажата 0x5F, 0x0B отпускание 0x6F, 0x0B.
Кнопка "резерв 3" - нажата 0x5F, 0x14 отпускание 0x6F, 0x14.
Кнопка "резерв 4" - нажата 0x5F, 0x13 отпускание 0x6F, 0x13.
Кнопка "резерв 5" - нажата 0x5F, 0x1B отпускание 0x6F, 0x1B.
Кнопка "Стрелка Влево" - нажата 0x5F, 0x2F отпускание 0x6F, 0x2F.
Кнопка "Стрелка Вправо" - нажата 0x5F, 0x2D отпускание 0x6F, 0x2D.
Кнопка "Стрелка Вверх" - нажата 0x5F, 0x2E отпускание 0x6F, 0x2E.
Кнопка "Стрелка Вниз" - нажата 0x5F, 0x36 отпускание 0x6F, 0x36.
Кнопка "Меню" - нажата 0x5F, 0x2C отпускание 0x6F, 0x2C.
Кнопка "Омена" - нажата 0x5F, 0x37 отпускание 0x6F, 0x37.
Кнопка "ОК" - нажата 0x5F, 0x35 отпускание 0x6F, 0x35.
Кнопка "F" - нажата 0x5F, 0x34 отпускание 0x6F, 0x34.