Ок. Завтра буду пробовать.
Вид для печати
Ок. Завтра буду пробовать.
Chip, с подправленным кодом тоже никакой реакции. Я все смотрю на этот скетч - http://www.compcar.ru/forum/showpost...&postcount=173 (где управление на 4 устройства) и не пойму, почему он воспринимает только #a1b1c1d1 и никак не получается его разделить на #a1 или #b1 или #c1 или #d1... Вроде бы как "на вид" все прсто, но ничего не работает...
Все просто , в этом скетче да и во всех остальных, СМС попадает в сериал буфер всего один раз и при чтении из буфера с помощью serial.read данные из этого буфера удаляются. Ты сначала читаешь и удаляешь а1 потом b1
и так далее. После удаления обработки пришедшей СМС, новая СМС в буфер не попадет ни как, потому что в цикле она нигде не читается
Попробуй еще 1 вариант кода посылать СМС нужно двумя байтами а1 или с0, тоесть без знака #
Я так понимаю что ты в курсе что СМС посылать нужно не раньше чем через 30сек. после запуска скетча?
PHP код:
#define led1 10
#define led2 11
#define led3 12
#define led4 13
char instring[3];
void setup()
{
for(byte i=10; i<14; i++) pinMode(i, OUTPUT);
Serial1.begin(9600);
delay(30000);
Serial1.println("AT+CMGF=1\r");
delay(200);
}
void loop()
{
Serial1.println("AT+CNMI=3,0,0,0\r");
delay(300);
sms_read();
delay(1000);
}
void sms_read()
{
if(Serial1.available() >1)
{
for(byte i=0; i<2; i++) instring[i]=Serial1.read();
switch (instring[0])
{
case 'a': digitalWrite(led1, (instring[1]-48));
break;
case 'b': digitalWrite(led2, (instring[1]-48));
break;
case 'c': digitalWrite(led3, (instring[1]-48));
break;
case 'd': digitalWrite(led4, (instring[1]-48));
break;
default: Serial1.flush();
}
Serial1.println("AT+CMGD=1,4\r");
}
}
Не работает. Почему (instring[1]-48), т.е. что означает -48?
Возможно что то ты делаешь не так.
А для чего ты сделал пауза 30сек?
Можно попробовать убрать строку с обнулением всех СМС
Пауза в 30 секунд, для того, чтобы шилд успел зарегистрироваться в сети. Когда эксперементирую, я ее вообще убираю и ориентируюсь по светодиоду на шилде. А если не удалять СМС, они сохраняются и Ардуина обрабатывает самое первое СМС, а остальные игнорирует.
Т.е с командой "AT+CNMI=3,0,0,0\r" сообщения видны в таком формате:
+СMT: "номер телефона отправителя","номер центра СМС","дата, время", длина СМС
Текст СМС
Если не удалять, получается:
+СMT: "номер телефона отправителя","номер центра СМС","дата, время", длина СМС
Текст СМС
+СMT: "номер телефона отправителя","номер центра СМС","дата, время", длина СМС
Текст СМС
+СMT: "номер телефона отправителя","номер центра СМС","дата, время", длина СМС
Текст СМС
+СMT: "номер телефона отправителя","номер центра СМС","дата, время", длина СМС
Текст СМС
и т.д.
Ну так если в таком формате СМС получаем, то их нужно принимать совсем по другому
Попробуй вот такой код
Формат СМС #a1
PHP код:
#define led1 10
#define led2 11
#define led3 12
#define led4 13
char device,on_off;
void setup()
{
for(byte i=10; i<14; i++) pinMode(i, OUTPUT);
Serial1.begin(9600);
delay(30000);
Serial1.println("AT+CMGF=1\r");
delay(200);
Serial1.println("AT+CNMI=3,0,0,0\r");
delay(200);
}
void loop()
{
sms_read();
}
void sms_read()
{
if(Serial1.available()>2)
{
if(Serial1.read()=='#')
{
device=Serial1.read();
on_off=Serial1.read();
switch (device)
{
case 'a': digitalWrite(led1, on_off-48);
break;
case 'b': digitalWrite(led2, on_off-48);
break;
case 'c': digitalWrite(led3, on_off-48);
break;
case 'd': digitalWrite(led4, on_off-48);
break;
}
Serial1.println("AT+CMGD=1,4\r");
Serial1.flush();
}
}
}
Теперь все работает отлично. Только объясни пожалуйста, почему вместо int led, ты используешь #define led1 и что такое -48. Также, мне не совсем понятна Serial1.flush();
int led занимает в оперативной памяти место 2 байта
#define led1 это указание компилятору чтобы он везде где встретит led1 заменит его на 10
-48 это преобразование из типа Char в тип Byte
Serial1.flush() очищает сериал буфер
Я так понимаю, что вместо #define можно было использовать и int, но c #define мы просто экономим память?
А вот с преобразованием, -48 не понятно. По ASCII 48 это вроде-бы 0... Преобразование из Char в Byte дает нам дополнительно еще 7 байт? Зачем? Если можно, опиши пожалуйста подробнее (научно-практический комментарий :) )
Грубо говоря Да. Нет желания все расписывать, но лучше писать #defineЦитата:
Я так понимаю, что вместо #define можно было использовать и int, но c #define мы просто экономим память?
Тут гдавное понять разницу между Char и числовым типомЦитата:
А вот с преобразованием, -48 не понятно. По ASCII 48 это вроде-бы 0...
Нет , ничего нам дополнительного не дает. кроме конвертирования в другой типЦитата:
Преобразование из Char в Byte дает нам дополнительно еще 7 байт? Зачем?
Можно код немного изменить и можно будет управлять при помощи СМС как отдельными источниками так и всеми источниками сразу одним пакетом
Здравствуйте , скажите пожалуйста как конвертировать в текстовый формат сообщение из PDU
А что такое PDU ?
Сименс завелся у меня и радует вот только этот формат победить осталось или из сериал порта так читать и сравнивать по условию
Легче так читать, только сравни текст в формате PDU при разном тексте СМС и посмотри, где именно в строке между ними различия.
Здравствуйте , скажите пожалуйста как принять такое число 07919730071111F1040B919706109843F20000213011512314 610380700C (сообщение в PDU формате)из сериал порта в переменную чтоб потом по условию сравнивать.
Принимать можно по одному байту
Здравствуйте подскажите пожалуйста как запустить список команд по приходу в Serial port такого ответа +CMTI: "SM"
Попробуй http://www.compcar.ru/forum/showpost...&postcount=208
Только вместо <#>,<буква>,<цифра> используй свои символы,хотя не думаю, что это будет удобно. Ардуина (или GSM модуль) чувствительны к регистру, а на мобильных телефонах, как правило первый символ пишется заглавной буквой. Символ # как раз решает эту проблему, также, вместо него можно использовать любой другой символ.
P/S Опять-же, АТ комманды данного скетча, ориентированы исключительно на модуль SIM900
высталяю на обзор так как есть работаю с сименсом с 45 предложения и критика с вашей стороны приветствуются
#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();
}
}
на данный момент все работает на arduino nano v4 нужно решить вопрос по удалению нескольких смс сразу поддерживает только команду AT+CMGD=1 и с массивом разобраться а то в конце каждой надписи мусор вываливается
Ну во первых - первый раз вижу, чтобы сименс поддерживал 19200.
Во вторых - удаление всех СМС, это только АТ комманды сименса (ищи в интернете, для SiM 900 == 1,4
В третьих - не пойму, что значит (gsm.read()=='1'), что ты хочешь получить?
1 скорость порта сименса 19200 это так ошибки нет
2 удаление смс проходит только этой командой на другие ошибка вылетает не поддерживает из за чего непонятки с смс появляются иногда хоть и удалена со списка но телефон ее читает
3 (gsm.read()=='1')- это одно из значений от прихода смс иначе без этого с командой gsm.println("AT+CMGD=1"); цикл начинало гонять по кругу так что решил пока так вопрос
Если я не ошибаюсь, сименс понимает только PDU формат. А там, первый байт не может быть 1-цей.
команда AT+CNMI=1,1 отсылает ответ в порт после прихода смс формата +CMTI: "SM",1 вот оттуда эта единица взята это номер смс в памяти я так понял затем отсылаем AT+CMGL=0 читать все непрочитаные сообщения и вот тут сообщение в PDU формате выползает с кучей информации
Напиши, что принимает ардуина при входящем СМС с этим скетчем
вот что выводится на экран
AT+CMGL=0
+CMGL: 1,0,,20
07919730071111F10407D0341AAD0600ÿÿÿ ÿÿÿÿÿÿÿÿ&# 255;ÿÿÿÿÿÿÿ 5;ÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿ
отправлялось @a1
Ну вот, у тебя принимает не 1 (после +CMGL) а 0 (вторая строка). Почитай http://www.compcar.ru/forum/showpost...&postcount=126
тут еще не касаемс pdu формата эта едененица относится к +CMTI: "SM",1 тоесть то что стоит после запятой это номер смс я так понимаю
Не трогай 1 строчку. Ардуина ее не видет (если и видет, я не знаю как).
Смотри 2 - ю строчку. Как описано здесь: - http://www.compcar.ru/forum/showpost...&postcount=126, убирай ненужную информацию, потом, с помощью http://arduino.cc/en/Reference/StringObject, вытаскиваю нужные символы.
gsm.read()=='1' без этого цикл
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();
} начинает гонять покругу и остановить его не получалось а обработки pdu еще не касаемся пока только считываем из порта в массив и выводим массив на экран
По массивам, это к Chip'u. Я сам еще не профессионал в этом деле.
думаю Chip много тут закритикует
Посмотрим, мне тоже интересно.
Без обид.
Давайте код заключать в спец. теги , в таком виде его читать не возможно, все сливается.
Пишите код по человечески , не нужно в одну строку писать кучу функций.
Я не хочу сидеть и править что бы он был читаем.
спасибо учту это замечание
Вот такой скетч имеем на данный момент
проблема в том что не все числа принимаются из буфераPHP код:
#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();
Serial.flush();
delay(100);
gsm.println("AT+CNMI=1,1");
delay(2000);
}
void loop()
{
if(gsm.available() >0 ){
gsm.println(" AT+CMGL=4 ");
for(int i=0;i<100;i++)
{
inchar[i]=gsm.read();
delay(3);
}
for(int i=0;i<100;i++)
{
Serial.print(inchar[i]);
delay(100);
}
}
}
07919730071111F1040B919706 - то что принимается
07919730071111F1040B919706109843F20000213041612235 610380700C - то что читаю через терминал
10380700C - эту часть сообщения нужно обробатывать
Для начала поменяй скорость на 9600, софтовый UART больше чем 9600 не потянет
gsm.begin(9600);