Datei auf FTP per GSM-Modul GC864 Telit, C++

OP #1316917
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
Gast
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...
OP
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!
OP
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
Moderator Persönliche Seite
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.
Gast
- 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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.