Hallo Forengemeinde,
versuche eine angekommene SMS in C unter Linux von einem Surfstick
"huawei E160" auszulesen. Gebe also den Befehl zum Auslesen
"AT+CMGR=0\r\n" ein und erwarte die Antwort vom Surfstick, um diese dann
mit strtok() zu zerlegen und auszuwerten. Problem ist nur, dass alle
anderen Kommandos, wie z.B. Netzabfrage "AT+COPS?\n" oder
Modemmodellabfrage "AT+CGMM\n" Strings zurückgeben. Nur die SMS-Abfrage
scheitert.
1
intsmsabfrag(){/////////////// SMS ABFRAGEN
2
3
intbytes=0;
4
inth;//Löschzähler für Puffer2
5
charpuffer2[200];//Puffer zum Auslesen von Schnittstelle
6
intfd_ser;//Serielle Schnittstelle
7
intk=1;//Zählervariable initialisieren
8
char*ptr;//Temporärer String
9
10
11
fd_ser=open_port();//Schnittstelle öffnen
12
13
set_fgcolor(3);
14
log_meld("Frage SMS ab...\n");
15
16
write(fd_ser,"AT+CMGR=0\r\n",11);
17
18
//write(fd_ser, "AT+CPBR=1\r\n",12);
19
//write(fd_ser, "AT+COPS?\r\n",11);
20
21
smsinhalt=0;// Global definierte Variable für den Inhalt der SMS
printf("Detektion: %d. string--> %s \n",k++,ptr);//Ausgabe von Stringnummer und String
40
41
ptr=strtok(NULL,"\n,");// Zeilenumruch maskieren
42
}
43
44
45
//////set_fgcolor(4);
46
//////set_cursor(0,15);
47
//////printf ("%s", smsinhalt);
48
//////set_fgcolor(2);
49
log_meld("SMS abgefragt.\n");
50
51
}
Programmoutput:
�� Detektion: 1. string--> AT+CMGR=0
Wenn ich
1
write(fd_ser,"AT+CMGR=0\r\n",11);
durch
1
write(fd_ser,"AT+COPS?\r\n",11);
ersetze, ist der Output richtig:
Detektion: 1. string--> AT+COPS?
Detektion: 2. string--> +COPS: 0
Detektion: 3. string--> 0
Detektion: 4. string--> "o2 - de"
Detektion: 5. string--> 0
Detektion: 6. string-->
Detektion: 7. string--> OK
Wenn ich allerdings parallel minicom öffne, um dem Datenstrom zu
beobachten, funktioniert das auslesen mit:
> Wenn ich>> write(fd_ser, "AT+CMGR=0\r\n",11);>> durch>> write(fd_ser, "AT+COPS?\r\n",11);>> ersetze, ist der Output richtig:
Die Konstante 11 ist hier merkwürdig. Ich nehme an, daß das die Anzahl
der zu sendenden Zeichen ist; das zweite Beispiel aber verwendet einen
nur 10 Zeichen langen String, so daß als 11. Zeichen die terminierende
\0 gesendet wird.
Das wird nicht des Problemes Ursache sein, aber es kann Nebeneffekte
hervorrufen.
Du solltest überprüfen, ob für Deinen Stream nicht etwa eine
automatische Zeilenumbrucherweiterung aktiv ist, die aus \n automatisch
\r\n erzeugt. Oder beim Empfang das Gegenteil davon vornimmt.
Ansonsten: Sieh Dir halt die Sourcen von Minicom an, wie da die
Schnittstelle initialisiert und behandelt wird.
Wenn ich minicom mit VT102 - Emulation parallel laufen lasse,
funktioniert das Auslesen. Wenn ich allerdings ANSI-Emulation aktiviere,
habe ich den selben Effekt, wie ohne minicom (funktioniert nicht).
Wo finde ich die minicom source?
MfG
chris
Dadurch werden die o.g. Bits gelöscht und der Rest bleibt gleich. Um
alle Flags wie Echo, line buffer usw auf einmal zu deaktivieren kann man
auch cfmakeraw(options) aufrufen (Siehe
http://linux.about.com/library/cmd/blcmdl3_termios.htm).
MfG Mark
Definitiv ist der Puffer zu klein! Du hast einen Puffer für 200 Zeichen
und in read_port() werden über read maximal 255 Zeichen eingelesen!
Das ist aber nicht das Problem. Das Problem ist dein Verständnis wie die
Kommunikation arbeitet.
Es ist quasi normal mehrere Leseversuche hintereinander zu machen, bis
"kein weiteres Zeichen gelesen" (bytes = 0) zurückkommt. Bei TCP
Anforderungen ist das ähnlich.