Помогите отправить команду в Serial, непонятный предел.
- Войдите на сайт для отправки комментариев
Пт, 02/12/2016 - 12:40
Добрый день.
Нужна помощь знающих людей.
Arduino Nano + Sim800L.
Все работает хорошо, кроме того, что не могу передать команду на выполнение модему - обрезается длина строки.
Объявлена переменная char URL[100] = "?api_key=QDGLLN3P678PLY3D&field1=11\"";
Передаю команду модему GSMport.print("AT+HTTPPARA=\"URL\",\"https://api.thingspeak.com/update");
Далее, побайтно, передаю остаток строки из переменной
for (int i=0; i < sizeof(URL); i++) {
GSMport.print(URL[i]);
В итоге, получаю результат: AT+HTTPPARA="URL","https://api.thingspeak.com/update?api_key=QD
Т.о. из требуемой длинны в 36 символов передалось всего 11. В сумме 64 символа.
Как с этим бороться?
Спасибо!
Размер "64 символа" наводит на мысль о переполнении буфера.
Можно либо увеличить длину буфера, либо использовать небуферизованную передачу.
64 символа ? А почитайте про размер буфера последовательного порта, например, https://www.google.com.ua/?gws_rd=ssl#q=arduino+serial+%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80+%D0%B1%D1%83%D1%84%D0%B5%D1%80%D0%B0
Размер "64 символа" наводит на мысль о переполнении буфера.
Можно либо увеличить длину буфера, либо использовать небуферизованную передачу.
Спасибо за ответ. Длину буфера попытался увеличить переназначив #define buffer с 64 на 128. Не помогло.
А как организовать небуферизированную передачу?
Длину буфера попытался увеличить переназначив #define buffer с 64 на 128. Не помогло.
Это не то, и не там. Найдите в в каталоге Arduino IDE файл HardwareSerial.h, посмотрите там
Длину буфера попытался увеличить переназначив #define buffer с 64 на 128. Не помогло.
Это не то, и не там. Найдите в в каталоге Arduino IDE файл HardwareSerial.h, посмотрите там
Понял. Нашел и подправил вот так:
Чтобы победить, нужно понять, что именно происходит.
Для начала просто распечатать SERIAL_TX_BUFFER_SIZE и SERIAL_RX_BUFFER_SIZE.
Чтобы победить, нужно понять, что именно происходит.
Для начала просто распечатать SERIAL_TX_BUFFER_SIZE и SERIAL_RX_BUFFER_SIZE.
Да, все верно. Я это сделал в предыдущем посте.
И что получили?
И что получили?
К сожалению, все тоже самое :(
Нет в софт-сериале НА ПЕРЕДАЧУ никакого буфера, вообще никакого.
В чем-то другом дело. Покажите больше кода.
То есть 64 - это конечно искуственно вылезающее ограничение, но это размер буфера ПРИЕМА. Какая связь?
И что получили?
К сожалению, все тоже самое :(
Еще раз: какое число выдает в консоль?
Андриано!
Это GSM модуль и Нанка. Подключение возможно исключительно через софт-сериал.
Какое значение имеют размеры буферов хард-сериала? Мы куда-то в дебри полезли, не имеющие отношения к задаче.
Поменял Nano на Uno.
Та же ерунда, уже и не знаю что с этим делать. Не хочет отдавать в модуль строку - хоть убейся!
Значения буфера изменены, вот так:
Вот код. Помогите люди добрые!
#include <SoftwareSerial.h> SoftwareSerial GSMport(4, 3); // RX, TX String cmd = "QDGLLN3P678PLN3D&field1="; void setup() { // put your setup code here, to run once: // pinMode(SensorPin, INPUT); // digitalWrite(SensorPin, HIGH); //вкл. подтягивающий резистор 20ом Serial.begin(9600); //скорость порта GSMport.begin(9600); delay(3000); //дадим время на инициализацию GSM модулю Serial.println("GPRS test started..."); gprs_init(); GSMport.println("AT"); delay(100); resp(); GSMport.println("AT+CGATT?"); delay(200); resp(); GSMport.println("AT+CIPSHUT"); delay(2000); resp(); GSMport.println("AT+CIPSTATUS"); delay(100); resp(); GSMport.println("AT+CIPMUX=0"); delay(100); resp(); GSMport.println("AT+CSTT=\"internet.mts.ru\",\"mts\",\"mts\""); delay(100); resp(); GSMport.println("AT+CIICR"); delay(1000); resp(); GSMport.println("AT+CIFSR"); delay(2000); resp(); GSMport.println("AT+CIPSTATUS"); delay(500); resp(); GSMport.println("AT+CIPSTART=\"TCP\",\"thingspeak.com\",\"80\""); delay(2000); resp(); cmd += "77"; GSMport.print("AT+CIPSEND="); GSMport.println(cmd.length()+42); delay(1000); resp(); GSMport.print("https://api.thingspeak.com/update?api_key="); // for (int i=0; i < sizeof(cmd); i++) { // GSMport.print(cmd[i]); // } delay(0); GSMport.print(cmd); delay(1000); GSMport.println(0x1A, HEX); delay(1000); resp(); /* if (GSMport.find(">")) { GSMport.print(cmd); GSMport.println(0x1A, HEX); resp(); Serial.println("Command string transmited..."); delay(500); } else Serial.println("Command string not trasmited...Not found >..."); if (GSMport.find("OK")) Serial.println("RECEIVED: OK"); else Serial.println("RECEIVED: Error"); delay(1000); */ GSMport.println("AT+CIPCLOSE"); delay(500); resp(); GSMport.println("AT+CIPSHUT"); delay(500); resp(); } void loop() { // put your main code here, to run repeatedly: } void gprs_init() { } void resp() { while (GSMport.available()) { if (GSMport.available() > 0) { Serial.write(GSMport.read()); } } }Поменял Nano на Uno.
Та же ерунда, уже и не знаю что с этим делать. Не хочет отдавать в модуль строку - хоть убейся!
Значения буфера изменены, вот так:
На всякий случай напомню, что wdrakula утверждает, что этот фрагмент к Вашей задаче никакого отношения не имеет. Спорить с ним не буду, т.к. в данном вопросе даже не пытался разобраться.
Если же Вы считаете, что эти константы для Вас важны, то следует убадиться, какие знеачения они принимают на самом деле. А проще всего это сделать примерно так:
voud setup() { Serial.print("SERIAL_TX_BUFFER_SIZE: "); Serial.print(SERIAL_TX_BUFFER_SIZE); Serial.print(", "); Serial.print("SERIAL_RX_BUFFER_SIZE: "); Serial.println(SERIAL_RX_BUFFER_SIZE); }У софтового сериала свой буфер. Править его размер надо в SoftwareSerial.h
Сейчас могу не правильно вспомнить (среды под рукой нет), вроде #define _SS_MAX_TX_BUFF и #define _SS_MAX_RX_BUFF
У софтового сериала свой буфер. Править его размер надо в SoftwareSerial.h
Сейчас могу не правильно вспомнить (среды под рукой нет), вроде #define _SS_MAX_TX_BUFF и #define _SS_MAX_RX_BUFF
а у меня есть под рукой. у софт сериала буфер - только не прием.
Этот ньюанс не помнил)) Посмотрел реализацию write - вывод действительно идет без буфера.
Может это как-то задержки отрицательно сказываются или их время не оптимально? Я тупо не могу понять как это победить... Ведь народ использует эти модули! Я уже грешу на то, что модуль неисправен...
Попробуйте в функции resp(), после 118 строки добавить небольшую задержку, delay(10), например. Возможно, не успевает выдать всю информацию.
И как Вы определяете, что передалась не вся строка? Если по ответу модуля, то в этом случае нужно увеличивать буфер в SoftwareSerial.h, параметр _SS_MAX_RX_BUFF
Еще, в режиме gprs модуль крайне требователен к питанию. Мне помогла припайка проводов питания напрямую, через макетку работало нестабильно, хотя все остальные функции - без проблем были.
Решил проблему или нет?
достучался до сайта thing speak.com?
Я на sim800l отправил данные на этот сайт только через набор команд at-sapbr
Для работы по http протоколу, и модуль твой исправен:))