www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Datei auf FTP per GSM-Modul GC864 Telit, C++


Autor: Frank Gsm (frank_gsm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen!

Ich habe das Gsm-Modul Telit GC864-QUAD und das Evaluationsboard S3 der 
Firma Round Solutions gekauft. Vorerst möchte ich es über PC (RS232, 
COM1) mit einer c++ Anwendung ansteuern. Später soll das ein eigener µC 
machen. Ich bin kein C-Profi, hab aber schon die ein oder anderen 
kleinen Sachen damit programmiert.

Nun will ich beliebige Dateien mit diesem GSM-Modul auf einen FTP-Server 
stellen.

Ich kann zwar Textdateien schreiben (dafür gibt es quasi fertige 
AT-Befehle), alles andere macht aber Probleme. Ich wollte z.B. ein 
kleines .jpg (<2KB) kopieren, wobei einige Byte ankommen. Hat jemand 
bereits etwas Ähnliches gemacht?? Ich sitze jetzt schon ne gefühlte 
Ewigkeit da dran und komm einfach nicht weiter!


Ich habs halt über "AT#FTPOPEN..." und "AT#FTPPUT="testbild.jpg"" 
versucht. Hier habe ich auf binär-Mode gestellt und will jetzt die 
geöffnete Bilddatei auf den COM-Port ausgeben (vielleicht vorher in 
einem char-Array speichern?). Einlesen tue ich folgendermaßen:
  FILE * pFile;
  long lSize;
  char * buffer;
  size_t result;

  initRS232();

  pFile = fopen ( "c:/bild.jpg" , "rb" );
  if (pFile==NULL) {fputs ("File error",stderr); exit (1);}

  // obtain file size:
  fseek (pFile , 0 , SEEK_END);
  lSize = ftell (pFile);
  rewind (pFile);

  // allocate memory to contain the whole file:
  buffer = (char*) malloc (sizeof(char)*lSize);
  if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);}

  // copy the file into the buffer:
  result = fread (buffer,1,lSize,pFile);
  if (result != lSize) {fputs ("Reading error",stderr); exit (3);}

  /* the whole file is now loaded in the memory buffer. */
 
  char bufferAr[]={0};

  strcpy(bufferAr, buffer);
  gsmFTPupBin(bufferAr);

    closeRS232();

  // terminate
  fclose (pFile);
  free (buffer);

Ich würde also einfach "buffer" in ein Array schreiben und dieses dann 
dem COM-Port geben. So ca:
WriteFile(hComPort, fstream, (DWORD)strlen(fstream), &len, NULL);
und damit zum Schreiben des COM-Ports:
void initRS232()
{
  hComPort = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0);
  
  if (hComPort == INVALID_HANDLE_VALUE)
  {
    printf("Fehler: COM1 nicht gefunden!\n");
    exit(1);
  }
}

Leider funktioniert das so nicht...ich komm einfach nicht weiter!! Bin 
über jeden kleinen Tip dankbar!!

LG Frank

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frank Gsm schrieb:
> 
>   char bufferAr[]={0};
> 
>   strcpy(bufferAr, buffer);

Das geht mit Sicherheit schief. bufferAr ist in den allermeisten Fällen 
zu klein und strcpy ist die falsche Funktion, um Binärdaten zu 
kopieren...

Autor: Frank Gsm (frank_gsm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Antwort! Jetzt im Nachhinein leuchtet mir das auch ein, 
dass man Binärdateien nicht in ein Char-Array packen kann.

Ich habe das jetzt ein wenig umgeschrieben und es hat auch geklappt, 
dass ich eine kleine Bilddatei per GSM Modul auf einen FTP Server senden 
und lesen konnte.
Statt des "char bufferAr[]={0};" benutze ich jetzt direkt den buffer und 
dessen Größe. Hier die Änderungen:

  gsmFTPupBin(buffer, lSize);

gibt es an:

void gsmFTPupBin(byte * fstream, long lsize)
{  
  commandRS232("AT");
  //....
  binRS232(fstream, lsize);    //Datei binär an RS232 übergeben
}

gibt es an:

void binRS232(byte* fileStream, long lsize)
{
  WriteFile(hComPort, fileStream, (DWORD)lsize, &len, NULL);
...
}


Seltsamerweise funktionierte es plötzlich wieder nicht mehr. Ich habe 
seitdem das Problem, dass er die Datei zum lesen und versenden auf 
meiner Festplatte nicht mehr öffnen kann.

  pFile = fopen ( "c:\bild.jpg" , "rb" );
  if (pFile==NULL) {fputs ("Fehler beim Oeffnen der Datei!\n\n",stderr); exit (1);}


Hat jemand vielleicht einen Tip, woran das liegen könnte? Die Datei 
existiert jedenfalls an genau dieser Stelle mit genau diesem Namen und 
ist nicht schreibgeschützt (wobei das beim Lesen eh egal sein müsste). 
Danke!

Autor: Frank Gsm (frank_gsm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...ok, ich habs selbst herausgefunden. Ich hatte natürlich keinen 
doppelten Backslash im Dateipfad! Sorry für diese "dumme" Frage. Aber 
manchmal sieht man eben den Wald vor lauter Bäumen nicht.

Autor: Frank Gsm (frank_gsm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

So, nachdem ich jetzt wieder einige Tage vergeblich damit verbracht habe 
größere Dateien über das GSM-Modul zu senden, wende ich mich 
(hoffnungsvoll!!) an euch.

Ich kann momentan:
- eine kleine Bilddatei mit ca. 2 kB auf einen FTP-Server senden und 
diese darauf anschließend öffnen. freu

Probleme:
- Größere Dateien lassen sich nicht übertragen. Einmal funktionierte 
eine ca. 50 kB - Datei, mittlerweile nur noch bis ca. 12 kB. Ziel ist es 
jedoch beliebig große Dateien bis einige MB (evtl. sogar bis einige 100 
MB) zu übertragen. Das Modul/Programm hängt sich beim senden jedes Mal 
auf.
- Das GSM-Modul hängt sich dabei (bzw. anschließend) auf. Laut 
AT-Befehle sollte man als "Ende-Zeichen" "+++" senden. Funktioniert 
jedoch nicht, es reagiert einfach nicht bzw. schreibt "+++" zusätzlich 
in die Datei (ans Ende). Ich muss das GSM-Modul anschließend reseten.

Habt ihr Ideen zu meinem Code, was ich ändern könnte? Muss ich die Datei 
"gestückelt", also mit Schleife in kleineren Blöcken nacheinander 
übermitteln? Kann es daran liegen, dass das Array der Antwort von 
ReadFile() zu klein ist?

hier mal der Code der Übertragungsfunktion:

void binRS232(byte* fileStream, long lSize)
{
  char fresult[1024] = {0};  //Größe festlegen? 1024? mehr für lange Antworten?

  DWORD len = 0;
  WriteFile(hComPort, fileStream, (DWORD)lSize, &len, NULL);

  Sleep(2000);

  len = 0;
  ReadFile(hComPort, fresult, 1024, &len, NULL);
  printf("%s\n", fresult);
}


und die FTP-Funktion:

void gsmFTPupBin(byte * fstream, long lSize)
{  
  //...

  commandRS232("AT#SGACT=1,1,\"fonic\",\"gprs\"");
  commandRS232("AT#FTPOPEN= ... ");     
  Sleep(10000);    //langes warten, da Verbindungsaufbau teils sehr laange dauert

  commandRS232("AT#FTPTYPE=0");    //binary format
  commandRS232("AT#FTPPUT=\"bild2.jpg\"");

  Sleep(2000);

  binRS232(fstream, lSize);    //Datei binär an RS232 übergeben

  Sleep(1000);

  commandRS232("+++");    //Escape Sequence zum beenden der Verbindung

  printf("\nDatei erfolgreich auf FTP-Server uebertragen!\n\n");

  //commandRS232("AT#FTPCLOSE");  //FTP-Verbindung schließen
  //commandRS232("AT#SGACT=1,0");  //GPRS-Kontext deaktivieren
}


Danke!
Frank

Autor: Martin Thomas (mthomas) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vor einer ganzen Weile mit Telit-Modulen gearbeitet (Vorvorgänger des 
genannten). Seinerzeit hatten Anfangs die FTP-Kommandos im Grunde 
garnicht funktioniert, was aber durch Firmware-Updates stetig 
nachgebessert wurde. Da damals wenig Zeit auf Korrekturen zu warten, bin 
ich auf Dateiübertragung nach RFC 1867 ausgewichen. Egal, Schnee von 
gestern. Ist die Flusskontrolle für PC-Schnittstelle eingeschaltet. 
Zumindest mit den älteren Modellen war Hardware-Flusskontrolle (RTC/CTS) 
obligatorisch, sobald die Geräte in den Data-Mode gegangen sind. Im 
Zweifel im Programm explizit über SetCommState machen. Da das Gerät bei 
RoSo gekauft wurde: schon in deren Support-Forum (so es das noch gibt) 
gefragt? Anfragen direkt an DAI (so die den noch so heißen) wurden 
seinerzeit auch beantwortet.

Autor: Harald Naumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
- Das Support Forum hat inzwischen 5508 Mitglieder, 4519 Threads und ist 
unter http://www.roundsolutions.com/forum erreichbar. Die Registrierung 
ist formlos und kostenfrei. Es geht im Forum primär um drahtlose Module 
(GSM, UMTS, WIFI, Bluetooth
- Ich würde für die ersten Tests die Testsoftware RS Term nehmen. Das 
ist eine Art Terminalsoftware, welche per Mausklick die AT-Befehle 
sendet. Tippfehler sind damit ausgeschlossen. Download siehe:
http://www.roundsolutions.com/techdocs/index.php#tools
- Die Flusskontrolle ist bei größeren Dateien notwendig. Ohne gehen 
früher oder später Daten verloren. RS Term auf dem PC unterstützt die 
Flusskontrolle.
Gruß
Harald

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.