Массив строка, разбор.
- Войдите на сайт для отправки комментариев
Здравствуйте !!!
Прошу помощи !!! Начал проект сигнализации для дачи и столкнулся с проблемой программирования дополнительных номеров в память сигналки для снятия и постановки на охрану через смс сообщения. Записаться админом с первого пришедшего смс и потом управлять сигналкой получается без проблем - считываю номер и записываю в память, далее если смс пришло с номера админа и содержит текст "alarm on", то включить охрану..., а вот как прописать дополнительного пользователя например жену или дочь никак не получается. Дополнительно прописать c номера админа "пользователя - 1, user1" с которого можно управлять сигналкой. Смс текст массив и как разобрать смс текст "user1;+79xxxxxxxxxx" где 1й фрагмент строки в массиве содержит "user1" далее разделение ";" и 2й фрагмент начинается с "+7", то записываем в память номер пользователя "user1" для управления включением и отключением охраны. Пользую библиотеку GSM.h.
А где пробема-то? Где код? В чём там ошибки? Вы же что-то писали, пробовали? Выкладывайте.
Выкладывайте.
я запретил.
Выкладывайте.
я запретил.
Низ-зя!
Во избежание правовых коллизий следует сначала отменить http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment... и только потом можно запрещать.
Сравнивать построчно научился, а вот как разложить никак не могу понять. Вот скетч
#include <GPRS_Shield_Arduino.h> #include <SoftwareSerial.h> #include <Wire.h> #include <EEPROM.h> #include <string.h> #define PIN_TX 2 #define PIN_RX 3 #define BAUDRATE 9600 #define MESSAGE_LENGTH 160 char message[30]; int messageIndex = 0; char phone[20]; char phone_admin[20]; char phone_user1[20]; char datetime[24]; char buffer[30]; char s1[20], s2[20]; GPRS gprsTest(PIN_TX,PIN_RX,BAUDRATE);//RX,TX,PWR,BaudRate byte ledPin_0 = A4; int admin = 0; void setup() { //for (int i = 0 ; i < EEPROM.length() ; i++) {EEPROM.write(i, 0);} // стирание всех ячеек памяти в "0" EEPROM.get(0, admin); EEPROM.get(10, phone_admin); delay(1000); Serial.begin(9600); while(!gprsTest.init()) { Serial.print("init error\r\n"); delay(1000);} delay(3000); Serial.println("Init Success, please send SMS message to me!"); pinMode(ledPin_0, OUTPUT); Serial.print("byte_admin = "); Serial.println(admin); Serial.println("phone_admin:"); Serial.println(phone_admin); Serial.println(" "); } void loop() { messageIndex = gprsTest.isSMSunread(); if (messageIndex > 0) { // если есть непрочитанное входящее смс gprsTest.readSMS(messageIndex, message, MESSAGE_LENGTH, phone, datetime); // читаю gprsTest.deleteSMS(messageIndex); // стираю смс Serial.print("From number: "); Serial.println(phone); // номер с которого отправлено сообщение Serial.print("Recieved Message: "); Serial.println(message); //текст сообщения Serial.println(" "); if (admin == 0){ // первое любое сообщение записывает номер админа если не записан for(int i=0; i<20; i++){ phone_admin[i] = phone[i], admin = 1; EEPROM.put(0, admin), EEPROM.put(10, phone_admin); }} //записываю в память номер админа и переменную админ if (admin == 1){ // if (strcmp(phone, phone_admin) == 0) // если входящее сообщение с номера админа // тут начинается вопрос // ???????????????? как разложить по разделителю ";" текс сообщения "User1;+7919XXXXXXX" // s1 = "User1"; первая часть сообщения до разделителя ";" // s2 = "+7919XXXXXXX"; вторая часть сообщения после разделителя ";" // if (strcmp(s1, "User1") == 0) { если первая часть содержит "User1" // for(int i=0; i<20; i++){ phone_user1[i] = s2[i]; номер phone_user1 равен строке второй части сообщения // EEPROM.put(20, User1); }} записываю номер пользователя 1 в память if (strcmp(phone, phone_admin) == 0 || strcmp(phone, phone_user1) == 0 ) { //если номер вхд соощения совпадает с ном админа ли пользов 1 if (strcmp(message, "Alarm on") == 0) { digitalWrite(ledPin_0, HIGH); } // если текст содержит "Alarm on" сигналка вкл if (strcmp(message, "Alarm off") == 0) { digitalWrite(ledPin_0, LOW); }}} // если текст содержит "Alarm off" сигналка вкл Serial.print("byte_admin = "); Serial.println(admin); Serial.println("phone_admin:"); Serial.println(phone_admin); Serial.println(" "); Serial.println(" "); } }Сравнивать построчно научился, а вот как разложить никак не могу понять.
Чего разложить? На что разложить? В какой строке кода проблема? Вы что-то там думаете себе, но мы же Ваших мыслей не читаем.
Излагайте понятно.
Смс текст как разобрать "user1;+79xxxxxxxxxx" на два фрагмента где 1й фрагмент в массиве содержит "user1" далее разделение ";" и 2й фрагмент содержит "+79xxxxxxxxxx" это будет номер user1
А текст какого типа? char * (или char[])?
Ну так в лоб и разбирайте, примерно вот так
void setup(void) { Serial.begin(115200); char * text = "user1;+79xxxxxxxxxx"; Serial.print("Iznachalniy text: "); Serial.println(text); char * part1 = text; char * part2 = strchr(text, ';'); if (!part2) Serial.println("NETU tam ';' ni hrena!"); else { *part2++ = '\0'; Serial.print("Part 1: "); Serial.println(part1); Serial.print("Part 2: "); Serial.println(part2); } } void loop(void){}charmessage[30]; массив 30 символовНу, я Вам пример привёл - делайте. С массивом или с указателем - разницы нет.
А текст какого типа? char * (или char[])?
А что, есть какая-то разница?
А текст какого типа? char * (или char[])?
А что, есть какая-то разница?
Почти нет, потому и в скобках. Вопрос был "это массив (в том или ином виде) символов или String".
Большое СПАСИБО!!! помог Ваш пример и всё заработало
С Победой!
Иду дальше и можно совет? Мне нужна только отправка и чтение смс, библиотеку подключил и памяти для переменных сразу съело 70%. Может есть не "тяжелые" библы или всеж учится работать чисто АТ командами и не запариваться с библиотеками (изучать и выкидывать с них всё лишнее)
Не знаю. Я использую готовые библиотеки только когда впервые купил новый для себя прибор и его надо быстро проверить рабочий или нет, ну и в подобных ситуациях. В сколько-нибудь отличных от нуля проектах - никогда не использую. Особенно, после того, как как имел удовольствие посмотреть на такие библиотеки как "DallasTemperature", "TLC5940" и т.п.
"DallasTemperature" это вообще якорь :)))) для ардуины, отказался почти сразу от нее