Обработка данных, полученных по последовательному каналу
Эй, я пытаюсь сделать Arduino, который может регистрировать нажатия клавиш с клавиатуры и сохранять это как переменную. Когда он получает информацию от другого arduino по последовательному каналу, я хочу, чтобы он создал переменную из каждой позиции (например, разделенные запятыми значения "/" в этом случае).Затем, если мастер попросит его передать свои данные, он передаст свою строку данных.
Код у меня ниже находится запись нажатий клавиш, когда он получает серийный она ставит его в строку, затем смотрит на первую позицию в этой строке это будет переменная ответить, если ответ равен ардуино адреса (IAM) и позже, если контрольная сумма совпадает, я хотел бы ответить с последовательной строки. почему-то каждый серийный команды, которые я отправляю его, он отражает обратно команду я отправил его правильно, но когда я говорю это, чтобы отделить первую позицию в ответ на приглашение переменной всегда возвращает 1. Не уверен, если это связано с преобразованием символов в целые числа или что-то, если это все, тогда, надеюсь, легко исправить, если знать, как.
Я видел несколько сообщений, в которых говорилось, что лучше использовать массив, а не строку (но это основано на последовательном примере IDE, поэтому я не уверен, что это правильно), и предполагалось, что потребуется полностью переписать, что не похоже на простое исправление. Кроме того, я не знаю, как я буду делать массив из serial, и я, возможно, не знаю, как отделить CSV, я видел несколько примеров, но, к сожалению, я тупица. Я занимаюсь этой проблемой уже 3 дня, и я все еще нахожусь в том же самом месте, но с немного поджаренным мозгом.
#include <Keypad.h>
String inputString = ""; // Строка, содержащая входящие данные
bool stringComplete = false; // является ли строка полной
const byte ROWS = 4; //four rows
const byte COLS = 4; //three columns
char keys[ROWS][COLS] = {
{'1', '2', '3'},
{'4', '5', '6'},
{'7', '8', '9'},
};
byte rowPins[ROWS] = {5, 4, 3, 2}; //подсоединение к распиновке строк клавиатуры
byte colPins[COLS] = {9, 8, 7, 6}; //подключение к распиновке колонок клавиатуры
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
int iAm = 1; //это количество устройств 1
float checkSum = 0.00; //контрольная сумма, чтобы отправить как серийные
float voltage = 5.26; //напряжение в системе
int data[20] {0, 0, 0, 0, 0, 0, 0, 0, 0}; //keypad output call
char rsvp = 0;
int rsvp1 = 0;
void setup() {
Serial.begin(9600);
inputString.reserve(200); // зарезервировать 200 байт для inputString:
}
void loop() {
int key = keypad.getKey();
if (key) {
int key1 = key -48;
if (data[key1] == 1){
data[key1] = 0;
}
else {
data[key1] = 1;
}
}
// печать строки при появлении новой строки:
if (stringComplete) {
rsvp = inputString.charAt(0);
rsvp1 = int(rsvp);
if (rsvp1 = iAm) {
checkSum = voltage * (iAm + data[0] + data[1] + data[2] + data[3] + data[4] + data[5] + data[6] + data[7] + data[8] + data[9]);
Serial.print(inputString);
Serial.println(rsvp1);
Serial.print(iAm);
Serial.print("/");
Serial.print(data[1]);
Serial.print("/");
Serial.print(data[2]);
Serial.print("/");
Serial.print(data[3]);
Serial.print("/");
Serial.print(data[4]);
Serial.print("/");
Serial.print(data[5]);
Serial.print("/");
Serial.print(data[6]);
Serial.print("/");
Serial.print(data[7]);
Serial.print("/");
Serial.print(data[8]);
Serial.print("/");
Serial.print(data[9]);
Serial.print("/");
Serial.print(voltage);
Serial.println("/");
Serial.println(checkSum);
// очистить строку:
inputString = "";
stringComplete = false;
}
}
}
void serialEvent() {
while (Serial.available()) {
// получить новый байт:
char inChar = (char)Serial.read();
// добавьте его в строку ввода:
inputString += inChar;
// если входящий символ является новой строкой, установить флаг, чтобы основной цикл мог
// сделать что-нибудь с этим:
if (inChar == '\n') {
stringComplete = true;
}
}
}
/*
serialEvent происходит всякий раз, когда новые данные поступают в аппаратный последовательный RX. Эта
процедура выполняется между каждым запуском time loop (), поэтому использование задержки внутри цикла может
быть выполнено
if (Serial.available() > 0) {
int recieved = Serial.read();
if (recieved == iAm){
checkSum = voltage * (iAm + data[0] + data[1] + data[2] + data[3] + data[4] + data[5] + data[6] + data[7] + data[8] + data[9]);
Serial.print(iAm);
Serial.print("/");
Serial.print(data[1]);
Serial.print("/");
Serial.print(data[2]);
Serial.print("/");
Serial.print(data[3]);
Serial.print("/");
Serial.print(data[4]);
Serial.print("/");
Serial.print(data[5]);
Serial.print("/");
Serial.print(data[6]);
Serial.print("/");
Serial.print(data[7]);
Serial.print("/");
Serial.print(data[8]);
Serial.print("/");
Serial.print(data[9]);
Serial.print("/");
Serial.print(voltage);
Serial.println("/");
Serial.println(checkSum);
}
}
}
@dogfood, 👍1
Обсуждение0
- Как получить ненулевой выход из HX711 и ячейки загрузки?
- Как остановить серводвигатель в текущем положении при использовании последовательного порта? Я хочу, чтобы он оставался в одном положении при получении «0».
- Метод перебора битов в байте, отправленном по последовательному каналу.
- Arduino Uno по-прежнему загружается и работает, но нет последовательной связи через USB
- Как отправить несколько данных по последовательному каналу в одном байте?
- Как связаться с GPS SIM900a без serial monitor
- Каков наилучший (самый быстрый и надежный) способ отправки сообщений между Python на ПК и Arduino через последовательный порт?
- Отправка строки с Arduino на ESP8266 работает на UNO, но не на Pro Mini
программа не записывает последовательность нажатий клавиш ... он только записывает, какие клавиши были нажаты ... является ли это желаемым поведением?, @jsotola
да, это правильно, его просто, чтобы сказать мастеру, какие выходы он хотел бы выключить или включить, мастер ответит, сообщая клавиатуре, какие выходы, на которых будет включен соответствующий светодиод на клавиатуре. любые дополнительные клавиатуры в той же последовательной сети также получат сообщение и будут знать, чтобы обновить свой спрос на выходы до текущего основного состояния., @dogfood
есть ли у вас ответ на первоначальный вопрос jsotola?, @dogfood
один из ваших операторов "если" не оценивает сравнение двух значений, а фактически присваивает значение одной переменной другой переменной ... это то, что называется "логической ошибкой"... синтаксис правильный, но оператор
if
делает не то, что вы ожидали, @jsotolaглавный вопрос: "почему вы не отлаживаете код?` ... я не вижу никаких операторов serial.print() во всем вашем коде, чтобы вы могли видеть значение переменных по мере выполнения программы, @jsotola
отладочные серийные отпечатки находятся здесь if (rsvp 1 = iAm) { Контрольная сумма = напряжение * (iAm + data[0] + data[1] + data[2] + data[3] + data[4] + data[5] + data[6] + data[7] + data[8] + data[9]); Serial.print(inputString); Serial.println(rsvp 1); Serial.print(iAm); rsvp 1 и iAm-это переменные, сравниваемые в операторе if, который вызывал проблемы, поэтому последовательная печать выполняется сразу после той части кода, которая вызывала проблему, есть ли лучшее место для выполнения отладки или лучший способ сделать это? спасибо, что == подвел меня ближе., @dogfood
используй свою имагинацию ... не предполагайте, что переменная имеет какое-то конкретное значение ... например,
rsvp = inputString.charAt(0);
... вы на самом деле не знаете значенияrsvp
после выполнения этого оператора, @jsotola