Как получив в UART "Ring" ответить ATA?

mazaysky
Offline
Зарегистрирован: 19.05.2014

Уважаемые Гуру!

Я только начал осваивать Ардуино.

Подключил старенький Сименс к COM порту через переходник, при входящем он шлет в порт "Ring", чтобы поднять трубку нужно ответить "ATA". Аппаратная реализация мне не подходит, т.к. я планирую, (поднабравшись опыта), перейти на SIM900.

Поделитесь пожалуйста куском кода, который выполняет следующее:

1. Поднимает трубку

2. зажигает после подъема LED PIN13.

У меня не получается разобраться с типами данных, если будет простой пример, то будет от чего оттолкнуться.

Заранее спасибо.

xorkrus
Offline
Зарегистрирован: 22.09.2013
int outputPin = 13;                //здесь храним номер контакта
int val;                           //здесь будет храниться принятый символ

void setup()
{
  Serial.begin(9600);              //установка порта на скорость 9600 бит/сек
  pinMode(outputPin, OUTPUT);      //устанавливаем 13 контакт в режим вывода
}

void loop()
{
  if (Serial.available()) {         //если есть принятый символ,
    val = Serial.read();            //  то читаем его и сохраняем в val
    if (val == 'RING') {               //  если принято RING
      digitalWrite(outputPin, HIGH);//  то включаем светодиод
      Serial.print("ATA");            // шлем ATA
    } else {
      digitalWrite(outputPin, LOW);
    }
  }
}

Вы бы погуглили. Все уже придумано до нас.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

гыыы а ты знатно подколол.. давай зачетку :)

mazaysky
Offline
Зарегистрирован: 19.05.2014

xorkrus пишет:

Все уже придумано до нас.

Спасибо за желание помочь, но я уже ковырял ;)

Проблема в том, что этот пример реагирует на одиночный символ, а не на слово.

Мне бы пример с разбором принятого через UART на цельные слова... Да с камментами на кириллице...

А то нутром чую, что 1/2 + 0,5 = ЛИТР, а математически доказать не могу :)

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

Недавно нагуглил вот такую ссылку http://bigbarrel.ru/arduino_serial_uart_net/ сам толком не разобрался как работает но вот что получилось:

String Var;
unsigned long time = 0;
boolean state = false;

void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT); 
}

void loop() {
  Var=""; // очистим Var
  time = millis();
  while (!Serial.available() and (millis()-time<2000))//пока нет данных для приема стоим на месте 2 секунды и выходим
    delay(20);
  delay(200);//ожидаем получения всего сообщения
  while (Serial.available()){ //пока не конец сообщения, читаем данные и формируем строку
    Var = Var + (char)(Serial.read());
  }
  if (Var!=0){//если пришло сообщение
    // ничего не делаем
  }
  if (Var == "hello"){ //если пришло сообщение hello
    state = !state; // изменяем состояние светодиода
  }
  digitalWrite(13, state);
  Serial.println(Var); // выводим строчку
}

Вроде как работает. Удачи.
Что получиться в итоге кинь сюда, мне тоже интересна эта тема.

xorkrus
Offline
Зарегистрирован: 22.09.2013

mazaysky пишет:
Проблема в том, что этот пример реагирует на одиночный символ, а не на слово.

Логично, учитывая что val есть int. Сделайте его string или как там... ну строковый.

mazaysky пишет:
Мне бы пример с разбором принятого через UART на цельные слова... Да с камментами на кириллице...

это уже называется "Сделайте за меня! мне лень разбираться!"

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

Автор, ну колись что у тебя там получилось.

mazaysky
Offline
Зарегистрирован: 19.05.2014

В отъезде я, на отдыхе :)

Скоро вернусь, дорвусь до Дуины, о результатах сообщу. 

Заранее спасибо за помощь!

mazaysky
Offline
Зарегистрирован: 19.05.2014

Отдых закончился :(, отчитываюсь :)

Вот что получилось:

String Var;
unsigned long time = 0;
//boolean state = false;                                   // Если нужна индикация светодиодом, то раскомментировать
//int outputPin = 13;                                      // Если нужна индикация светодиодом, то раскомментировать

void setup() 
{
  Serial.begin(9600);
//  pinMode(outputPin, OUTPUT);                            // Если нужна индикация светодиодом, то раскомментировать
}

void loop() 
{
  Var=""; // очистим Var
  time = millis();
  while (!Serial.available() and (millis()-time<2000))//пока нет данных для приема стоим на месте 2 секунды и выходим
  delay(200);//ожидаем получения всего сообщения
  while (Serial.available())
    { 
      Var = Var + (char)(Serial.read());//пока не конец сообщения, читаем данные и формируем строку
    }
  if (Var == "RING")
    { //если пришло сообщение RING
//      state = true; // зажигаем светодиод                // Если нужна индикация светодиодом, то раскомментировать
      Serial.println("ATA"); // Передаем в порт АТА
    } 
//else                                                     // Если нужна индикация светодиодом, то раскомментировать
//      {                                                  // Если нужна индикация светодиодом, то раскомментировать
//        state = false; // гасим светодиод                // Если нужна индикация светодиодом, то раскомментировать
//      }                                                  // Если нужна индикация светодиодом, то раскомментировать
//  digitalWrite(outputPin, state);                        // Если нужна индикация светодиодом, то раскомментировать
  //Serial.println(Var); // выводим строчку для контроля   // Если нужна индикация светодиодом, то раскомментировать
}

Сименс отказал, но в компе все работает чОтко, как пацанчак с рАЁна ;)

Переберу Сименса - отпишусь.

Всем спасибо за помощь!

leshak
Offline
Зарегистрирован: 29.09.2011

Можно еще почитать ветку: Помогите новичку дописать код. | Аппаратная платформа Arduin

 

Где-то со 140-вого сообщения начинается про прием строк. Если "хватит духа", то можно вообще все прочитать :)  

По поводу вашего кода.
У вас есть потенциальная проблема.
Вы решаете что это "конец строки", на основании того что в Serial больше ничего нет. А это - совсем не факт. Возможно что "строка еще не успела прийти целиком" (хотя, в случае коротнького RING это и маловероятно, но... предыдущие сообщение может оказвать длинным, и свой "RING" - вы пропустите, потому что у вас, в итоге, в Var образуется что-то типа "предыдущиеСообщениеRING", что естественно не равно "RING".
Вообщем "конец строки", нужно определять по символам \r или \n (или и то и другое).