Почему выходит сообщение об ошибке «stray '#' in program»?

Я создаю программу Arduino с модулем SIM800L и хочу проверить кредитный статус SIM-карты. Когда я вручную ввожу команду: AT+CUSD=1,"*123#" в Serial Monitor, все работает нормально.

Но в Arduino (1.8.7) я получаю сообщение об ошибке Блуждающий "#" в программе

при компиляции этой строки скетча: SIM800.print("AT+CUSD=1,"*123#"\r");

У меня недостаточно опыта, чтобы решить эту проблему. Может ли кто-нибудь мне помочь, пожалуйста?

Спасибо. Марко

, 👍1

Обсуждение

Я думаю, что что-то еще сбилось. Почему в «*123#»\r три двойные кавычки? Обратная косая черта — это обычная часть строки, почему вы поместили ее за пределы строки?, @Jot

В команде четыре котировки ("AT+CUSD=1,"*123#"\r"). Когда я вручную ввожу эту команду в Serial Monitor, я набираю AT+CUSD=1,"*123#" ., @Marko Šinkovc

Извините, их действительно четыре. Двойная кавычка " в строке закрывает строку. Вам понадобится escape-обратная косая черта и используйте ее \" так же, как escape-символ используется для \r. https://en.cppreference.com/w/cpp/language/escape, @Jot

Я понимаю, что *123# — это строка, позволяющая провайдеру выполнить эту функцию (вернуть информацию о моем балансе на SIM-карте). Когда я звоню со своего мобильного телефона, я просто набираю *123# и получаю ответ с этой информацией., @Marko Šinkovc

Интересно, что аналогичная команда: SIM800.print("ATD*123#\r"); работает нормально (возврат ОК) и без каких-либо комментариев компилятора., @Marko Šinkovc


1 ответ


3

Используйте обратную косую черту, чтобы получить двойную кавычку в тексте. См.: https://en.cppreference.com/w/cpp/language/escape

Находится ли *123$ в двойных кавычках?

Serial.println("Hello");
Serial.println("I said: Hello to you");
Serial.println("I said: \"Hello\" to you");
Serial.println("AT+CUSD=1,\"*123#\"\r");
Serial.println("AT+CUSD=1,\"*123#\"");

Я думаю, что возврат каретки \r в конце не нужен, когда используется println. Кстати, println добавляет перевод строки \n.

,

Последняя предложенная команда SIM800.println("AT+CUSD=1,\"*123#\""); принимается компилятором, но возвращает только «ОК» — тот же ответ, что и базовая команда SIM800.println("AT+CUSD=1"); . Похоже, параметр \"*123#\ не пересылается на SIM800?, @Marko Šinkovc

.....или провайдер не распознает этот параметр \"*123#\ ?, @Marko Šinkovc

Вы можете попытаться отправить код ASCII этих символов с помощью Serial.write(). Таким образом, вам не придется беспокоиться об экранировании, и компилятор больше не увидит #., @PimV

Команда «*123#» транслируется компилятором в «*123#», включая две двойные кавычки. Я не знаю, распознается ли это, я вижу примеры, в которых стоит запятая и цифра после нее., @Jot

Спасибо всем за добрую волю и ваши усилия помочь мне. Джот, не могли бы вы уточнить, что означает «... после нее поставить запятую и цифру»., @Marko Šinkovc

Например, AT+CUSD=1,"*123#",15. Вам следует использовать команды sim800. На Github есть библиотеки Arduino для sim800, которые вы можете использовать (или использовать в качестве примера)., @Jot