Для моей задачи как раз нужно в скетче эту обработку делать и 32 Кб мне просто за глаза. А у кого мега еще проще.
Вид для печати
Попробовал поиграться (в меру сил) со string, substring тоже ничего не вышло хотя козалось бы что все верно делается.
Это я к тому, что в том скетче моем, тоже была проблема со string, там тоже он не хотел работать из-за того, что другой(не поддерживаемый) тип данных ему давал(с запятой чтоли не помню), а string с этим типом данных не работает, поэтому пришлось усложнять дальше...какая-то-такая-то заморока была и там со стрингом.
Все описанное ИМХО мое :)
Сделал удобную отправку смс через Serial Monitor. Теперь задаем номер телефона и текст сообщения одной строкой.:D
На скриншоте:
1) Служебная метка sms
2) Номер мобильника в формате pdu
3) Текст сообщения
Синтаксис с запятыми обязательно соблюдать.:)
http://s1.hostingkartinok.com/upload...e0894bbe11.png
PHP код:
#include <NewSoftSerial.h>
#include <string.h>
NewSoftSerial mySerial(2, 3);
#define num_to_char(number) ((number) < 10 ? \
('0' + (number)) : \
(('A' - 10) + (number)) )
#define first_four(byte) (0x0F & (byte))
#define last_four(byte) ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte) num_to_char( last_four(byte))
#define hexdump_b(byte) num_to_char(first_four(byte))
char inData[100];
char unitID_in[10];
char telnumb_in[14];
char textsms_in[100];
//String textsms_in;
void setup()
{
Serial.begin(9600);
Serial.println("Go SMS Send");
mySerial.begin(9600);
}
void loop()
{
int i=0;
char buffer[100];
//если есть данные - читаем
if(Serial.available()){
delay(100);
//загоняем прочитанное в буфер
while( Serial.available() && i< 99) {
buffer[i++] = Serial.read();
}
//закрываем массив
buffer[i++]='\0';
}
//если буфер наполнен отправляем смс
if(i>0){
//разбераем буфер на части отделенные запятой
sscanf(buffer, "%[^','],%[^','],%[^',']", &unitID_in, &telnumb_in, &textsms_in);
if ((String)unitID_in == "sms"){ //определяем команду отправки смс
//Serial.println(buffer);
char *indata=textsms_in;
// Serial.println(textsms_in);
// Serial.println(telnumb_in);
send_sms(indata);
unitID_in [0] = '\0';
telnumb_in [0] = '\0';
}
}
}
void send_sms(char *data)
{
size_t data_length, x;
char c, l;
long i;
long n;
data_length = strlen(data);
i = data_length * 7;
if (i & 0x07) i = (i & ~0x07) + 0x08;
i = i / 8;
mySerial.println("AT+CMGF=0");
delay(50);
mySerial.print("AT+CMGS=");
delay(50);
mySerial.println(i + 14);
delay(50);
//перевернутый номер тела 19731630470F2 изменить на свой этот кусок
//mySerial.print("0011000B919731630470F20000AA");
mySerial.print("0011000B9");
delay(5);
mySerial.print(telnumb_in);
delay(5);
mySerial.print("0000AA");
hexdump_byte(data_length & 0xFF);
l = 0;
n = 0;
for (x = 0; x < data_length; x++)
{
if (data[x] == '$') data[x] = 0x02;
n |= (data[x] & 0x7F) << l;
l += 7;
if (l >= 8)
{
hexdump_byte(n & 0xFF);
l -= 8;
n >>= 8;
}
}
if (l != 0)
{
hexdump_byte(n & 0xFF);
}
mySerial.write(26);
}
void hexdump_byte(unsigned char byte)
{
mySerial.print(hexdump_a(byte), BYTE);
mySerial.print(hexdump_b(byte), BYTE);
}
Прикольно, намного удобнее, чем "вручеую" отправлять с помощью терминала и АТ команд. :)
Это какой-ту КОШМАР!!!! Не могу вытащить символы, хоть что делай. Может быть как - то можно "игнорировать" не нужные символы? Что-то типа :
Где N имеет любое значение (число или литера)?PHP код:
if(Serial1.read()=='N' &&Serial1.read()=='N' &&Serial1.read()=='N' &&Serial1.read()=='1' &&Serial1.read()=='8' &&Serial1.read()== '3' &&Serial1.read()=='N' &&Serial1.read()=='0')
Chip, вопрос к тебе.
1. Решил я проблему вытаскивания нужных символов из СМС. Вот скетч:
Но возникла проблема. В Serial Мониторе, иногда показывает правильно "2103А370", а иногда - или "квадратики", или "иероглифы". Что это может быть?PHP код:
int i=1;
char strok[61]="";
int ledpin = 30;
long previousMillis = 0;
long interval = 5000;
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);
}
// отправляю СМС - #a1
if(Serial1.read()=='0' &&Serial1.read()=='7'&&Serial1.read()=='9') //только, если в Serial1 есть СМС, а то он начинает читать с АТ+ и т.д.
for (i=1; i<58; i++) strok [i] = Serial1.read();
Serial.print(strok[48]); // 2
Serial.print(strok[49]); // 1
Serial.print(strok[50]); // 0
Serial.print(strok[51]); // 3
Serial.print(strok[52]); // A
Serial.print(strok[53]); // 3
Serial.print(strok[54]); // 7
Serial.print(strok[55]); // 0
delay(1000);
}
Но возникла проблема. В Serial Мониторе, иногда показывает правильно "2103А370", а иногда - или "квадратики", или "иероглифы". Что это может быть?
Получается что принимаешь значения вне диапазона английской кодировки
А почему иногда нормально отображается? Использую ведь одно и то же СМС, просто в телефоне его помечаю как непрочитанное.
Вопрос разрешен. Проблема была в расставлении фигурных скобок.
Вот полностью рабочий скетч для Siemens S55!!!
Вот только может у кого есть идеи по удалению "корявостей" скетча :)
PHP код:
int i=1;
char strok[61]="";
int ledpin = 22;
long previousMillis = 0;
long interval = 5000;
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);
}
if(Serial1.read()=='0' &&Serial1.read()=='7' &&Serial1.read()=='9') //только, если в Serial1 есть СМС, а то он начинает читать с АТ+ и т.д.
{
for (i=1; i<58; i++) strok[i] = Serial1.read();
// ВКЛЮЧЕНИЕ - отправляю СМС - #a1
if(strok[48] == '2' &&strok[49] == '1' &&strok[50] == '0' &&strok[51] == '3' &&strok[52] == 'A' &&strok[53] == '3' &&strok[54] == '7' &&strok[55] == '0')
{
digitalWrite (ledpin, HIGH);
delay(1000);
Serial1.println("AT+CMGD=1");
}
// ВЫКЛЮЧЕНИЕ - отправляю СМС - #a0
if(strok[48] == '2' &&strok[49] == '1' &&strok[50] == '0' &&strok[51] == '3' &&strok[52] == 'A' &&strok[53] == '3' &&strok[54] == '3' &&strok[55] == '0')
{
digitalWrite (ledpin, LOW);
delay(1000);
Serial1.println("AT+CMGD=1");
}
}
delay(100);
}
Молодец...
Буду пробовать завтра....если все пойдет :D классные возможности у этого всего будут.
metaforos Если не трудно погляди что у меня неправильно
пробовал разные варианты. По экрану телефона вижу что ардуина считывает смс из памяти, но обработать и включить пин 5 не выходит, ну и соответственно стирать тоже не хочет смс из памяти. Скорее всего адреса строк пишу неправильно, но как правильно то???
Поставил строку Serial.println(strok[52]); чтоб понять значение strok[52] ...но значение выводится закорючкой!!!!PHP код:
#include <NewSoftSerial.h> //////////// поставить библиотеку сериал
NewSoftSerial mySerial(2,3);
int i=1;
char strok[61]="";
int ledpin = 5; //////////// изменить ледпин на другой
long previousMillis = 0;
long interval = 5000;
void setup()
{
pinMode(ledpin, OUTPUT);
//Serial1.begin(9600); /////// изменить на другой сериал
mySerial.begin(9600);
Serial.begin(9600);
//Serial1.flush(); /////// изменить ?????????
mySerial.flush();
delay(5000);
//Serial1.println("AT+CPMS ='MT'\r" ); /////// ИЗМЕНИТЬ
mySerial.println("AT+CPMS ='MT'\r" );
delay(1000);
//Serial1.println("AT+CNMI=1,1\r"); ////// изменить
mySerial.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"); ///////// изменить
mySerial.println("AT+CMGL=4\r");
delay(100);
}
//if(Serial1.read()=='0' &&Serial1.read()=='7' &&Serial1.read()=='9') /////ИЗМЕНИТЬ .....только, если в Serial1 есть СМС, а то он начинает читать с АТ+ и т.д.
if(mySerial.read()=='0' &&mySerial.read()=='7' &&mySerial.read()=='9')
{
//for (i=1; i<58; i++) strok[i] = Serial1.read(); ////// ИЗМЕНИТЬ
//for (i=1; i<58; i++) strok[i] = mySerial.read();
for (i=1; i<60; i++) strok[i] = mySerial.read();
// ВКЛЮЧЕНИЕ - отправляю СМС - #a1
//if(strok[48] == '2' &&strok[49] == '1' &&strok[50] == '0' &&strok[51] == '3' &&strok[52] == 'A' &&strok[53] == '3' &&strok[54] == '7' &&strok[55] == '0')
//if(strok[49] == '1' &&strok[50] == '0' &&strok[51] == '3' &&strok[52] == 'A' &&strok[53] == '3' &&strok[54] == '7' &&strok[55] == '0')
if(strok[52] == '1' &&strok[53] == '0' &&strok[54] == '3' &&strok[55] == 'A' &&strok[56] == '3' &&strok[57] == '7' &&strok[58] == '0')
{
digitalWrite (ledpin, HIGH);
delay(1000);
//Serial1.println("AT+CMGD=1"); /////// ИЗМЕНИТЬ
mySerial.println("AT+CMGD=1");
}
// ВЫКЛЮЧЕНИЕ - отправляю СМС - #a0
//if(strok[48] == '2' &&strok[49] == '1' &&strok[50] == '0' &&strok[51] == '3' &&strok[52] == 'A' &&strok[53] == '3' &&strok[54] == '3' &&strok[55] == '0')
//if(strok[49] == '1' &&strok[50] == '0' &&strok[51] == '3' &&strok[52] == 'A' &&strok[53] == '3' &&strok[54] == '3' &&strok[55] == '0')
if(strok[52] == '1' &&strok[53] == '0' &&strok[54] == '3' &&strok[55] == 'A' &&strok[56] == '3' &&strok[57] == '3' &&strok[58] == '0')
{
digitalWrite (ledpin, LOW);
delay(1000);
//Serial1.println("AT+CMGD=1"); /////// ИЗМЕНИТЬ
mySerial.println("AT+CMGD=1");
}
}
delay(100);
}
//0 7 9 1 9 7 6 1 9 8 9 9 0 1 F 0 2 4 0 B 9 1 9 7 6 1 4 6 4 3 3 9 F 2 0 0 0 0 2 1 4 0 5 0 7 1 9 4 6 1 6 1 0 3 A 3 7 0 0 C - #a1
//1 2 3 4 5 6 7 8 9 10 15 20 25 30 35 40 45 50 55 60
//0 7 9 1 9 7 6 1 9 8 9 9 0 1 F 0 2 4 0 B 9 1 9 7 6 1 4 6 4 3 3 9 F 2 0 0 0 0 2 1 4 0 5 0 8 1 0 2 4 1 6 1 0 3 A 3 3 0 0 C - #a0
// - - - - -
Я не пойму, зачем ты менял мои
иPHP код:
for (i=1; i<60; i++) strok[i] = mySerial.read();
Они одинаково будут работать для любого оператора и номера телефона. Я ведь присваиваю не с 1-го символа (0), а с 4-го (1), а ты все перепутал.PHP код:
if(strok[48] == '2' &&strok[49] == '1' &&strok[50] == '0' &&strok[51] == '3' &&strok[52] == 'A' &&strok[53] == '3' &&strok[54] == '7' &&strok[55] == '0')
Здесь -- я взял 61 для "надежности", т.к. приходит 60 символов.PHP код:
char strok[61]="";
У меня в конце скетча примеры приходящих смс, там так
6 1 0 3 A 3 7 0 ... единица по счету 52-я и начало не на 2 а на 6!
Сейчас еще раз проверю все сначала.
Попробовал по всякому ...ни выходит
for (i=1; i<58; i++) strok[i] = mySerial.read();
if(strok[48] == '2' &&strok[49] == '1' &&strok[50] == '0' &&strok[51] == '3' &&strok[52] == 'A' &&strok[53] == '3' &&strok[54] == '7' &&strok[55] == '0')
и
if(strok[48] == '6' &&strok[49] == '1' &&strok[50] == '0' &&strok[51] == '3' &&strok[52] == 'A' &&strok[53] == '3' &&strok[54] == '7' &&strok[55] == '0')
и
if(strok[51] == '6' &&strok[52] == '1' &&strok[53] == '0' &&strok[54] == '3' &&strok[55] == 'A' &&strok[56] == '3' &&strok[57] == '7' &&strok[58] == '0')
Посмотри мою строчку #a1 приходящую
//0 7 9 1 9 7 6 1 9 8 9 9 0 1 F 0 2 4 0 B 9 1 9 7 6 1 4 6 4 3 3 9 F 2 0 0 0 0 2 1 4 0 5 0 7 1 9 4 6 1 6 1 0 3 A 3 7 0 0 C
Я не врублюсь где в скетче сдвиг на 4 происходит :confused: ... я уже и со сдвигом попробовал и без, даже и не знаю что теперь делать :(:(:(
metaforos попробуй скетч с библиотекой NewSoftSerial может это уже действительно из-за неё
Тогда вместо 2 в :
поставь свою 6PHP код:
if(strok[48] == [COLOR="red"]'2'[/COLOR] &&strok[49] == '1' &&strok[50] == '0' &&strok[51] == '3' &&strok[52] == 'A' &&strok[53] == '3' &&strok[54] == '7' &&strok[55] == '0')
А здвиг вот как происходит - Нам приходит 60 символов:PHP код:
if(strok[48] == [COLOR="Red"]'6'[/COLOR] &&strok[49] == '1' &&strok[50] == '0' &&strok[51] == '3' &&strok[52] == 'A' &&strok[53] == '3' &&strok[54] == '7' &&strok[55] == '0')
07919761989901F0240B919761464339F20000214050714616103A 3700C
В таком виде, твоя 6-ка, будет strok[51]. Но! Первые 3 символа (079), мы используем вТеперь у нас для чтения, остается только 57 символов и 1-м символом идет 1, тогда твоя 6-ка, это уже 51-3=48 и т.д. до 55 символа.PHP код:
if(Serial1.read()=='0' &&Serial1.read()=='7' &&Serial1.read()=='9') // только, если в Serial1 есть СМС, а то он начинает читать с АТ+ и т.д.
А по поводу NewSoftSerial, пробовать даже не буду. Она у меня не работает. Попробуй подключи на 0 и 1 и просто напиши Serial.
я уже пробовал так, выше постом писал!
if(strok[48] == '6' &&strok[49] == '1' &&strok[50] == '0' &&strok[51] == '3' &&strok[52] == 'A' &&strok[53] == '3' &&strok[54] == '7' &&strok[55] == '0')
Поправь свой предыдущий скетч пожалуйста там где фигурные скобки надо было подправить... я сейчас с ним играюсь
Выходат так:PHP код:
#include <NewSoftSerial.h>
NewSoftSerial mySerial(2,3);
int i=1;
char strok[61]="";
int ledpin = 5;
long previousMillis = 0;
long interval = 5000;
void setup()
{
pinMode(ledpin, OUTPUT);
mySerial.begin(9600);
Serial.begin(9600);
mySerial.flush();
delay(5000);
mySerial.println("AT+CPMS ='MT'\r" );
delay(1000);
mySerial.println("AT+CNMI=1,1\r");
delay(1000);
}
void loop()
{
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval)
{
previousMillis = currentMillis;
mySerial.println("AT+CMGL=4\r");
delay(100);
}
// отправляю СМС - #a1
if(mySerial.read()=='0' &&mySerial.read()=='7'&&mySerial.read()=='9') //только, если в Serial1 есть СМС, а то он начинает читать с АТ+ и т.д.
{
for (i=1; i<58; i++) strok [i] = mySerial.read();
Serial.print(strok[48]); // 2
Serial.println(strok[49]); // 1
//Serial.println(strok[50]); // 0
//Serial.print(strok[51]); // 3
//Serial.print(strok[52]); // A
//Serial.print(strok[53]); // 3
//Serial.print(strok[54]); // 7
//Serial.print(strok[55]); // 0
digitalWrite (ledpin, HIGH);
delay(3000);
digitalWrite (ledpin, LOW);
delay(10000);
}
}
A3
**
**
**
A3
**
*
**
Вместо * закарючка
У меня к сожалению через Serial на 0 и 1 не пошло ничего, телефон теряет сеть и все(ПРАВДА СМСку успевает прочесть-в прочитанные в телефоне уходит) ... если так не разберусь то тогда буду пробовать.
Завтра LCD экран подключу ...посмотрю что strok[48] - [55] у меня выводит.
Перепроверил скетч - http://www.compcar.ru/forum/showpost...&postcount=329
Пробовал на разных операторах. Все исправно работает. В твоем случае, нужно только поменять 2 на 6. В чем может быть проблема, не понимаю. Попробуй
и посмотри, что приходит. Потом, просто впиши вPHP код:
Serial.print(strok[48]);
Serial.print(strok[49]);
Serial.print(strok[50]);
Serial.print(strok[51]);
Serial.print(strok[52]);
Serial.print(strok[53]);
Serial.print(strok[54]);
Serial.print(strok[55]);
Но вот если тебе придут иероглифы, квадратики и т.д., то как победить это, я не знаю. Я просто переставил скобки и все заработало. Причем расставлял, практически "наугад", пока не заработало.PHP код:
if(strok[48] == '2' &&strok[49] == '1' &&strok[50] == '0' &&strok[51] == '3' &&strok[52] == 'A' &&strok[53] == '3' &&strok[54] == '7' &&strok[55] == '0')
Проблема из-за закорючек
попробовал вывести на LCD 16х2
lcd.setCursor(0, 1);
lcd.print(strok[48]); закорючка
lcd.print(strok[49]); закорючка
lcd.print(strok[50]); закорючка
lcd.print(strok[51]); закорючка
lcd.print(strok[52]); закорючка
lcd.print(strok[53]); закорючка
lcd.print(strok[54]); закорючка
lcd.print(strok[55]); закорючка
что дальше делать пока не знаю.
Вот-вот... Я тоже не пойму в чем дело. Хотя тут, возможно из-за телефона. Может действительно с делителем напряжения эксперементировать?
делитель напряжения не стоит трогать через терминал все знаки приходят как надо или нет и скорость порта на телефоне точно 9600 и как вариант попробуй 19200 из моих сименсов на 9600 никто не работал по умолчанию обычно 19200 идет скорость порта и еще попробуй паузу вствить при чтении в массив были подобные случаи что без паузы плохо читало
for (i=1; i<58; i++) :strok [i] = mySerial.read();delay(100);} примерно так
Да дело в том, что даже у меня, иногда читает и отображает нормально, а иногда иероглифами...
попробуйте через паузу чтение в массив
andrei2882 сапасибо за попытку, но увы не помогло, закорючки лезут. Вообще были у меня такие мысли.
пробовал так.
for (i=1; i<58; i++) strok [i] = mySerial.read();delay(100);
for (i=1; i<58; i++); strok [i] = mySerial.read();delay(100);
Распиши подробнее этот кусок ... я проверю тогда ...а то без особого понимания пробую.
Решил пойти простым путем написав всю строку целиком, а там где символы меняются писать !='Z' но увы и здесь ждало разочарование ...
где-то после 40 символов перестает работать логика до 40 все отлично отрабатывает...проверил 5 раз все верно вбиваю...может freeduina не может обработать это уже?????
Надо будет попробовать выводитьPHP код:
if(gsm.read()=='0'&&gsm.read()=='7'&&gsm.read()=='9'&&gsm.read()=='1'&&gsm.read()=='9'&&gsm.read()=='7'&&gsm.read()=='6'&&gsm.read()=='1'&&gsm.read()=='9'&&gsm.read()=='8'&&gsm.read()=='9'&&gsm.read()=='9'&&gsm.read()=='0'&&gsm.read()=='1'&&gsm.read()=='F'&&gsm.read()=='0'&&gsm.read()=='2'&&gsm.read()=='4'&&gsm.read()=='0'&&gsm.read()=='B'&&gsm.read()=='9'&&gsm.read()=='1'&&gsm.read()=='9'&&gsm.read()=='7'&&gsm.read()=='6'&&gsm.read()=='1'&&gsm.read()=='4'&&gsm.read()=='6'&&gsm.read()=='4'&&gsm.read()=='3'&&gsm.read()=='3'&&gsm.read()=='9'&&gsm.read()=='F'&&gsm.read()=='2'&&gsm.read()=='0'&&gsm.read()=='0'&&gsm.read()=='0'&&gsm.read()=='0'&&gsm.read()!='Z'&&gsm.read()!='Z'&&gsm.read()!='Z'&&gsm.read()!='Z'&&gsm.read()!='Z'&&gsm.read()!='Z'&&gsm.read()!='Z'&&gsm.read()!='Z'&&gsm.read()!='Z'&&gsm.read()!='Z'&&gsm.read()!='Z'&&gsm.read()!='Z'&&gsm.read()!='Z'&&gsm.read()!='Z')
lcd.print(strok[10]);
lcd.print(strok[20]);
lcd.print(strok[30]);
а что со скоростью обмена и в терминале все читается хорошо и каждый раз
Скорость 19200 пробовал, результат такойже.
В терминале именно в этом месте обработки смс тоже закорючки. А в других местах терминал работает исправно.
Выходит то что на стадии обработки смс freeduina2009 почему то несправляется.
Есть мысли завтра проверить это, задав цикл поменьше, не 58, а скажем 20-30.
Или библиотека невсериал глючит.
Или я глючю :D
я правильно тебя понял что в терминале с закорючками читается
Причину закорючек выявил!!!...что теперь делать будем???
В терминале картина думаю такая же будет...позже проверю.PHP код:
for (i=1; i<40; i++) strok [i] = mySerial.read(); delay(100);
lcd.setCursor(0, 1);
lcd.print(strok[29]); 9
lcd.print(strok[30]); F
lcd.print(strok[31]); 2
lcd.print(strok[32]); 0 (это 35символ дальше выводятся только закорючки)
lcd.print(strok[33]); * закорючка
lcd.print(strok[34]); * закорючка
lcd.print(strok[35]); * закорючка
lcd.print(strok[36]); * закорючка
Freeduina2009 не обрабатывает далее 35символа по порядку
Проверил ... картина такая же!! ! ! !
PHP код:
for (i=1; i<40; i++) strok [i] = mySerial.read(); delay(100);
Serial.println(strok[29]); // 9
Serial.println(strok[30]); // F
Serial.println(strok[31]); // 2
Serial.println(strok[32]); // 0
Serial.println(strok[33]); // *
Serial.println(strok[34]); // *
Serial.println(strok[35]); // *
Serial.println(strok[36]); // *
значит либо телефон либо со скоростью нужно пробовать другие поставить , раз в терминале такое твориться попробуй другие скорости .
Заказал на аукционе С45. В понедельник приедет, попробую с ним. С S55 у меня все работает.
Ребят у меня ЮСБ хост шилдик есть, как к нему телефон подсоединить? будет работать?
Вобщем ничего нового не скажу ... после определенного места в массиве на Freeduino2009 начинаются ошибки.
У кого платка с ATmega168, проверьте у себя этот скетч!!! также будет или нет???
Да, скорости менял, не помогает.
Присутствует пропуск-потеря информации, неверная информация и закорючки...и все это происходит строго после определенного момента. происходит.PHP код:
#include <NewSoftSerial.h>
NewSoftSerial mySerial(2,3);
int i=1;
char strok[61]="";
int ledpin = 13;
long previousMillis = 0;
long interval = 30000;
void setup()
{
pinMode(ledpin, OUTPUT);
mySerial.begin(9600);
Serial.begin(9600);
mySerial.flush();
delay(2000);
mySerial.println("AT+CPMS =MT\r" );
delay(2000);
mySerial.println("AT+CNMI=1,1\r");
delay(2000);
}
void loop()
{
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval)
{
previousMillis = currentMillis;
mySerial.println("AT+CMGL=4\r");
delay(100);
}
// отправляю СМС - #a1
if(mySerial.read()=='0'&&mySerial.read()=='7'&&mySerial.read()=='9') //только, если в Serial1 есть СМС, а то он начинает читать с АТ+ и т.д.
{
for (i=1; i<58; i++) strok [i] = mySerial.read(); delay(100);
//ОТПРАВЛЮЯ #a1
// ЭТАЛОН
// 0
// 7
// 9
Serial.println(strok[1]); // 1 1
Serial.println(strok[2]); // 9 9
Serial.println(strok[3]); // 7 7
Serial.println(strok[4]); // 6 6
Serial.println(strok[5]); // 1 1
Serial.println(strok[6]); // 9 9
Serial.println(strok[7]); // 8 8
Serial.println(strok[8]); // 9 9
Serial.println(strok[9]); // 9 9
Serial.println(strok[10]); // 0 0
Serial.println(strok[11]); // 1 1
Serial.println(strok[12]); // F F
Serial.println(strok[13]); // 0 0
Serial.println(strok[14]); // 2 2
Serial.println(strok[15]); // 4 4
Serial.println(strok[16]); // 0 0
Serial.println(strok[17]); // B B
Serial.println(strok[18]); // 9 9
Serial.println(strok[19]); // 1 1
Serial.println(strok[20]); // 9 9
Serial.println(strok[21]); // 7 7
Serial.println(strok[22]); // 6 6
Serial.println(strok[23]); // 1 1
Serial.println(strok[24]); // 4 4
Serial.println(strok[25]); // 6 6
Serial.println(strok[26]); // 4 4
Serial.println(strok[27]); // 3 3
Serial.println(strok[28]); // 3 3
Serial.println(strok[29]); // 9 9
Serial.println(strok[30]); // F F ПОСЛЕ ЭТОГО МЕСТА ИДУТ ОШИБКИ
Serial.println(strok[32]); // 2 0 0 ошибка
Serial.println(strok[32]); // 0 0 0 ошибка
Serial.println(strok[33]); // 0 0 7 ошибка
Serial.println(strok[34]); // 0 7 0 ошибка
Serial.println(strok[35]); // 0 0 1 ошибка
Serial.println(strok[36]); // 2 1 1 ошибка
Serial.println(strok[37]); // 1 1 2 ошибка
Serial.println(strok[38]); // 4 2 0 ошибка
Serial.println(strok[39]); // 0 0 4 ошибка
Serial.println(strok[40]); // 7 4 3 ошибка
Serial.println(strok[41]); // 0 3 6 переменная
Serial.println(strok[42]); // 1 6 1 переменная
Serial.println(strok[43]); // 1 "1" 0 переменная
Serial.println(strok[44]); // 2 "0" 3 переменная
Serial.println(strok[45]); // 0 "3" A переменная
Serial.println(strok[46]); // 4 "A" 3 переменная
Serial.println(strok[47]); // 3 "3" 7
Serial.println(strok[48]); // 6 "7" 0
Serial.println(strok[49]); //"1" "0" 0
Serial.println(strok[50]); //"0" 0 C
Serial.println(strok[51]); //"3" * *
Serial.println(strok[52]); //"A" * *
Serial.println(strok[53]); //"3" * *
Serial.println(strok[54]); //"7" * *
Serial.println(strok[55]); //"0" *
Serial.println(strok[56]); // 0 * *
Serial.println(strok[57]); // C C *
Serial.println(strok[58]); // *
digitalWrite (ledpin, HIGH);
delay(3000);
digitalWrite (ledpin, LOW);
delay(10000);
}
}
.
еще вариант незаметил где очистка флеша идет и еще я так понял в терминале таие же моменты происходят
Как определить что подкрутить когда этот флеш чистится.???:rolleyes:
Пробовал менять mySerial.flush(); delay(2000); на 5000. Но это не....то.
В терминале если я даю команду- ручками вбиваю, то в терминал ответ приходит четко! без ошибок и закорючек!!! С терминалом проблем нету никаких...все работает как надо. Вся строка СМС выводится по команде AT+CMGL=4 целиком без ошибок.
Проблема только в этом месте...ну не хочет без ошибок считываться с телефона никак блин. А кто тут виноват телефон или ардуина....больше похоже на ардуину! ИМХО.
ВОТ БЫ КТО ПРОВЕРИЛ!
+ + + +
А если в терминальном скетче забить строку
mySerial.println("AT+CMGL=4\r");
Будет ответ в терминал? Надо попробовать позже.
очистку флеша делай перед вызвом AT+CMGL=4\r в цикле void loop()
Так?
mySerial.flush();
delay(2000);
mySerial.println("AT+CMGL=4\r");
Попробовал, ну что сказать -стало заметно стабильнее как-то, но всеравно есть пропуски там где и раньше где 0000 подряд. То 00 вылезет то 000 то 0000 затем вроде идет все правильно а в конце последние 2-4 символа косячат. А иной раз без ошибки выдает. Первые символы смс #a1 - 103А выдает стабильно, остальные *** как повезет.
Потом подробнее-поточнее попробую потестить.
опробуй так
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
delay(1000);
mySerial.flush();
delay(1000);
mySerial.println("AT+CMGL=4\r"); }
Так стало хуже, уже с того известного места строго стабильно идут закорючки.
Вобщем я ничего не понимаю, почему это происходит в скетче и почему этого нету чисто в терминале :mad:кщ
Потом как я только не пробовал всегда последние 6-7 символов закорючками, видимо какая то часть информации из этой строки несчитывается в телефоне и пропадает.
Возможно виноват и телефон где-то читал что на МЕ45 (и кажетсяS45) какаято своеобразная флеш память и там с этим были заморочки.
Попробую понять что за часть пропадает и за что она отвечает.
Хотелось бы чтоб ктото имеющий freeduino протестил на другом телефоне скетч.
Получилось таки считывать без ошибок и обрабатывать СМС.
Скетч примитивный(ну как умеем так умеем), но по размеру вроде такой же получается.
И еще вопрос! почему в прошлых скетчах получалось 60символов а тут 1символ равен двум цифрам и того выходит 120???
PHP код:
#include <NewSoftSerial.h>
NewSoftSerial mySerial(2,3);
int a=1;
int i=1;
int ledpin = 8;
void setup()
{
pinMode(ledpin, OUTPUT);
mySerial.begin(9600);
Serial.begin(9600);
mySerial.flush();
delay(1000);
mySerial.println("AT+CPMS =MT\r" );
delay(1000);
mySerial.println("AT+CNMI=1,1\r");
delay(1000);
}
void loop()
{
mySerial.flush();
delay(1000);
mySerial.println("AT+CMGL=4\r");
delay(100);
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.print(mySerial.read()); //
Serial.println(mySerial.read()); //
Serial.print("a=");
a=mySerial.read();
Serial.println(a); //
i=mySerial.read();
Serial.print("i=");
Serial.println(i); //
if(a==70 && i==50)
{
digitalWrite(ledpin,HIGH);
delay(5000);
digitalWrite(ledpin,LOW);
delay(1000);
}
delay(10000);
}
60-120 скорее всего из-за разности в типе данных и кодировке. Ты засовываешь информацию в int, которая занимает 2 байта памяти, а в предыдущих скетчах был char - занимает 1 байт памяти.
Мой прошлый скетч оказывается с той же проблемой.:eek:
Уже собрался начинать писать скетч под свой проект и выясняется, что до 63парного символа все всегда совпадает... а мне нужно считывать дальше...а дальше опять полная неразбериха выводится.:mad:
:D
.
:D
.
:D
Всеж меня мучает ...а почему в этом скетче все выводится как надо!
PHP код:
#include <string.h>
#include <NewSoftSerial.h>
NewSoftSerial phone(2,3); // Tx телефона подключи к 2 пину, а Rx к 3 пину
char incoming_char=0;
void setup()
{
Serial.begin(9600);
phone.begin(9600);
Serial.println("Starting Communication...");
}
void loop() {
if(phone.available() >0){
incoming_char=phone.read();
Serial.print(incoming_char);
}
if(Serial.available() >0){
incoming_char=Serial.read();
Serial.print(incoming_char);
phone.print(incoming_char);
}
}