Отправка TXT файла на FTP через GPRS. Прилетает пустой файл

VS_Viktor
Offline
Зарегистрирован: 27.02.2018

Приветствую, прошу помочь с разбором проблемы.

Отправляю текстовый файл (5 строк) с SD-карты на свой FTP сервер через GPRS. SIM900 подключен к Mega2560 по Serial2.

Подключение к FTP проходит нормально. Файл на FTP создается, но он пустой. Есть какая-то проблема с пересылкой данных. 

 

VS_Viktor
Offline
Зарегистрирован: 27.02.2018
#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;
}

 

VS_Viktor
Offline
Зарегистрирован: 27.02.2018
МОНИТОР:

Initializing SD card...card initialized.
Sending file Text1.txt to FTP...
AT+SAPBR=3,1,"Contype","GPRS"

OK
AT+SAPBR=3,1,"APN","internet.beeline.ru"

OK
AT+SAPBR=3,1,"USER","beeline"

OK
AT+SAPBR=3,1,"PWD","beeline"

OK
AT+SAPBR=1,1

ERROR
AT+SAPBR=1,1

ERROR
AT+SAPBR=1,1

ERROR
AT+SAPBR=1,1

ERROR
AT+SAPBR=1,1

OK
AT+SAPBR=2,1

+SAPBR: 1,1,"100.67.82.219"

OK
AT+FTPCID=1

OK
AT+FTPMODE=1

OK
AT+FTPSERV="195.26.XX.XX"

OK
AT+FTPPORT=21

OK
AT+FTPUN="USER_NAME"

OK
AT+FTPPW="PASSWORD"

OK
AT+FTPPUTNAME="Text1.txt"

OK
AT+FTPPUTPATH="/"

OK
AT+FTPPUT=1

OK

+FTPPUT:1,1,1280
Time: 60101
The end... 

 

b707
Offline
Зарегистрирован: 26.05.2017

Судя по выводу в Сериал - программа останавливается на строке 92. А отправка файла должна происходить в строке 101 и далее.

Так что неудивительно, что на ФТП передается файл нулевого размера - данные-то ваш скетч не отправляет.

VS_Viktor
Offline
Зарегистрирован: 27.02.2018

вопрос - почему?

b707
Offline
Зарегистрирован: 26.05.2017

VS_Viktor пишет:

вопрос - почему?

Если отвечать в общем - потому что вы используете для отправки файла функцию SendATCommand(), которая тут мало подходит.

А если конкретно - вы передаете в функцию один ответ, а сервер возвращает другой, поэтому функция возвращает ошибку и программа дальше не идет.