Arduino и SIM900 постоянно недоступны.
У меня проблема с моей Arduino MEGA 2560 и модулем SIM900. Я хочу сохранить выходные данные AT-команд, но у меня нет такой возможности. Если я напечатаю mySerial.available(), я получу только 0. С другой стороны, отправка SMS работает нормально.
Initializing...
AT+CMGF=1
AT+CNMI=2,2,0,0,0
OK
Done
AT+CMGL="REC UNREAD"
OK
0
0
0
0
0
0
0
0
0
0
0
Это скетч, который я использую:
#include <SoftwareSerial.h>
//Создаем последовательный объект программного обеспечения для связи с SIM900
SoftwareSerial mySerial(11, 10); //SIM900 Tx & Rx подключен к Arduino №7 и усилителю; #8
String incoming="";
String incoming2="";
String messages="Test";
String auth_num="+49xxxxxxxxx";
char incoming_char=0;
String response = "";
const byte numChars = 32;
char receivedChars[numChars];
boolean newData = false;
int period = 6000;
unsigned long time_now = 0;
void setup()
{
//Начинаем последовательную связь с Arduino и Arduino IDE (Serial Monitor)
Serial.begin(9600);
//Начинаем последовательную связь с Arduino и SIM900
mySerial.begin(9600);
Serial.println("Initializing...");
delay(1000);
mySerial.println("AT+CMGF=1");
mySerial.println("AT+CNMI=2,2,0,0,0"); // Решает, как следует обрабатывать вновь пришедшие SMS-сообщения
//mySerial.println("ATE0");
updateSerial();
Serial.println("Done");
//sms_versenden("xxxxxxxx", "текст");
}
void loop()
{
updateSerial();
Serial.println(mySerial.available());
if(millis() - time_now > period){
time_now = millis();
if(sms_erhalten()){
sms_autorisiert();
}
}
}
void updateSerial()
{
delay(500);
while (Serial.available())
{
mySerial.write(Serial.read());//Пересылаем полученный последовательный порт в последовательный порт программного обеспечения
}
while(mySerial.available())
{
Serial.write(mySerial.read());//Пересылаем полученное программное обеспечение Serial в последовательный порт
}
}
void sms_versenden(String rufnummer,String text)
{
mySerial.println("AT"); //Квитирование связи с SIM900
updateSerial();
mySerial.println("AT+CMGF=1"); // Настройка режима ТЕКСТ
updateSerial();
if(rufnummer.startsWith("0")){
rufnummer.remove(0,1);
mySerial.print("AT+CMGS=\"+49");
mySerial.print(rufnummer);
mySerial.println("\"");
}else if(rufnummer.startsWith("+49")){
mySerial.print("AT+CMGS=\"");
mySerial.print(rufnummer);
mySerial.println("\"");
}else{
return;
}
updateSerial();
mySerial.print(text); //текстовое содержимое
updateSerial();
mySerial.write(26);
}
boolean sms_erhalten()
{
mySerial.print("AT+CMGL=\"REC UNREAD\"\r");
//recvWithEndMarker();
Serial.println(mySerial.available());
delay(30);
while (mySerial.available()){
String inData = mySerial.readStringUntil('\n');
Serial.println("Got reponse from SIM900: " + inData);
}
/*if(mySerial.available()>0){
incoming = mySerial.readString();
Serial.print(incoming);
delay(10);
}*/
updateSerial();
if(incoming.startsWith("+CMGL:"))
{
return true;
}
else{
return false;
}
}
void recvWithEndMarker() {
static byte ndx = 0;
char endMarker = '\n';
char rc;
while (mySerial.available() != 0 && newData == false) {
rc = mySerial.read();
updateSerial();
if (rc != endMarker) {
receivedChars[ndx] = rc;
ndx++;
if (ndx >= numChars) {
ndx = numChars - 1;
}
}
else {
receivedChars[ndx] = '\0'; // завершаем строку
ndx = 0;
newData = true;
}
}
}
void showNewData() {
if (newData == true) {
Serial.print("This just in ... ");
Serial.println(receivedChars);
newData = false;
}
}
String getResponse() {
while(mySerial.available()>0){
response += mySerial.read();
}
return response;
}
Заранее спасибо за каждую идею. Браводельта
@Bravodelta, 👍0
Обсуждение1 ответ
Вместо создания собственной функции используется функция SerialEvent в arduino. В Arduino он действует как последовательное прерывание. Например:
String inputString;
void serialEvent() {
while (Serial.available()) {
// получаем новый байт:
char inChar = (char)Serial.read();
// добавляем его во входную строку:
inputString += inChar;
// если входящий символ является новой строкой, установите флаг, чтобы основной цикл мог
// делаем что-нибудь с этим:
if (inChar == '\n') {
Serial.Println(inputString);
}
}
}
не используйте серийное событие. у него нет преимущества. это то же самое, что проверка Serial.available() в цикле, @Juraj
Система последовательных событий не действует как прерывание. Это ничем не отличается от добавления if (Serial.available())...
в вашу функцию loop()
. Мне бы хотелось, чтобы Arduino никогда не реализовывал это — это глупая идея., @Majenko
@Юрай, почему бы и нет использовать функцию серийного события? Какой вред это причиняет?, @Vaibhav
@Маженко, ты пробовал функцию серийного события?, @Vaibhav
@Vaibhav Хуже того - мне пришлось реализовать это на совместимой платформе, а потом пришлось принять душ с гидроксидом натрия, чтобы смыть с кожи пятна..., @Majenko
это дает ложное ожидание, что оно будет выполнено независимо от того, что вы делаете в цикле(): задержки, бесконечные циклы, @Juraj
- Моделирование Arduino Mega 2560 с GSM модулем с использованием Proteus
- Модуль SIM808: команда определения местоположения GSM (AT+CIPGSMLOC=1,1) дает неверное значение после выполнения команды отправки сообщения (AT+CMGS=+91xxxxxxxx)
- Arduino GSM Shield GSM_READY никогда не готов
- Arduino Mega + SIM808 GSM + модуль GPS + программа включается без нажатия кнопки?
- Как извлечь широту и долготу из GPS
- SIM800L — AT-команды ничего не делают на последовательном мониторе Arduino
- Можно ли изменить официальную библиотеку шилдов arduino GSM для работы с аппаратным serial на mega?
- Проблема с отправкой SMS с GSM SIM900
если вы включите эхо, оно не выведет команды обратно? проверь проводку, @Juraj
@Juraj Эхо включено, и, как вы можете видеть в первом блоке кода, я получаю ответ, но не могу сохранить его в строке., @Bravodelta
попробуйте
mySerial.println("AT+CMGL=\"REC UNREAD\"");
, @Juraj@Юрай К сожалению, это тоже не работает, @Bravodelta