Отправка TXT файла на FTP через GPRS. Прилетает пустой файл
- Войдите на сайт для отправки комментариев
Чт, 22/03/2018 - 23:10
Приветствую, прошу помочь с разбором проблемы.
Отправляю текстовый файл (5 строк) с SD-карты на свой FTP сервер через GPRS. SIM900 подключен к Mega2560 по Serial2.
Подключение к FTP проходит нормально. Файл на FTP создается, но он пустой. Есть какая-то проблема с пересылкой данных.
#include <SPI.h> #include <SD.h> char* file_name1 = "Text1.txt"; char char_buffer; String string_buffer = ""; int buffer_space = 1000; File dataFile; void setup() { Serial.begin(9600); Serial2.begin(9600); //Включаем GPRS Shield delay(3000); pinMode(9, OUTPUT); digitalWrite(9, HIGH); // Подаем High на пин 9 delay(3000); // на 3 секунды digitalWrite(9, LOW); // и отпускаем в Low. delay(5000); Serial.print("Initializing SD card..."); // проверяем наличие карты и инициализируем её. Управляющий Пин 53 if (!SD.begin(53)) { Serial.println("Card failed, or not present"); // don't do anything more: return; } Serial.println("card initialized."); Serial.println("Sending file Log.txt to FTP..."); gprs_modem_function (); Serial.println("The end..."); } void loop() { } // end of loop byte gprs_modem_function () //описание функций отправки файла на FTP { byte reply = 1; int i = 0; while (i < 10 && reply != 1){ //Try 10 times... reply = sendATcommand("AT+CREG?","+CREG: 0,1","ERROR", 2000); i++; delay(1000); } if (reply == 1){ reply = sendATcommand("AT+SAPBR=3,1,\"Contype\",\"GPRS\"","OK","ERROR", 2000); if (reply == 0){ reply = sendATcommand("AT+SAPBR=3,1,\"APN\",\"internet.beeline.ru\"", "OK", "ERROR", 2000); if (reply ==0){ reply = sendATcommand("AT+SAPBR=3,1,\"USER\",\"beeline\"", "OK", "ERROR", 2000); if (reply == 0){ reply = sendATcommand("AT+SAPBR=3,1,\"PWD\",\"beeline\"", "OK", "ERROR", 2000); if (reply == 0){ reply = 2; i = 0; while (i < 5 && reply == 2){ //Try 3 times... reply = sendATcommand("AT+SAPBR=1,1", "OK", "ERROR", 5000); if (reply == 1){ sendATcommand("AT+SAPBR=0,1", "OK", "ERROR", 5000); } i++; } if (reply == 0){ reply = sendATcommand("AT+SAPBR=2,1", "OK", "ERROR", 2000); if (reply == 0){ reply = sendATcommand("AT+FTPCID=1", "OK", "ERROR", 2000); if (reply == 0){ reply = sendATcommand("AT+FTPMODE=1", "OK", "ERROR", 2000); // Пассивный режим (1) Активный режим (0) if (reply == 0){ reply = sendATcommand("AT+FTPSERV=\"195.26.XX.XX\"", "OK", "ERROR", 2000); //сервер фтп, можно как айпи указать так и адрес if (reply == 0){ reply = sendATcommand("AT+FTPPORT=21", "OK", "ERROR", 2000); if (reply == 0){ reply = sendATcommand("AT+FTPUN=\"USER_NAME\"", "OK", "ERROR", 3000); // Логин “Mobile_Octopus” if (reply == 0){ reply = sendATcommand("AT+FTPPW=\"PASSWORD\"", "OK", "ERROR", 3000); // Пароль “Hw=6&bQhN?” if (reply == 0){ reply = sendATcommand("AT+FTPPUTNAME=\"" + String(file_name1) + "\"", "OK", "ERROR", 3000); if (reply == 0){ reply = sendATcommand("AT+FTPPUTPATH=\"/\"", "OK", "ERROR", 3000); if (reply == 0){ unsigned int ptime = millis(); reply = sendATcommand("AT+FTPPUT=1", "+FTPPUT: 1,1", "+FTPPUT: 1,6", 60000); Serial.println("Time: " + String(millis() - ptime)); if (reply == 0){ if (dataFile) { int i = 0; while (dataFile.available()>0) { char_buffer = dataFile.read(); string_buffer.concat(char_buffer); i++; if (i == buffer_space) { sendATcommand("AT+FTPPUT=2," + String(buffer_space), "AT+FTPPUT=2,10", "ERROR", 4000); sendATcommand(string_buffer, "OK", "ERROR", 5000); string_buffer = ""; i = 0; } } if (string_buffer != ""){ sendATcommand("AT+FTPPUT=2," + String(i), "AT+FTPPUT=2,10", "ERROR", 1000); sendATcommand(string_buffer, "OK", "ERROR", 5000); sendATcommand("AT+FTPPUT=2,0", "OK", "ERROR", 1000); } dataFile.close(); } } } } } } } } } } } } } } } } } return reply; } byte sendATcommand(String ATcommand, String answer1, String answer2, unsigned int timeout){ byte reply = 1; String content = ""; char character; //Clean the modem input buffer while(Serial2.available()>0) Serial2.read(); //Send the atcommand to the modem Serial2.println(ATcommand); delay(100); unsigned int timeprevious = millis(); while((reply == 1) && ((millis() - timeprevious) < timeout)){ while(Serial2.available()>0) { character = Serial2.read(); content.concat(character); Serial.print(character); delay(10); } //Stop reading conditions if (content.indexOf(answer1) != -1){ reply = 0; }else if(content.indexOf(answer2) != -1){ reply = 2; }else{ //Nothing to do... } } return reply; }Судя по выводу в Сериал - программа останавливается на строке 92. А отправка файла должна происходить в строке 101 и далее.
Так что неудивительно, что на ФТП передается файл нулевого размера - данные-то ваш скетч не отправляет.
вопрос - почему?
вопрос - почему?
Если отвечать в общем - потому что вы используете для отправки файла функцию SendATCommand(), которая тут мало подходит.
А если конкретно - вы передаете в функцию один ответ, а сервер возвращает другой, поэтому функция возвращает ошибку и программа дальше не идет.