我有一个与 AT 命令通信的 sim800l 设备。AT+SAPBR=3,1,"CONTYPE","GPRS";
循环函数接受和处理,还将模块的响应显示到控制台。
void loop()
{
if (Serial3.available()){
Serial.write(Serial3.read());
}
if (Serial.available()){
Serial3.write(Serial.read());
}
}
通过发出 AT 命令AT+SAPBR=3,1,"CONTYPE","GPRS";
,我得到 OK 或 ERROR 响应。
我想用条件 if 语句处理响应。
我在互联网上找到了答案,但它们对我不起作用。
int x;
String str;
void loop()
{
if(Serial.available() > 0)
{
str = Serial.readStringUntil('\n');
x = Serial.parseInt();
}
}
我在网上看到你可以使用这些函数来确定答案。
String sendATCommand(String cmd, bool waiting) {
String _resp = ""; // Переменная для хранения результата
Serial.println(cmd); // Дублируем команду в монитор порта
SIM800.println(cmd); // Отправляем команду модулю
if (waiting) { // Если необходимо дождаться ответа...
_resp = waitResponse(); // ... ждем, когда будет передан ответ
// Если Echo Mode выключен (ATE0), то эти 3 строки можно закомментировать
if (_resp.startsWith(cmd)) { // Убираем из ответа дублирующуюся команду
_resp = _resp.substring(_resp.indexOf("\r", cmd.length()) + 2);
}
Serial.println(_resp); // Дублируем ответ в монитор порта
}
return _resp; // Возвращаем результат. Пусто, если проблема
}
String waitResponse() { // Функция ожидания ответа и возврата полученного результата
String _resp = ""; // Переменная для хранения результата
long _timeout = millis() + 10000; // Переменная для отслеживания таймаута (10 секунд)
while (!SIM800.available() && millis() < _timeout) {}; // Ждем ответа 10 секунд, если пришел ответ или наступил таймаут, то...
if (SIM800.available()) { // Если есть, что считывать...
_resp = SIM800.readString(); // ... считываем и запоминаем
}
else { // Если пришел таймаут, то...
Serial.println("Timeout..."); // ... оповещаем об этом и...
}
return _resp; // ... возвращаем результат. Пусто, если проблема
}
String 是一个非常慢的类。我有一个格式为“SYNC_R000000000000000END”的字符串被这个类解析了很长时间,大约一秒钟。
结果,我这样写: 1)我们正在寻找包的开头(即SYNC_) 1.1)如果找到,我们继续算法。如果没有,我们正在等待更多,一下子是最后一个数据包的残余。同时,我们设置了一个定时器来跟踪超时 2)寻找数据包的结尾(即END)。与1.1类似 3)然后我们得到数据开头的索引(即整行可能包含,例如,这样的文本“garbageSYNC_R0000000000000000ENDrosum”)和数据的结尾。基于这些指标,我们得到有用的数据。
对于搜索,我在字符串中使用了通常的、快速的但自己编写的子字符串搜索功能。T e 愚蠢地将每个字节与模板进行比较。如果序列匹配,则找到子字符串。
要调试所有这些,请确保模块中的字符串完整无缺。然后解析它是一个技术问题。如果你需要一个例子 - 我稍后会扔掉它