Попробовал поиграться (в меру сил) со string, substring тоже ничего не вышло хотя козалось бы что все верно делается.
Это я к тому, что в том скетче моем, тоже была проблема со string, там тоже он не хотел работать из-за того, что другой(не поддерживаемый) тип данных ему давал(с запятой чтоли не помню), а string с этим типом данных не работает, поэтому пришлось усложнять дальше...какая-то-такая-то заморока была и там со стрингом.
Все описанное ИМХО мое
Сделал удобную отправку смс через Serial Monitor. Теперь задаем номер телефона и текст сообщения одной строкой.
На скриншоте:
1) Служебная метка sms
2) Номер мобильника в формате pdu
3) Текст сообщения
Синтаксис с запятыми обязательно соблюдать.
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);
}
Прикольно, намного удобнее, чем "вручеую" отправлять с помощью терминала и АТ команд.
Liliput 629 GL, Intel Atom N230 1.6, HDD 200 GB, ОЗУ 2GB, Globalsat GT-100.
Это какой-ту КОШМАР!!!! Не могу вытащить символы, хоть что делай. Может быть как - то можно "игнорировать" не нужные символы? Что-то типа :
Где 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')
Liliput 629 GL, Intel Atom N230 1.6, HDD 200 GB, ОЗУ 2GB, Globalsat GT-100.
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);
}
Liliput 629 GL, Intel Atom N230 1.6, HDD 200 GB, ОЗУ 2GB, Globalsat GT-100.
Но возникла проблема. В Serial Мониторе, иногда показывает правильно "2103А370", а иногда - или "квадратики", или "иероглифы". Что это может быть?
Получается что принимаешь значения вне диапазона английской кодировки
А почему иногда нормально отображается? Использую ведь одно и то же СМС, просто в телефоне его помечаю как непрочитанное.
Liliput 629 GL, Intel Atom N230 1.6, HDD 200 GB, ОЗУ 2GB, Globalsat GT-100.
Вопрос разрешен. Проблема была в расставлении фигурных скобок.
Вот полностью рабочий скетч для 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);
}
Последний раз редактировалось metaforos; 06.04.2012 в 04:24.
Liliput 629 GL, Intel Atom N230 1.6, HDD 200 GB, ОЗУ 2GB, Globalsat GT-100.
Молодец...
Буду пробовать завтра....если все пойдет классные возможности у этого всего будут.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)