как я могу отобразить / сохранить значение того, что возвращает команду AT

Добрый день всем!
Я работаю над проектом с Arduino UNO и SIM908.
Я пытаюсь понять команду AT.
Когда я вхожу

Serial.print("AT")
Serial.println("AT+CGPSSTATUS?");

Serial возвращает значение, и я хотел бы сохранить это значение в буфер

char buffer[size]

Я не хочу иметь другую строку, чем возвращаемое значение команды AT.

Я также красный этот документ
SIM908 AT Command Manual_V1.01

На странице 13 вы можете прочитать (NB. < CR>< LF> : Я добавил пробел после первого <Остальные там не отображаются)

Префикс «AT» или «at» должен быть установлен в начале каждой команды.
линия. Для завершения командной строки введите < CR>. Команды обычно
сопровождаемый ответом, который включает. «< CR>< LF>< CR>< LF> «В этом документе представлены только ответы, < CR>< LF>
намеренно опущены

Затем я спрашиваю, как я могу «извлечь» ответ между < CR>< LF> а также < CR>< LF>

Глядя на этот пример (дайте мне знать, если я ошибаюсь), как я могу обнаружить < CR>< LF>

void setup()
{
char buffer[200];
Serial.println("AT+CGPSSTATUS?");
}
void loop()
{
if (Serial.available())
{
// HERE I SHOULD CHECK IF CR ANF LF
Serial.write(Serial.read());
// AND SAVE IT IN buffer. IS'T NOT?
}
}

}

Вы понимаете, что я имею в виду?
Как вы могли бы помочь мне сохранить в буфере только возвращаемое значение AT-команды?

Большое спасибо за вашу помощь

1

Решение

Это очень интересно, что ты мне показываешь. Вот как я адаптирую свой код

Я адаптировал свой код и, кстати, создал файл для тестирования Serail, пока мы посылаем команду AT.
Важной функцией являются loop () и read_AT_string (). (Я переименовал read_String в read_AT_string ().

Вот мой код и я объясняю, после вопроса, относительно вашего предложения

#include <SoftwareSerial.h>

int baud_rate = 9600;
int pin_gsm = 3;
int pin_gps = 4;
int pin_power = 5;
//int pin_dtr = 6;
boolean debug = true;
boolean raedy_to_go = false;

// Reading String
#define BUFFERSIZE 200
char buffer[BUFFERSIZE];
char inChar;
int index;

void setup()
{
Serial.begin(baud_rate);
delay(5000);                         // Wait for 5sec after begin

if(debug)
{
Serial.println(F("\n****************************"));
Serial.println(F("STARTING SYSTEM Read AT stream"));
Serial.println(F("******************************"));
}
pinMode(pin_gsm,OUTPUT);            // Set the pins
pinMode(pin_gps,OUTPUT);
pinMode(pin_power,OUTPUT);

powerUpSim908:
if(powerUpSim908())
{
delay(1000);

if(gps_power()){

gsm_enable();
raedy_to_go = true;

if(debug)
{
Serial.println(F("\n****************************"));
Serial.println(F("READY TO GO\n"));
Serial.println(F("****************************\n"));
}
}
else
{
raedy_to_go = false;
if(debug)
{
Serial.println(F("\nNOT READY TO GO.\nGPS could not be power\nRestart the module\nor/and check the battery level.\n"));
}
goto powerUpSim908;
}
}
else
{
raedy_to_go = false;
if(debug)
{
Serial.println(F("\nNOT READY TO GO.\nCheck the battery level.\n"));
}
};
}

void loop()
{
/*
if (Serial.available())
{
Serial.print("Character received: ");
Serial.write(Serial.read());
Serial.println("");
}
*/
if(raedy_to_go)
{

read_AT_string("AT",5000);
delay(10000);

}

}

char read_AT_string(char* command, int timeout)
{
unsigned long previous;
previous = millis();Serial.println(F("\nDISPLAY BUFFER:"));
index=0;

Serial.println(command);
do
{
if(Serial.available() > 0) // Don't read unless
// there you know there is data
{
Serial.println("1");
if (Serial.peek() == 13)           // check if CR (without reading)
{
Serial.println("13");
if(Serial.available() > 0)
{
Serial.read();                // read and ignore
if (Serial.peek()==10)        // then check if LF (without reading)
{
Serial.println("10");
if(index < Serial.readBytesUntil(13, buffer, BUFFERSIZE-1))   // One less than the size of the buffer array
{
Serial.println("b");
inChar = Serial.read();  // Read a character
buffer[index] = inChar;  // Store it
index++;                 // Increment where to write next
buffer[index] = '\0';    // Null terminate the string
}
}
}
}
}
}while(((millis() - previous) < timeout));

Serial.println(buffer);
buffer[0]='\0';
Serial.println(F("END DISPLAY BUFFER"));
}

/* FUNCTION */

boolean powerUpSim908(void)
{
if(debug)
{
Serial.println(F("Powering up SIM908"));
}
boolean turnedON = false;
//uint8_t answer=0;
int cont;

for (cont=0; cont<3; cont++)
{
digitalWrite(pin_power,HIGH);
delay(1500);
digitalWrite(pin_power,LOW);

Serial.println(F("Checking if the module is up"));
if(sendATcommand("AT", "OK", 5000))
{
cont = 4; // Leave the loop
turnedON = true;
}
else
{
turnedON = false;
if(debug)
{
Serial.println(F("\nTrying agin to turn on SIM908"));
}
};
}

if(turnedON)
{
if(debug)
{
Serial.println(F("Module is tunrned up\n"));
}
}
else
{
if(debug)
{
Serial.println(F("Module is NOT tunrned ON\n"));
}
}
return turnedON;
}

boolean sendATcommand(char* ATcommand, char* expected_answer, unsigned int timeout)
{
uint8_t x=0;
bool answer=false;
//åchar response[100];
//buffer[0]='\0';
unsigned long previous;

//memset(response, '\0', 100);    // Initialice the string
//Serial.println(response);

delay(100);

while( Serial.available() > 0) Serial.read();    // Clean the input buffer

if (ATcommand[0] != '\0')
{
Serial.println(ATcommand);    // Send the AT command
}

x = 0;
previous = millis();

index=0;
do
{
if(Serial.available() > 0)
// there you know there is data
{
if(index < BUFFERSIZE-1) // One less than the size of the array // Same as buffer size
{
inChar = Serial.read(); // Read a character
buffer[index] = inChar; // Store it
index++; // Increment where to write next
//Serial.println(index);
buffer[index] = '\0'; // Null terminate the string
}
}
}while(((millis() - previous) < timeout));if(strstr(buffer,"NORMAL POWER DOWN") != NULL)
{
answer = false;
}
else if (strstr(buffer, expected_answer) != NULL)    // check if the desired answer (OK) is in the response of the module
{

/*
Serial.println(F("### BUFFER"));
Serial.println(buffer);
Serial.println(F("### END BUFFER"));
*/
answer = true;
}
else
{
answer = false;
}

if(debug)
{
if(answer)
{
//Serial.println(F("Expected answer : OK!\n"));
}
else
{
//Serial.println(F("Expected answer : KO!\n"));
};
}
return answer;
}void gps_enable(void)
{
if(debug)
{
Serial.println(F("\nEnabling GPS ..."));
}
digitalWrite(pin_gps,LOW);                //Enable GPS mode
digitalWrite(pin_gsm,HIGH);                //Disable GSM mode
delay(2000);
}void gsm_enable(void)
{
if(debug)
{
Serial.println(F("\nEnabling GSM ..."));
}
digitalWrite(pin_gsm,LOW);                //Enable GSM mode
digitalWrite(pin_gps,HIGH);               //Disable GPS mode
delay(2000);
}/* UTILISTIES *//* GPS */

boolean gps_power(void)                            //turn on GPS power supply
{
/*
Serial.println("AT");
delay(2000);
*/

boolean gpspwr = false;
boolean gpsrst = false;if(sendATcommand("AT+CGPSPWR=1","OK",2000))
{
gpspwr = true;
if(debug)
{
Serial.println("turn on GPS power supply => OK");
}
}
else
{
if(debug)
{
Serial.println("turn on GPS power supply => KO");
}
};
//delay(1000);

if(sendATcommand("AT+CGPSRST=1","OK",2000))
{
gpsrst = true;
if(debug)
{
Serial.println("reset GPS in autonomy mode => OK");
}
}
else
{
if(debug)
{
Serial.println("reset GPS in autonomy mode => KO");
}
};   //reset GPS in autonomy mode

delay(1000);

if(gpspwr && gpsrst)
{
return true;
}else
{
return false;
}
}

В строке read_AT_string первый if (Serial.peek () == 13) всегда возвращает false.

1 напечатано, но «13» нет, тогда я предположил

if(Serial.peek()==13)

вернуть ложь

Вот что печатается за 5 секунд

AT DISPLAY BUFFER:
1
1
1
1
1
1
1
1
1
[...] // It prints 1 until now
1

END DISPLAY BUFFER
0

Другие решения

Вот фрагмент кода для обнаружения и удаления CR + LF (Внимание: если читается CR, но за ним не следует LF, он также удаляется):

   if (Serial.peek()==13) {      // check if CR (without reading)
Serial.read();            // read and ignore
if (Serial.peek()==10)    // then check if LF (without reading)
Serial.read();
}

Прочитать остальную часть ответа от последовательный Вы могли бы использовать:

buffer[Serial.readBytesUntil(13, buffer, 199)]=0; // readbytes returns the number of bytes read

Затем вы должны отказаться от конечного CRLF (так же, как и выше).

редактировать

Есть несколько проблем с кодом, который вы разместили в отдельном ответе.

Когда ты powerUpSim908() Вы должны знать, что модуль gsm может отправлять незапрошенные данные (см. документацию, глава 1.4):

Примечание: будет отправлена ​​шестнадцатеричная строка, такая как «00 49 49 49 49 FF FF FF FF»
через последовательный порт со скоростью 115200 бод сразу после
SIM908 включен. Строка должна игнорироваться, так как она используется для
синхронизация с ПК. Введите AT-команду только через серийный номер
порт после включения SIM908 и незапрошенного кода результата «RDY»
получил от последовательного порта.

Это означает, что прежде чем отправлять что-либо, вы должны отбросить эти данные, прочитав их. Я думаю, именно поэтому вы не получаете CRLF при чтении ответа: вы сначала получаете строку HEX или «RDY».

затем readBytesUntil() читает столько байтов, сколько доступно (maxi 199 в моем примере выше), сохраняет их в буфере. Прекращает чтение, когда встречает байт 13 (т.е. CR). Нет необходимости зацикливаться на индексе. Функция возвращает количество символов, которые могут быть прочитаны, и не ставит конечный 0 в конце буфера (т.е. нет допустимой строки C). Если вы хотите использовать функцию не так, как я предложил, вы должны сохранить возвращаемую длину, потому что у вас нет другого способа узнать ее позже.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector