на 9600 телефон не умеет работать а на 19200 все команды проходят и ответ есть
Вид для печати
на 9600 телефон не умеет работать а на 19200 все команды проходят и ответ есть
Если все есть то зачем тебе помощь?Цитата:
на 9600 телефон не умеет работать а на 19200 все команды проходят и ответ есть
из gsm.serial приходит не все число а телефон его отсылает проверял на терминале, пробовал массив увеличивать до 200 результат тот же
Я же тебе ответил почему так происходит
Телефон быстрее отправляет , а ардуино медленнее принимает, в итоге принимает не все данные
порядок приема правельный идет
Возьми за основу http://www.compcar.ru/forum/showpost...&postcount=208
и попробуй отправить СМС с текстом #a1
это тоже пробовал может такое быть что все число не влезает в память
Буфер по моему 128 байт
тоесть это число 07919730071111F1040B919706109843F20000213041612235 610380700C должно уместиться в буфере
Как успехи? Мне интересно, может хоть у тебя получится Siemens победить. Кстати, сегодня достал свой S55 и подключая к Ардуине, решил попробовать - подключил всего 2-мя проводами RX и TX. Работает. GND, 5 и 7 вообще не трогал. Т.е. Rx и Тх вполне хватает для подключения.
Успехи есть один канал стал работать но есть еще куча недочетов пока работаю над скетчем , линию ТХ с ардуины на телефон ОБЯЗЯТЕЛЬНО ЧЕРЕЗ ДЕЛИТЕЛЬ ИЛИ ПРЕОБРАЗОВАТЕЛЬ УРОВНЕЙ требует логика писал выше, скетч будет но позже в порядок нужно привести все а то закритикуете его, подключать нужно все линии поищи через гугл подключение сименса к AVR и подобное инфы море только успевай обробатывать , а пока для начала можеш изучить PDU формат чтоб не спрашивать что за цифры пойдут при чтении сообщения
Что имеешь ввиду? Посылает сигналы только в одну сторону?
Чего-то я не нашел. Опиши какой делитель, резисторный или преобразователь использовал?
Я это знаю. Так и подключал. Просто решил попробовать Rx-ом и Tx-ом обойтись - получилось. Но точно так же работает только в одну сторону, как и раньше. Может действительно все дело в делителе напряжения (вернее в его отсутствии)
странно что не нашел гугл с темой поиска подключение сименса к AVR смотрел сейчас самая первая ссылка выскакивает
Я в твоих постах искал. Кроме того, там написано - "Напрямую к COM порту конечно же подключать нельзя", я так думаю, что из-за того, что с СОМ порта через контроллер поступает 12В. А на Ардуне 12В нету.
подключал по такой схеме выводы телефона смотри под свои
выставляем на тестирование данный скетч для сименса с45
#include <NewSoftSerial.h>
char inchar[40];
NewSoftSerial gsm(2,3);
int ledpin = 13;
long previousMillis = 0;
long interval = 30000;
void setup()
{
pinMode(ledpin, OUTPUT);
gsm.begin(19200);
Serial.begin(19200);
gsm.flush();
delay(5000);
gsm.println("AT+CPMS =SM" );
delay(1000);
gsm.println("AT+CNMI=1,1\r");
delay(1000);
}
void loop()
{
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval)
{ previousMillis = currentMillis;
gsm.println("AT+CMGL=4\r");
delay(100); }
//включение @a1
if(gsm.read()=='1'&&gsm.read()=='0'&&gsm.read()==' 3'&&gsm.read()=='8'&&gsm.read()=='0'&&gsm.read()== '7'&&gsm.read()=='0'&&gsm.read()=='0')
{digitalWrite(ledpin,HIGH);
delay(1000);
gsm.println("AT+CMGD=1");
delay(1000);
gsm.println(" ATD+1234567;");
delay(10000);
gsm.println("ATH");}
//выключение @a0
if(gsm.read()=='1'&&gsm.read()=='0'&&gsm.read()==' 3'&&gsm.read()=='8'&&gsm.read()=='0'&&gsm.read()== '3'&&gsm.read()=='0'&&gsm.read()=='0')
{digitalWrite(ledpin,LOW);
delay(1000);
gsm.println("AT+CMGD=1");
delay(1000);
gsm.println(" ATD+1234567;");
delay(10000);
gsm.println("ATH");}
}
Хотелось бы протестировать, но дело в том, что у меня ардуина с телефоном работает так: Ардуина->Телефон=Работает, а вот Телефон->Ардуина=Не работает.
Попробую завтра с делителем напряжения, может получится.
И еще. Мой S55 с 19200 не дружит. Кроме того, как я уже писал, судя по всему, Ардуино МЕГА не дружит с NewSoftSerial, т.к. даже шилд работает в одну сторону. Поэтому буду подключать на Serial1. Завтра приедет новая макетка, буду мучать.
Подключил телефон через делитель. Теперь наконец-то работает Телефон->Ардуино.
Теперь вопросы:
Что дает команда - AT+CPMS =SM?
Команда AT+CNMI=1,1 я так понимаю указывает в каком формате отображать входящие СМС?
При отправке на сименс сообщения @a1 получаю в терминале +CMTI: "ME",1
Любого другого СМС - +CMTI: "ME",2 или 3,4,5 для каждого последующего. Может быть для S55 другие значения CNMI нужны?
вот прогресс есть читай описание ат команд отпишусь позже по описанию скетча
есть описание ат но не могу тут выложить размер 7 мегабайт
В принципе, скетч рабочий, но как-то не так. Прикол вот в чем:
Я сохраняю сообщения в памяти телефона gsm.println("AT+CPMS ='MT'\r" );
При @a1 мне приходит - 0791836027201111040C918360577638660000213022911575 800380700C
Я так понимаю, что текст сообщения это - 00380700?
Но, gsm.read туда не добирается. Он читает с самого начала. Т.е. если я указываю в скетче 07918360 - светодиод нормально включается, после чего, включается AT+CMGD=1 и сообщение успешно удаляется. Каким образом он у тебя доходит до текста сообщения? Сейчас смотрю тему о String (http://arduino.cc/en/Tutorial/StringSubstring) Я где-то там встречал, как из текста выдернуть именно то, что нужно.
Что-то типо такого (судя по инструкции):
Но не работает....PHP код:
#include <string.h>
int ledpin = 13;
long previousMillis = 0;
long interval = 30000;
void setup()
{
pinMode(ledpin, OUTPUT);
Serial1.begin(9600);
Serial.begin(9600);
Serial1.flush();
delay(5000);
Serial1.println("AT+CPMS ='MT'\r" );
delay(1000);
Serial1.println("AT+CNMI=1,1\r");
delay(1000);
}
void loop()
{
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval)
{ previousMillis = currentMillis;
Serial1.println("AT+CMGL=4\r");
delay(100); }
String text=Serial1.read();
if(text.substring(51,60) == "00380700")
{digitalWrite(ledpin,HIGH);
delay(1000);
Serial1.println("AT+CMGD=1\r");
delay(1000);
}
}
возможно как вариант все значение не влезает в буфер и где то нужно его слить(буфер) я тоже с этим долго боролся и число нужно ловить по байтам так как указано в моем скетче
То что по байтам, это понятно. Вот только как добраться до нужных нам. Может все таки попробовать с массивом? Я думаю все 60 байт загнать в массив (по одному байту в каждую ячейку), потом открыть ячейки с 52 по 59, присвоить им имя и сравнить его с нужным нам. Сейчас мучаюсь над этим.
тоже так по началу пробовал но если он не читает эти байты то и в массив не внесет их хотя работа с массивом и распечатка данных массива мне помогла понять в какой момент слить флеш надо
Вот этот код читает побайтно пока не найдет знак '#'
Чип скажи пожалуйста в буфер информация заносится только после команды Serial.read() или информация сразу приходит в буфер и читается из буфера
Информация в буфер попадает не зависимо от пользовательского кода по прерыванию.
Serial.read() это функция которая читает первый из буфера и удаляет его, продвинув на его место следующий байт
Serial.available() указывает сколько принятых байт в буфере
Chip, этот код не подойдет. В этом коде, мы уже прописываем то, что должно прийти. Это для текстового формата. А нам нужно PDU побороть и вытащить - 00380700 из этого 0791836027201111040C918360577638660000213022025201 800380700C.
Можно было бы всю строку перебрать и дойти до 52 байта, но середина строки постоянно меняется (дата и время).
Я вот только не пойму, почему в моем коде substring не работает. А эта функция решила бы нашу проблему...
Принимайте еще одного сумасшедшего ;)
Тестирую на сименсе ME45 c freeduino2009 через резист делитель
нормально выходит только позвонить с ардуины :)
Вот по этому скетчу Светодиод редко поморгает и все! что на 19200 что на 9600
СМСки не стираются... но уже что-то!
#include <NewSoftSerial.h>
char inchar[100];
NewSoftSerial gsm(2,3);
int ledpin = 13;
void setup()
{
pinMode(ledpin, OUTPUT);
gsm.begin(19200);
Serial.begin(19200);
gsm.flush();
delay(5000);
gsm.println("AT+CNMI=1,1");
delay(2000);
}
void loop()
{
//gsm.println(" ATD+12345678;");
//delay(3000);
if(gsm.available() >0 && gsm.read()=='1'){gsm.println(" AT+CMGL=0 ");
digitalWrite(ledpin, HIGH);delay(1000);digitalWrite(ledpin, LOW);delay(1000);
for(int i=0;i<98;i++){inchar[i]=gsm.read();delay(100);}
//gsm.flush();
digitalWrite(ledpin, HIGH);delay(1000);digitalWrite(ledpin, LOW);delay(1000);
for(int i=0;i<98;i++){Serial.print(inchar[i]);}
digitalWrite(ledpin, HIGH);delay(1000);digitalWrite(ledpin, LOW);delay(1000);
gsm.println("AT+CMGD=1");
digitalWrite(ledpin, HIGH);delay(1000);digitalWrite(ledpin, LOW);delay(1000);
gsm.flush();
}
}
А вот в этом сообщении #256 скетч... ничего не происходит.
И еще есть вопрос!? в скетчах с Serial1 на какие пины мне сажать tx rx ??? На пин0 и пин1 для платки freeduino2009 ???
Пока только 3-й день этим как занялся...
для начала смотри какие команды поддерживает телефон для прочтения смс для удаления смс и посмтори в гугле есть справочник at команд
справочник ATкоманд взял от сюда http://www.microchip.ru/phorum/read....=37681&t=37681 с 4поста, он на русском
Ну да, надо смотреть что телефон поддерживает, а что нет.
а все таки в скетчах с Serial1 на какие пины мне сажать tx rx ???
в скетчах с NewSoftSerial мы указываем.... а с Serial1 ???
тебе придется ставить эксперементы с програмным сериал подключать библиотеку. это только на меге есть несколько сериал портов. для начала подключись к терминалу залей скетч в самом начале где то и смотри команды может и смысла нет с этим телефоном работать не все сименсы одинаково хороши я на с 45 и с 55 работаю сейчас
Ну с терминалом putty я уже вчера наигрался(потом продолжу)
Сегодня звонил с МК.... и принимал МК команду @а1 результат светодиод моргал.
А сейчас меня интересует та добрая половина скетчей, что в этой ветке в которых нету библиотеки NewSoftSerial. Я не пойму куда мне подключать tx и rx телефона...и вообще подходят ли мне эти скетчи?
Вообще меня тоже здорово интересует возможность управления МК по средством именно СМС ... жаль только что пока не в зуб ногой тут.
У тебя какой контроллер?
Какая скорость обмена у телефона?
Это не что-то... Это ничего. Светодиод моргает, когда ты скетч загружаешь, либо когда ардуина принимает данные с порта. СМС не стираются, потому, что не выполнено условие -
Когда оно выполняется, СМС нормально удаляются. И вообще, где ты взял этот скетч? Это что-то непонятное...PHP код:
if(gsm.available() >0 && gsm.read()=='1'){gsm.println(" AT+CMGL=0 ");
digitalWrite(ledpin, HIGH);delay(1000);digitalWrite(ledpin, LOW);delay(1000);
for(int i=0;i<98;i++)
Ничего и не будет. Этот скетч написан для модуля поддерживающий текстовый формат СМС, а твой Сименс поддерживает только PDU. Можно его приспособить для Сименса, но сначала нужно разобраться, как вытащить нужные байты. Как раз над этим я сейчас и мучаюсь (из-за нехватки времени, не так "фанатично", как хотелось бы)
Смотри документацию к freeduino2009. На МЕГЕ, Serial1 это 18 и 19. И старайся, пока не разберещься не использовать NewSoftSerial, т.к. замечено, что на некоторых версиях Ардуино, она не совсем корректно работает. Во всяком случае на МЕГЕ.
Для лучшего понимания, почитай тему с самого начала. Я ее создал в первый день, как только увидел Ардуину. До этого, никогда с этим не сталкивался.
И еще, если хочещь зажечь светодиод, отправь на телефон СМС и в Serial Monitor'e, посмотри, что придет. Потом попробуй этот скетч, только в условии, вместо N пропиши первые 8 байт (по-байтно), которые видишь в Serial Monitor'e:
PHP код:
#include <NewSoftSerial.h>
char inchar[40];
NewSoftSerial gsm(2,3);
int ledpin = 13;
long previousMillis = 0;
long interval = 30000;
void setup()
{
pinMode(ledpin, OUTPUT);
gsm.begin(19200); // эксперементируй со скоростью
Serial.begin(19200);
gsm.flush();
delay(5000);
gsm.println("AT+CPMS =SM" ); // тут тоже эксперементы, или SM или МТ
delay(1000);
gsm.println("AT+CNMI=1,1\r");
delay(1000);
}
void loop()
{
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval)
{
previousMillis = currentMillis;
gsm.println("AT+CMGL=4\r");
delay(100);
}
if(gsm.read()=='N'&&gsm.read()=='N'&&gsm.read()=='N'&&gsm.read()=='N'&&gsm.read()=='N'&&gsm.read()== 'N'&&gsm.read()=='N'&&gsm.read()=='N')
{
digitalWrite(ledpin,HIGH);
delay(1000);
}
}
}
metaforos
Я теперь хоть и не уверен, НО у меня светодиод в том скетче включался выключался после прихода смс! с сообщением @a1, к томуже я менял время delay и светодиод отрабатывал это время как положенно. А вот смс с сообщением @а0 уже ничего не делал.
Скетч лежит 3-4странички назад.
Вообще то в скетче еще не разбирался если вообще разбирусь...нету опыта програмирования ...работаю по примерам смотрю результаты и т.д....как-то так :D
разбирайся, я тоже не много знаю про ардуино но оно заработало через 2 недели мучений и к этой части кода не стоит цепляться
if(gsm.available() >0 && gsm.read()=='1')
{
gsm.println(" AT+CMGL=0 ");
digitalWrite(ledpin, HIGH);
delay(1000);
digitalWrite(ledpin, LOW);
delay(1000);
for(int i=0;i<98;i++)
тут оно замигает в любом случае если в порту что то появилось
andrei2882
Жаль что это так :( я в расстройство счас впаду.
А так у меня в терминале кроме нормальных ответов вылетает и эта длинная строка видимо принятое смс( а может и нет) но она в виде закорючек...еслиб в нормальном виде была то можно было бы хоть как-то разобрать ее...а так :(
Завтра день детальных тестов у меня... отсчитаюсь о понятом и нет!
в этой длинной строчке нет ничего сложного тебе ее суть не особо важна но если интересно читай про PDU формат из этой строчки нужное нам в конце находиться, отпровляй к примеру @a1 (англ. язык) записал строку в конце должно быть что то вроде '380700C' потом отпрвляй @a0 смотри что пришло должно быть что то типа 380300C, закономерность быстро найдется суть самой раскодировки НЕНУЖНА ищи закономерность в символах и с ними работай