UNO and SIM900R

Dmitriysokol
Offline
Зарегистрирован: 03.06.2016

Добрый день. Помогите разобраться. Sim900R и UNO. Собраны бутербродом, TX с модуля подключен к 11PIN уны, RX к 10 pin. Заливаю скетч стандартный из библиотеки и во всех результатах приходит INIT ERROR. Что делаю не так. Пару дней нормально работало, потом все вот пропало и никак не могу подцепиться. Не отвечает ни на какие команды. По индикации сеть находит и регистрируется. 

// она нужна для работы библиотеки GPRS_Shield_Arduino
#include <SoftwareSerial.h>
 
// создаём объект mySerial и передаём номера управляющих пинов RX и TX
SoftwareSerial mySerial(10, 11);

// буфер PC Serial
char bufferPC_Serial[64];
// буфер GPRS Serial
char bufferGPRS_Serial[64];
 
int i = 0;
int j = 0;
 
void setup()
{
  // включаем GPRS-шилд
  gprs_OnOff();
 
  // открываем последовательный порт для мониторинга действий в программе
  Serial.begin(9600);
 
  // открываем последовательный порт
  // для связи с GPRS-устройством со скоростью 9600 бод
  mySerial.begin(9600);

  while (!Serial) {
    // ждём, пока не откроется монитор последовательного порта
    // для того, чтобы отследить все события в программе
  }
 
  // пока не установится связь с GPRS-устройством, будем крутиться в теле функции
  gprsTest();
}
 
void loop()
{
  // считываем данные с компьютера и записываем их в GPRS Shield
  serialPCread();
  // считываем данные с GPRS Shield и выводим их в Serial-порт
  serialGPRSread();
}
 
void serialPCread()
{
  i = 0;
  // если появились данные с компьютера
  if (Serial.available() > 0) {
    while (Serial.available() > 0) {
      // пока идёт передача данных,
      // записываем каждый байт в символьный массив
      bufferPC_Serial[i++]=(Serial.read());
    }
    // добавляем символ конца строки
    bufferPC_Serial[i] = '\0';
    // записываем данные в GPRS Shield
    mySerial.println(bufferPC_Serial);
    Serial.println("");
    // очищаем буфер PC Serial
    clearBufferPC_Serial();
  }
}
 
void serialGPRSread()
{
    j = 0;
    // если появились данные с GPRS Shield
    if (mySerial.available() > 0) {
      while (mySerial.available() > 0) {
        // пока идёт передача данных,
        // записываем каждый байт в символьный массив
        bufferGPRS_Serial[j++]=(mySerial.read());
    }
    // добавляем символ конца строки
    bufferGPRS_Serial[j] = '\0';
    // выводим полученные данные с GPRS Shield в Serial-порт
    Serial.write(bufferGPRS_Serial);
    // очищаем буфер GPRS Serial
    clearBufferGPRS_Serial();
  }
}
 
void clearBufferPC_Serial()
{
  for (int t = 0; t < i; t++) {
    // очищаем буфер,
    // присваивая всем индексам массива значение 0
    bufferPC_Serial[t] = 0;
  }
}
 
void clearBufferGPRS_Serial()
{
  for (int t = 0; t < j; t++) {
    // очищаем буфер,
    // присваивая всем индексам массива значение 0
    bufferGPRS_Serial[t] = 0;
  }
}
 
void gprsTest()
{
  // бесконечный цикл
  while (1) {
    // ждём 1 секунду
    delay(1000);
    j = 0;
    // посылаем в GPRS Shield АТ-команду "AT"
    mySerial.println("AT");
    // если появились данные с GPRS Shield
    if (mySerial.available() > 0) {
      while (mySerial.available() > 0) {
        // пока идёт передача данных,
        // записываем каждый байт в символьный массив
        bufferGPRS_Serial[j++] = mySerial.read();
      }
      // добавляем символ конца строки
      bufferGPRS_Serial[j] = '\0';
      // посылаем АТ-команду "AT"; если GPRS Shield исправен,
      // он должен вернуть команду "AT";
      // сравниваем всё что находиться в буфере GPRS Shield
      // со строкой "AT\r\n\r\nOK\r\n"
      if (strcmp(bufferGPRS_Serial, "AT\r\n\r\nOK\r\n") == 0) {
        // если всё верно выводим в Serial порт "State OK"
        // и выходим из бесконечного цикла
        Serial.println("State OK");
        break;
      } else {
        // если строки разные, значит произошла ошибка
        // выводим сообщение об ошибке и продолжаем цикл
        Serial.println("Init ERROR");
      }
    }
    // очищаем буфер GPRS Serial
    clearBufferGPRS_Serial();
  }
}
 
void gprs_OnOff()
{
  // настраиваем пин №2 в режим выхода
  pinMode(2, OUTPUT);
  // проверяем состояние 3 пина
  if (digitalRead(3) != HIGH) {
    // если на нём «низкий уровень»
    // подаём на пин 2 «высокий уровень»
    digitalWrite(2, HIGH);
    // ждём 3 секунды
    delay(3000);
  }
  // подаём на пин 2 «низкий уровень»
  digitalWrite(2, LOW);
}

DenBak
Offline
Зарегистрирован: 30.01.2017

День добрый.

Попробуйте вывести в последовательный порт, что модем на AT отвечает. Перед 123 строкой Serial.println(bufferGPRS_Serial)

Dmitriysokol
Offline
Зарегистрирован: 03.06.2016

Спасибо. решилась проблема по другому. Был включен режим сна - AT+CSCLK=1. Поэтому модуль не отвечал ни на что. AT+CSCLK=0 все исправило