#1 2017-07-28 10:20:29

DangerD
Учасник
Зареєстрований: 2016-05-18
Повідомлень: 6

GPRS отправка данных

Уже задолбался, надо отправить длинную строку с данными с метеостанции, понятное дело что длинная строка не катит так как в ардуине памяти нету...

Так работает

char http_cmd[] = "GET /send.php?test=1 HTTP/1.0\r\n\r\n";
sim900_send_cmd(http_cmd);

Так памяти не хватает:

String http_cmd_str = "GET /send.php?gpsCoords="+urlencode(gpsCoords)+"&humidity="+urlencode(humidity)+"&temperature2="+urlencode(temperature2)+"&pressure="+urlencode(pressure)+"&altitude="+urlencode(altitude)+"&temperatureGround="+urlencode(temperatureGround)+"&temperature="+urlencode(temperature)+" HTTP/1.0\r\nHost: test.org\r\n\r\n"

В итоге пытаюсь сделать что-то типа:

  String http_cmds[] = {
    F("GET /send.php?"),
    F("gps="),
    gpsCoords,
    F("&hm="),
    humidity,
    F("&t1="),
    temperature,
    F("&t2="),
    temperature2,
    F("&pr="),
    pressure,
    F("&alt="),
    altitude,
    F("&gnd="),
    temperatureGround,
    F(" HTTP/1.0\r\nHost:"),
    F("dangerd.org\r\n\r\n")
  };

int str_tlen;
  for(i=0;i<=16;i++) {
    str_tlen = http_cmds[i].length() + 1; 
    char http_cmd[str_len];
    http_cmds[i].toCharArray(http_cmd, str_tlen);
    Serial.println(http_cmd);
    sim900_send_cmd(http_cmd);
  }
  gprs_send();

Но не работает по непонятной причине...

У кого какие идеи как отослать много переменных на сервер за раз?

Неактивний

#2 2017-07-28 15:10:07

Nefreemen
Учасник
З Киев
Зареєстрований: 2015-12-19
Повідомлень: 716

Re: GPRS отправка данных

Буфер сериал по умолчанию 64 байта и по идее должен зависеть от МК, но по неизвестной причине даже для Atmega2560 он все равно устанавливается в 64 sad . Поправьте в библиотеке Serial, поставьте 256 байт.

Неактивний

#3 2017-07-28 16:00:35

DangerD
Учасник
Зареєстрований: 2016-05-18
Повідомлень: 6

Re: GPRS отправка данных

Вячеслав Азаров пише:

Не используйте класс String. В таких микроскопических компьютерах нужно делать сборку и отправку длинных строк, как говорится, на лету. Например с помощью fprintf(...). Но сделать это в Ардуино весьма затруднительно.

Можете скинуть пример как переписать?

Неактивний

#4 2017-07-28 20:34:17

Nefreemen
Учасник
З Киев
Зареєстрований: 2015-12-19
Повідомлень: 716

Re: GPRS отправка данных

DangerD, на мой взгляд Вы попали на то что и я, что бы найти причину я потратил два вечера. И я думаю что Вы увидите все своими глазами если подключитесь к ардуинке сериал монитором что она шлет в модем, не поленитесь посчитайте символы lol. И причина не в классе Serial  smile , и в размере памяти smile. Вы где то встречали в описании класса String или массива char[] ограничение на количество символов? Может оно и существует но я не встречал.

Неактивний

#5 2017-07-28 22:08:10

Nefreemen
Учасник
З Киев
Зареєстрований: 2015-12-19
Повідомлень: 716

Re: GPRS отправка данных

Спасибо буду знать  smile . хотя можно было сообразить 2^8  smile .
С модемом не работал поэтому не пойму что это и зачем:
int str_tlen;
  for(i=0;i<=16;i++) {
    str_tlen = http_cmds[ i ].length() + 1;
    char http_cmd[str_len];
    http_cmds[ i ].toCharArray(http_cmd, str_tlen);
    Serial.println(http_cmd);
    sim900_send_cmd(http_cmd);
  }
Похоже на создание const char*, но почему в цикле и по 16 и почему по байтно с добавлением непечатного  roll .
Но это вопрос наверное к ТС.

Неактивний

#6 2017-07-29 23:38:52

DangerD
Учасник
Зареєстрований: 2016-05-18
Повідомлень: 6

Re: GPRS отправка данных

Nefreemen пише:

Спасибо буду знать  smile . хотя можно было сообразить 2^8  smile .
С модемом не работал поэтому не пойму что это и зачем:
int str_tlen;
  for(i=0;i<=16;i++) {
    str_tlen = http_cmds[ i ].length() + 1;
    char http_cmd[str_len];
    http_cmds[ i ].toCharArray(http_cmd, str_tlen);
    Serial.println(http_cmd);
    sim900_send_cmd(http_cmd);
  }
Похоже на создание const char*, но почему в цикле и по 16 и почему по байтно с добавлением непечатного  roll .
Но это вопрос наверное к ТС.

Это костыль) (Кол-во элементов  String http_cmds[])

Короче говоря фунцкия sim900_send_cmd(http_cmd) понимает только char array (char[])
У меня данные приходят с различных сенсоров (температура влажность координаты и т.п.) и их надо отправить.
Надо в общем всё перевести в char array каким-то раком, а так как я пхпшник, то для меня это проблема))

Остання редакція DangerD (2017-07-29 23:39:30)

Неактивний

#7 2017-07-30 00:03:47

Nefreemen
Учасник
З Киев
Зареєстрований: 2015-12-19
Повідомлень: 716

Re: GPRS отправка данных

DangerD пише:
Nefreemen пише:

Спасибо буду знать  smile . хотя можно было сообразить 2^8  smile .
С модемом не работал поэтому не пойму что это и зачем:
int str_tlen;
  for(i=0;i<=16;i++) {
    str_tlen = http_cmds[ i ].length() + 1;
    char http_cmd[str_len];
    http_cmds[ i ].toCharArray(http_cmd, str_tlen);
    Serial.println(http_cmd);
    sim900_send_cmd(http_cmd);
  }
Похоже на создание const char*, но почему в цикле и по 16 и почему по байтно с добавлением непечатного  roll .
Но это вопрос наверное к ТС.

Это костыль) (Кол-во элементов  String http_cmds[])

Короче говоря фунцкия sim900_send_cmd(http_cmd) понимает только char array (char[])
У меня данные приходят с различных сенсоров (температура влажность координаты и т.п.) и их надо отправить.
Надо в общем всё перевести в char array каким-то раком, а так как я пхпшник, то для меня это проблема))

Давеча глянул стандартный пример в ИДЕ по модему и вообще Ваш код не понял. Как для меня то слишком много "непоняток" куда отправлять (что отправлять понятно smile ) и какое управление модемом, такое впечатление что на уровне SDK модема smile ). Если это не в облака (где нужен какой то определенный формат) а куда то себе, то слепите вручную (или используйте библиотеку соответствующую) JSON строку и "пульните" что хотите.

Неактивний

#8 2017-07-30 00:16:06

DangerD
Учасник
Зареєстрований: 2016-05-18
Повідомлень: 6

Re: GPRS отправка данных

Nefreemen пише:
DangerD пише:
Nefreemen пише:

Спасибо буду знать  smile . хотя можно было сообразить 2^8  smile .
С модемом не работал поэтому не пойму что это и зачем:
int str_tlen;
  for(i=0;i<=16;i++) {
    str_tlen = http_cmds[ i ].length() + 1;
    char http_cmd[str_len];
    http_cmds[ i ].toCharArray(http_cmd, str_tlen);
    Serial.println(http_cmd);
    sim900_send_cmd(http_cmd);
  }
Похоже на создание const char*, но почему в цикле и по 16 и почему по байтно с добавлением непечатного  roll .
Но это вопрос наверное к ТС.

Это костыль) (Кол-во элементов  String http_cmds[])

Короче говоря фунцкия sim900_send_cmd(http_cmd) понимает только char array (char[])
У меня данные приходят с различных сенсоров (температура влажность координаты и т.п.) и их надо отправить.
Надо в общем всё перевести в char array каким-то раком, а так как я пхпшник, то для меня это проблема))

Давеча глянул стандартный пример в ИДЕ по модему и вообще Ваш код не понял. Как для меня то слишком много "непоняток" куда отправлять (что отправлять понятно smile ) и какое управление модемом, такое впечатление что на уровне SDK модема smile ). Если это не в облака (где нужен какой то определенный формат) а куда то себе, то слепите вручную (или используйте библиотеку соответствующую) JSON строку и "пульните" что хотите.

String http_cmd_str = "GET /send.php?gpsCoords="+urlencode(gpsCoords)+"&humidity="+urlencode(humidity)+"&temperature2="+urlencode(temperature2)+"&pressure="+urlencode(pressure)+"&altitude="+urlencode(altitude)+"&temperatureGround="+urlencode(temperatureGround)+"&temperature="+urlencode(temperature)+" HTTP/1.0\r\nHost: test.org\r\n\r\n"

Вот строка, только толку от неё нет так как длина строки очень большая и не хватает памяти...

Неактивний

#9 2017-07-30 11:46:27

Nefreemen
Учасник
З Киев
Зареєстрований: 2015-12-19
Повідомлень: 716

Re: GPRS отправка данных

Вот и используйте, JOSON формат {"переменная1":"значение1","переменная2":"значение2",..., "переменнаяN":"значениеN"}. Имена переменных сделайте покороче. Ну а вообще мне не понятно, Вам что нужна отправка по какому то формату не от Вас зависимому? Ну например на narodmon.ru? И Вы используете библиотеку ардуино для модема или нет? При использовании библиотеки не должно быть подобных траблов.

Неактивний

#10 2017-07-30 23:24:45

DangerD
Учасник
Зареєстрований: 2016-05-18
Повідомлень: 6

Re: GPRS отправка данных

Nefreemen пише:

Вот и используйте, JOSON формат {"переменная1":"значение1","переменная2":"значение2",..., "переменнаяN":"значениеN"}. Имена переменных сделайте покороче. Ну а вообще мне не понятно, Вам что нужна отправка по какому то формату не от Вас зависимому? Ну например на narodmon.ru? И Вы используете библиотеку ардуино для модема или нет? При использовании библиотеки не должно быть подобных траблов.

Суть та же, на длину строки не повлияет...

Неактивний

#11 2017-07-31 09:58:16

Nefreemen
Учасник
З Киев
Зареєстрований: 2015-12-19
Повідомлень: 716

Re: GPRS отправка данных

Да ладно если Вы так хотите оставить в тайне куда Вы хотите отправить себе на сервер или в облако, и даже то что можно ли менять формат для меня секрет. А для Вас имя переменной temperature1 имеет одинаковую длину как и имя t1 тогда извиняйте, и позвольте откланяться smile .

Остання редакція Nefreemen (2017-07-31 10:00:57)

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму