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


von Frank G. (frank_gsm)


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:
1
  FILE * pFile;
2
  long lSize;
3
  char * buffer;
4
  size_t result;
5
6
  initRS232();
7
8
  pFile = fopen ( "c:/bild.jpg" , "rb" );
9
  if (pFile==NULL) {fputs ("File error",stderr); exit (1);}
10
11
  // obtain file size:
12
  fseek (pFile , 0 , SEEK_END);
13
  lSize = ftell (pFile);
14
  rewind (pFile);
15
16
  // allocate memory to contain the whole file:
17
  buffer = (char*) malloc (sizeof(char)*lSize);
18
  if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);}
19
20
  // copy the file into the buffer:
21
  result = fread (buffer,1,lSize,pFile);
22
  if (result != lSize) {fputs ("Reading error",stderr); exit (3);}
23
24
  /* the whole file is now loaded in the memory buffer. */
25
 
26
  char bufferAr[]={0};
27
28
  strcpy(bufferAr, buffer);
29
  gsmFTPupBin(bufferAr);
30
31
    closeRS232();
32
33
  // terminate
34
  fclose (pFile);
35
  free (buffer);

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

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

LG Frank

von Sven P. (Gast)


Lesenswert?

Frank Gsm schrieb:
1
> 
2
>   char bufferAr[]={0};
3
> 
4
>   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...

von Frank G. (frank_gsm)


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:

1
  gsmFTPupBin(buffer, lSize);

gibt es an:

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

gibt es an:

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


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.

1
  pFile = fopen ( "c:\bild.jpg" , "rb" );
2
  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!

von Frank G. (frank_gsm)


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.

von Frank G. (frank_gsm)


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:
1
void binRS232(byte* fileStream, long lSize)
2
{
3
  char fresult[1024] = {0};  //Größe festlegen? 1024? mehr für lange Antworten?
4
5
  DWORD len = 0;
6
  WriteFile(hComPort, fileStream, (DWORD)lSize, &len, NULL);
7
8
  Sleep(2000);
9
10
  len = 0;
11
  ReadFile(hComPort, fresult, 1024, &len, NULL);
12
  printf("%s\n", fresult);
13
}

und die FTP-Funktion:
1
void gsmFTPupBin(byte * fstream, long lSize)
2
{  
3
  //...
4
5
  commandRS232("AT#SGACT=1,1,\"fonic\",\"gprs\"");
6
  commandRS232("AT#FTPOPEN= ... ");     
7
  Sleep(10000);    //langes warten, da Verbindungsaufbau teils sehr laange dauert
8
9
  commandRS232("AT#FTPTYPE=0");    //binary format
10
  commandRS232("AT#FTPPUT=\"bild2.jpg\"");
11
12
  Sleep(2000);
13
14
  binRS232(fstream, lSize);    //Datei binär an RS232 übergeben
15
16
  Sleep(1000);
17
18
  commandRS232("+++");    //Escape Sequence zum beenden der Verbindung
19
20
  printf("\nDatei erfolgreich auf FTP-Server uebertragen!\n\n");
21
22
  //commandRS232("AT#FTPCLOSE");  //FTP-Verbindung schließen
23
  //commandRS232("AT#SGACT=1,0");  //GPRS-Kontext deaktivieren
24
}

Danke!
Frank

von Martin T. (mthomas) (Moderator) Benutzerseite


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.

von Harald Naumann (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.