Переменные клавиатуры Arduino к последовательному порту
Я уже больше недели пытаюсь создать программу, которая будет хранить мои нажатия клавиш в переменной, а при нажатии клавиши enter она переключится на следующую переменную для хранения нажатий. Программа предназначена для загрузки адресов (в основном IP-адресов) на различные устройства по последовательным соединениям. Поскольку существуют различные типы адресов, каждый раз, когда пользователь нажимает enter на клавиатуре (сделал кнопку # символом '\r'), программа должна переключиться на следующий тип адреса, получить нажатия клавиш с клавиатуры и сохранить их до следующего нажатия '\r'. Моя проблема в том, что я не знаю, как хранить эти адреса в Arduino, и переключаюсь на другой "char" (я использовал char, потому что не знал, как преобразовать их для хранения нажатий клавиш в строку) при каждом нажатии "\r". Я включил обработчик для этой части моего кода. Это мой первый пост здесь, так что если что-то пропало, дайте мне знать. заранее спасибо.
bool handlerManualEntry( void )
{
static uint8_t stateManualEntry = statesFunc::ST_INIT;
char keyval = ReadKey();
switch( stateManualEntry )
{
case statesFunc::ST_INIT:
//делайте все, что вам нужно Здесь (экран, переменные и т.д.)
stateManualEntry = statesFunc::ST_RUN;
break;
case statesFunc::ST_RUN:
//есть ли нажатие клавиши?
if( keyval != NO_KEY )
{
switch( keyval )
{
case '\r':
//когда мы получим возврат, отправьте его в последовательный порт
Serial.print( '\n' );
u8g2log.print('\f');
for(int i=0; i<6; i++)
{
if(i == 0)
{
Serial.print(ethernetIP);
}
else if(i == 1)
{
Serial.print(ethernetSubnet);
}
else if(i == 2)
{
Serial.print(ethernetGetway);
}
else if(i == 3)
{
Serial.print(vmeIP);
}
else if(i == 4)
{
Serial.print(vmeSubnet);
}
else if(i == 5)
{
Serial.print(eventPort);
}
else if(i == 6)
{
Serial.print(timeOut);
}
}
//и закончите тем, что вернете состояние в INIT и вернете true
//stateManualEntry = statesFunc::ST_INIT;
//return true;
break;
case 'D':
u8g2log.print('N');
Serial.print('N');
break;
case 'C':
u8g2log.print('Y');
Serial.print('Y');
break;
default:
//для любого другого ключа, печать на последовательный порт и ЖК-дисплей
u8g2log.print(keyval);
enterAddresses();
break;
}
}
break;
}
return false;
}
void enterAddresses()
{
int x;
if(keyval != '\r')
{
if(pointer == 1)
{
keyval = keypad.getKey();
u8g2log.print(keyval);
ethernetIP += keyval;
}
else if(pointer == 2)
{
keyval = keypad.getKey();
u8g2log.print(keyval);
ethernetSubnet += keyval;
}
}
else if(pointer == 3)
{
keyval = keypad.getKey();
u8g2log.print(keyval);
ethernetGetway += keyval;
}
else if(pointer == 4)
{
keyval = keypad.getKey();
u8g2log.print(keyval);
vmeIP += keyval;
}
else if(pointer == 5)
{
keyval = keypad.getKey();
u8g2log.print(keyval);
vmeSubnet += keyval;
}
else if(pointer == 6)
{
keyval = keypad.getKey();
u8g2log.print(keyval);
eventPort += keyval;
}
else if(pointer == 7)
{
keyval = keypad.getKey();
u8g2log.print(keyval);
timeOut += keyval;
}
pointer++;
u8g2log.print('\f');
}
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'.','0','\r','D'}
};
byte rowPins[ROWS]={39,41,43,45};
byte colPins[COLS]={31,33,35,37};
//Create an object of keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
char keyval;
@EBG15, 👍1
Обсуждение1 ответ
- Подумайте о том, чтобы ограничить пользователя и упростить свой код.
Упростите свой код, введя правила ввода IP-адреса. При вводе адреса IPv4 в десятичной системе счисления требуется, чтобы все 3 цифры всегда использовались для каждого из четырех четырехточечных обозначений. Например, адрес IPv4 192.168.10.20 будет введен как "192168010020".
- Устраните ненужные кнопки клавиатуры.
Единственными ключами, необходимыми для приведенной выше схемы, являются 0, 1, 2, ..., 9. Никакие другие ключи не должны быть обнаружены или поддерживаться дополнительным программным обеспечением.
- Начните с простого, заставьте это работать, а затем добавьте сложность.
По сути, конечный автомат чаще всего используется в качестве базового шаблона кодирования при взаимодействии с пользователем. Отслеживание того, что сделал пользователь, в каком текущем состоянии он находится и куда он может пойти, является задачей конечного автомата. Чтобы реализовать вышесказанное, конечный автомат должен быть достаточно сложным, чтобы отслеживать положение 1, 10 и 100 секунд для каждого значения четырехточечной записи, а также то, какое значение четырехточечной записи вводится в данный момент. Это достаточно сложно для первого прохода. Позже, при последующих проходах, подумайте о добавлении клавиши "прервать", когда пользователь почувствует, что новая попытка в порядке. Еще позже рассмотрите возможность добавления клавиши "пробел". Наконец, подумайте о том, чтобы добавить клавишу "enter" и ввести 3 цифры для каждого требования к значению с четырьмя точками.
- Форматирование переменных из вариационной функции
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- Очень простая операция Arduino Uno Serial.readString()
- форматирование строк в Arduino для вывода
- Arduino Преобразование std:string в String
- Как прочитать входящие ШЕСТНАДЦАТИРИЧНОЕ значение из serial метод read ()?
- Arduino Serial.ReadString() проблема
пожалуйста, отформатируйте весь код, а не только его части ... он не читается так, как вы его представили, @jsotola
в чем причина использования
for(int i=0; i<6; i++)
запускать семь команд ' Serial.print()` последовательно?, @jsotola