Как получив в UART "Ring" ответить ATA?
- Войдите на сайт для отправки комментариев
Чт, 26/06/2014 - 13:22
Уважаемые Гуру!
Я только начал осваивать Ардуино.
Подключил старенький Сименс к COM порту через переходник, при входящем он шлет в порт "Ring", чтобы поднять трубку нужно ответить "ATA". Аппаратная реализация мне не подходит, т.к. я планирую, (поднабравшись опыта), перейти на SIM900.
Поделитесь пожалуйста куском кода, который выполняет следующее:
1. Поднимает трубку
2. зажигает после подъема LED PIN13.
У меня не получается разобраться с типами данных, если будет простой пример, то будет от чего оттолкнуться.
Заранее спасибо.
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); } } }Вы бы погуглили. Все уже придумано до нас.
гыыы а ты знатно подколол.. давай зачетку :)
Спасибо за желание помочь, но я уже ковырял ;)
Проблема в том, что этот пример реагирует на одиночный символ, а не на слово.
Мне бы пример с разбором принятого через UART на цельные слова... Да с камментами на кириллице...
А то нутром чую, что 1/2 + 0,5 = ЛИТР, а математически доказать не могу :)
Недавно нагуглил вот такую ссылку 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); // выводим строчку }Вроде как работает. Удачи.
Что получиться в итоге кинь сюда, мне тоже интересна эта тема.
Логично, учитывая что val есть int. Сделайте его string или как там... ну строковый.
это уже называется "Сделайте за меня! мне лень разбираться!"
Автор, ну колись что у тебя там получилось.
В отъезде я, на отдыхе :)
Скоро вернусь, дорвусь до Дуины, о результатах сообщу.
Заранее спасибо за помощь!
Отдых закончился :(, отчитываюсь :)
Вот что получилось:
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); // выводим строчку для контроля // Если нужна индикация светодиодом, то раскомментировать }Сименс отказал, но в компе все работает чОтко, как пацанчак с рАЁна ;)
Переберу Сименса - отпишусь.
Всем спасибо за помощь!
Можно еще почитать ветку: Помогите новичку дописать код. | Аппаратная платформа Arduin
Где-то со 140-вого сообщения начинается про прием строк. Если "хватит духа", то можно вообще все прочитать :)
По поводу вашего кода.
У вас есть потенциальная проблема.
Вы решаете что это "конец строки", на основании того что в Serial больше ничего нет. А это - совсем не факт. Возможно что "строка еще не успела прийти целиком" (хотя, в случае коротнького RING это и маловероятно, но... предыдущие сообщение может оказвать длинным, и свой "RING" - вы пропустите, потому что у вас, в итоге, в Var образуется что-то типа "предыдущиеСообщениеRING", что естественно не равно "RING".
Вообщем "конец строки", нужно определять по символам \r или \n (или и то и другое).