Serial.read(); и конечный автомат для AT-команд
У меня возникла странная проблема: индекс массива не увеличивается, и когда я печатаю значение из serialdata[pointingfinger], он просто выдает пустое место. Это машина состояний (я полагаю), которая должна проверять, какой символ в данный момент записывается в массив, и его позицию, чтобы избежать поиска по нему позже. Когда у нас есть законченная строка, она переключает большую машину состояний в другой режим (который проверяет, есть ли команда на четыре символа дальше), когда обработка завершена, она должна вернуться к получению следующей строки.
Это Arduino Leonardo, Serial — это USB, а Serial1 — это то место, где я отправляю и получаю AT-команды.
const long interval = 1000;
static long currentMillis;
char plussignpoint = 0; //Чтобы определить, где находится + в +CCLK в массиве символов
char serialdata[256] = ""; //Массив для хранения символов перед анализом
int rdpos = 0;
int pointingfinger = 0;
char timeen = 0;
byte stat0 = 0;
char futstat0 = 0;
char searchcharpos = 0;
char enabled = 0;
char searchchartype = 0;
char smsvalid = 0;
void setup()
{
Serial.begin(9600);
Serial1.begin(9600);
Serial1.write("ATE0\r");
}
void loop() {
if (millis() - currentMillis >= interval)
{
Serial1.print("AT+CCLK?\r"); //спросить время
enabled = 1;
currentMillis = millis();
}
if (enabled == 1) {
if (stat0 == 0) {
if (Serial1.available () > 0) {
pointingfinger++;
serialdata[pointingfinger] = Serial1.read();
if (serialdata[pointingfinger] == '+') {
searchcharpos = pointingfinger;
searchchartype = 1;
futstat0 = 1;
}
else if (serialdata[pointingfinger] == '$') {
if (smsvalid = 1) {
searchcharpos = pointingfinger;
searchchartype = 2;
futstat0 = 2;
}
if (smsvalid = 0) {
stat0 = futstat0;
pointingfinger = 0;
}
}
else if (serialdata[pointingfinger] == '\n') {
stat0 = futstat0;
pointingfinger = 0;
enabled = 0;
}
else if (serialdata[pointingfinger] == '\r') {
stat0 = futstat0;
pointingfinger = 0;
enabled = 0;
}
else {
stat0 = 0;
pointingfinger = 0;
}
}
if (pointingfinger == 255) {
pointingfinger = 0;
enabled = 0;
}
}
}
}
ПРАВКА: Я забыл указать, какие AT-команды он должен анализировать:
Arduino: AT+CCLK?
SIM800H: +CCLK: "04/01/01,01:35:31+00"
OK
@A. Somov, 👍1
0
Смотрите также:
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- В чем разница между Serial.write и Serial.print? И когда они используются?
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Программы построения последовательных данных
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Очистить существующий массив при получении новой последовательной команды