Всем доброго времени суток, занимаюсь подключением GSM модуля к ардуинке, но новичок в деле программирования. Вопрос по коду: мне необходимо по наступлению события отправлять смс на указанный номер, или на несколько номеров, зависит от того, какое событие произошло, так вот, чтобы не перебивать во всех местах номер телефона в случае его изменения, хочу сделать некую постоянную, присвоив ей значение необходимого номера, и в дальнейшем по тексту кода оперировать именем этой переменной.
для отправки смс сделал (выдернуто из кода):
01 | void sms(String text, String phone) |
04 | Serial .println( "AT+CMGS=\"" + phone + "\"" ); |
08 | Serial .print(( char )26); |
16 | if ( LEVEL_TS2 == LOW ) |
20 | sms(String( "TS2 alarm" ), String( "+79090232082" )); |
всё хорошо работает, но таких событий в коде будет множество, плюс при наступлении некоторых из них смс будет отправляться на несколько номеров, поэтому каждый раз при смене номера перелопачивать код мне не улыбается.
пробовал сделать так:
02 | char phone1[]={ "+79090232082" } |
05 | void sms(String text, String phone) |
08 | Serial .println( "AT+CMGS=\"" + phone + "\"" ); |
12 | Serial .print(( char )26); |
20 | if ( LEVEL_TS2 == LOW ) |
24 | sms(String( "TS2 alarm" ), String(phone1)); |
и нифига не сработало. предполагаю что дефайном тоже это делать неправильно. Подскажите пожалуйста бедноумному чайнику как это правильно сделать и почему не сработал мой вариант?
Строковые константы, записанные в "двойных кавычках" интерпретируются компилятором как массив символов, а не объект класса String
правильно -
String phone1 = "
+79090232082";
Спасибо, загрузил, все работает! Да, это я читал , только из примеров синтаксиса так и не разобрался как правильно написать в коде. Запутался в том, начав читать про String перешел на string массив, а оттуда из приведенных примеров написания перешел на char. получилось, что string это массив char-ов в двойных кавычках. Как задать в коде String примера нет, а сейчас получается что и объект класса String проставлен в двойные кавычки... или дело только в заглавной букве... Буду разбираться. И как тогда правильно написать двумерный массив?
(Из примера на char:
01
char
* myStrings[]={
"This is string 1"
,
"This is string 2"
,
"This is string 3"
,
02
"This is string 4"
,
"This is string 5"
,
"This is string 6"
};
03
04
void
setup
(){
05
Serial
.begin(9600);
06
}
07
08
void
loop
(){
09
for
(
int
i = 0; i < 6; i++){
10
Serial
.println(myStrings[i]);
11
delay(500);
12
}
13
}
Я в объектном программировани ни в зуб ногой, но String работает объектами, значит объекты и надо прописывать, то-есть
String telefon1 = "ХХХХХХХХХХХ"
String telefon2 = "ХХХХХХХХХХХ"
и так далее, объекты жрут память, но фунция sms у вас оперирует объектами, не меняя её - никак (я так думаю, реально знающие могут меня поправить)
Хотя...
1
void
loop
(){
2
for
(
int
i = 0; i < 6; i++){
3
String myString = myStrings[i];
4
Serial
.println(myString);
5
delay(500);
6
}
7
}
String это не ООП. Это есть в обычном Си. В обычном Си есть поинтеры(русск.название указатели). Так вот в них народ не разбирается. А раз не разбирается, то это сложно. А сложно это OOП.
char
* myStrings[]
Это массив указателей на начало "This is string 1","This is string 2" ну и так далее. И радуйтесь что вам не втюхивают шаблоны.Ему бы код поправить, чтоб заработало ))) а как - дело десятое, точнее - пример привидите как через указатель присвоить значение переменной, в IDE и чтобы скетч заработал
чтобы скетч заработал
Я что против . Пусть читает #14 и пробует. Там только "обработка программы напильником". Мы можем только морально поддержать ТС.
Спасибо друзья за ваши ответы, скетчик доработал, всё работает. С новыми вопросами пока пытаюсь разобраться сам, но если что, думаю опять к вам на поклон пойду, уж не гоните сразу )
чтобы скетч заработал
Я что против . Пусть читает #14 и пробует. Там только "обработка программы напильником". Мы можем только морально поддержать ТС.
А почему буфер используют в 10 байт? Стандартный буфер для COM порта 64 байта или не?
String это не ООП.
А что это?
1
class
String ...
Это есть в обычном Си.
Классы? А ... простите, какой именно С Вы называете обычным?
А что это?
1
class
String ...
Вы что думаете, что у меня университетское образование по программированию. Или я каждый день встречаюсь с Си. Ошибся. Перепутал srting и String.
Здравствуйте.
Я опять с char...
Имею строку формата
1
char
stroka[15] =
"123456ON+10#"
;
Мне нужно получить число между + и #
1
char
*uk1, *uk2;
2
uk1 = strchr(buffers,
'+'
);
3
uk2 = strchr(buffers,
'#'
);
4
uint8_t num = uk2 - uk1;
5
char
pp[10] =
""
;
6
strncpy(pp, strstr(buffers,
"ON+"
) + 3, num - 1);
Как сделать проще?
Мне нужно получить
числомежду + и #Именно число? Или строковое представление? Сейчас Вы строковое представление получаете. Если число, то после того, как нашли адрес +, просто берите atoi от него + 1 и больше ничего не нужно.
http://arduino.ru/Reference/StringSubstring
Ну и какие-нибудь indexof(«#»), для получения параметров. Чисто предположение, проверить сейчас нет возможности.
Именно число? Или строковое представление? Сейчас Вы строковое представление получаете. Если число, то после того, как нашли адрес +, просто берите atoi от него + 1 и больше ничего не нужно.
Да, число, я его после преобразовывала в число.
atoi отбросит лишние символы?
А если в строке будет несколько параметров, к примеру:
1
char
stroka[15] =
"123456|ON|10|#"
;
Как проще разбить эту строку по разделителю?
http://arduino.ru/Reference/StringSubstring
Ну и какие-нибудь indexof(«#»), для получения параметров. Чисто предположение, проверить сейчас нет возможности.
char а не string )))
Имею строку формата
1
char
stroka[15] =
"123456ON+10#"
;
Мне нужно получить число между + и #
Может не проще, но альтернативнее.
01
void
setup
() {
02
Serial
.begin(9600);
03
char
stroka[15] =
"123456ON+10#"
, c;
04
uint32_t result = 0;
05
uint8_t len =
sizeof
(stroka) /
sizeof
(*stroka);
06
for
(int8_t i = 0; i < len ; i++) {
07
if
(stroka[i] ==
'+'
) {
08
for
(int8_t j = i + 1; j < len; j++) {
09
c = stroka[j];
10
if
(c ==
'#'
)
break
;
11
if
(c >=
'0'
&& c <=
'9'
)
12
result = result * 10 + (stroka[j] - 48);
13
}
14
break
;
15
}
16
}
17
Serial
.println(result);
18
}
19
20
void
loop
() {}
Плюс замените на \0, найдите позицию # и указатель, начиная с неё+1, передайте в atoi.
А если в строке будет несколько параметров, к примеру:
1
char
stroka[15] =
"123456|ON|10|#"
;
тут куча дополнительных вопросов. Первый и главный, откуда берётся строка? Если её готовит человек ручками, то надо обрабатывать ошибки формата. А если машина готовит, то не надо. Это две большие разницы.
Машина готовит
Т.е. считаем, что ошибок в подготовке данных нет.
Ну, тогда: самый просто способ, кончено strtok
01
void
setup
(
void
){
02
Serial
.begin(115200);
03
char
*sInput = (
char
*)
"123456ON+10|32|45|123|#"
;
04
05
for
(
char
*p = strtok(strchr(sInput,
'+'
),
"+|"
); p; p = strtok(NULL,
"#|"
)) {
06
const
int
f = atoi(p);
07
Serial
.println(f);
08
}
09
}
10
11
void
loop
(
void
){}
но, можно и как у Вас было.
01
void
setup
(
void
){
02
Serial
.begin(115200);
03
char
*sInput = (
char
*)
"123456ON+10|32|45|123#"
;
04
05
for
(
char
* p = strchr(sInput,
'+'
); p && *(p+1); p = strchr(p,
'|'
)) {
06
const
int
f = atoi(p+++1);
07
Serial
.println(f);
08
}
09
}
10
11
void
loop
(
void
){}
Но с strtock будет раза в три быстрее.
Большое спасибо.
1
for
(
char
*p = strtok(strchr(sInput,
'+'
),
"+|"
); p; p = strtok(NULL,
"#|"
)) {
Почему здесь NULL? strtok(NULL, "#|")
и ещё вопрос:
01
uint32_t vals[2];
02
char
stroka[50] =
"12345676AN401"
;
03
04
for
(
char
*p = strtok(stroka,
"AN"
); p; p = strtok(NULL,
"AN"
)) {
05
static
uint8_t i;
06
Serial
.print(
"i = "
);
Serial
.print(i);
Serial
.println(
""
);
07
vals[i++] = atol(p);
08
}
09
Serial
.print(
"vals0 = "
);
Serial
.print(vals[0]);
Serial
.println(
""
);
10
Serial
.print(
"vals1 = "
);
Serial
.print(vals[1]);
Serial
.println(
""
);
11
12
13
for
(
char
*p = strtok(stroka,
"AN"
); p; p = strtok(NULL,
"AN"
)) {
14
static
uint8_t i;
15
Serial
.print(
"i = "
);
Serial
.print(i);
Serial
.println(
""
);
16
vals[i++] = atol(p);
17
}
18
Serial
.print(
"vals0 = "
);
Serial
.print(vals[0]);
Serial
.println(
""
);
19
Serial
.print(
"vals1 = "
);
Serial
.print(vals[1]);
Serial
.println(
""
);
Почему при выполнении второго цикла i=0 и всё, нет i=1
Почему при выполнении второго цикла i=0 и всё, нет i=1
так суббота жеж )))
PS "чти день субботний"
1
for
(
char
*p = strtok(strchr(sInput,
'+'
),
"+|"
); p; p = strtok(NULL,
"#|"
)) {
Почему здесь NULL? strtok(NULL, "#|")
NULL означает, что надо не начинать новый поиск, а продолжить текущий. Это написано в описании функции strtok, ссылку на которое я давал в посте #20.
Почему при выполнении второго цикла i=0 и всё, нет i=1
Потому, что во втором цикле она не нашла 401, а нашла только 12345676. То, что 401 печатается - не должно вводить Вас в заблуждение. Это оно от первого цикла там осталось.
А не нашла она потому, что strtok вставляет в строку концевые нули после лексем. Так что после первого цикла Ваша строка уже поменялась. Вставьте
1
Serial
.print(
"stroka = "
);
Serial
.print(stroka);
Serial
.println();
перед обоими for и увидите, что строка уже не та.
Это (то, что strtok гадит в строку) тоже, кстати, написано в п-описании. Вы его не читали?
А не нашла она потому, что strtok вставляет в строку концевые нули после лексем.
Это (то, что strtok гадит в строку) тоже, кстати, написано в п-описании.
"...вот она какая тётя Хая..." PS и как это можно всё запомнить )))
Это (то, что strtok гадит в строку) тоже, кстати, написано в п-описании. Вы его не читали?
Теперь всё поняла. Ещё раз спасибо.
Ещё ещё вопрос.
1
static
uint32_t qaz =123456;;
2
char
stroka[15];
3
ultoa(qaz , stroka, DEC);
4
if
(strstr (buffers, stroka) != NULL) {....}
Чтобы произвести поиск числа типа uint_32t в строке обязательно число переводить в char создавая ещё одну переменную...?
Охохо... А вы представляете, чем строка от числа отличается и как поиск происходит?
Думаю, что происходит посимвольное сравнение, если первый символ 1 строки равен первому символу 2 строки то если 2 символ 1 строки ....
Похоже, что не все так плохо, как могло казаться.
Что, если я Вам приведу пример:
- Число 123 в uint32 хранится в памяти МК как: 0000 0000 0111 1011
- Строка 123 хранится в памяти МК как: 0011 0001 | 0011 0010 | 0011 0011
ASCII 49 | ASCII 50 | ASCII 51
Будет ли в этом случае побайтовое сравнение корректным?
Не будет.
Вот вам и ответ: хотите сравнить строки - сравнивайте строки. Сравнение числа и строки - бессмысленно и безрезультатно.
На всякий случай сообщаю вам, что char[] и char* - в СИ это, по большому счету, одна сущность - ASCIIZ-строка, он же массив ASCII-кодов, заканчивающийся терминатором '\0' (байтом 0x00, Zero-кодом).