Почему выходит сообщение об ошибке «stray '#' in program»?
Я создаю программу Arduino с модулем SIM800L и хочу проверить кредитный статус SIM-карты. Когда я вручную ввожу команду: AT+CUSD=1,"*123#" в Serial Monitor, все работает нормально.
Но в Arduino (1.8.7) я получаю сообщение об ошибке
Блуждающий "#" в программе
при компиляции этой строки скетча:
SIM800.print("AT+CUSD=1,"*123#"\r");
У меня недостаточно опыта, чтобы решить эту проблему. Может ли кто-нибудь мне помочь, пожалуйста?
Спасибо. Марко
@Marko Šinkovc, 👍1
Обсуждение1 ответ
Используйте обратную косую черту, чтобы получить двойную кавычку в тексте. См.: 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
- C++ против языка Arduino?
- avrdude ser_open() can't set com-state
- Как читать и записывать EEPROM в ESP8266
- Float печатается только 2 десятичных знака после запятой
- устаревшее преобразование из строковой константы в 'char*'
- Запрограммировать ATMega328P и использовать его без платы Arduino.
- Разница между print() и println()
- Как исправить: Invalid conversion from 'const char*' to 'char*' [-fpermissive]
Я думаю, что что-то еще сбилось. Почему в «*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