Hallo!
Ich bin für eine Diplomarbeit dabei ein Modem zur Datenübertragung
mittels PIC zu "bedienen". leider bin ich kein großer Programmierer in C
und das bereitet mir einige Schwierigkeiten.
Ich muss die Rückmeldungen des Modems in der Software verarbeiten.
Leider kann ich die Textmeldungen des Modems nicht einlesen. Genügt der
befehl getch()? muss ich vorher die Texte alle deklarieren wenn ja
wie??
Ich hoffe mir kann jemand einen Tipp geben
Gruß aus Wien
Pauli
Hallo Pauli,
zuerst solltest du mal angeben:
* Controller
* Entwicklungsumgebung
* Compiler
getch() liest ein Zeichen von der Seriellen Schnittstelle ein, wenn
diese konfiguriert ist. Wie machst du das? Schau dir dazu die App-Notes
von Microchip an.
>> muss ich vorher die Texte alle deklarieren
Was meinst du damit?
> Ich hoffe mir kann jemand einen Tipp geben
Tut mir leid, dass ich dir nur Fragen stellen konnte, aber beim nächsten
mal wird's besser.
Viele Grüße,
Bernhard
Hallo Bernhard,
vielen Dank für die antwort!
der Controller ist ein PIC16F877A
MPLAP
CCS-Compiler
RS 232 ist programmiert und funkt. ohne fehler.
Der compiler meldet einige Fehler wenn ich die Rückmeldung vom Modem z.B
NO CARRIER über getch() abrufe.
Deklarieren:
Ich frage mich, ob ich jede mögliche Rückmeldung des Modems im Compiler
bekannt geben muss bevor ich sie im Programm verwenden kann.
Grüße aus Wien
>getch()
Vielleicht solltest du im Hanbdbuch deines Compilers mal nachgucken, wie
"getch()" funktioniert.
Weiterhin solltest du dir angucken, was das Modem so alles von sich gibt
(Es gibt Rückmeldungen als Text oder als Zahl zurück).
>Der compiler meldet einige Fehler wenn ich die Rückmeldung vom Modem z.B>NO CARRIER über getch() abrufe.
Da wäre es schön, mal einen Blick in deinen Quellcode werfen zu können.
>> Der compiler meldet einige Fehler wenn ich die Rückmeldung vom Modem z.B
So böser unbeschreibliche Rahul auch klingt, ohne Quelltext und die
Fehlermeldungen geht es wirklich nicht weiter.
>> if (answer="NO CARRIER");
Ich gehe davon aus, dass damit ein Zeichen gemeint ist, das den Fehler
beschreibt. Dann muss vor main() dein #define NO CARRIER C
Das goto und das waehlen können (sollten) übregens weg, dafür hast du ja
eine Endlosschleife
das goto und waehlen ist dann für später, das programm ist noch länger
weil ich alle rückmeldungen des modems einbeziehen muss. und das sind
einige.
NO CARRIER ist eine Textmeldung die über die RS232 vom Modem kommt wenns
keine Verbindung bekommt. die schaut auch im HyperTerminal genauso aus.
>NO CARRIER muss dann in NO_CARRIER geändert werden.
Guter Witz! (Kann aber stimmen...)
Der Fehler ist, dass du einen char (einzelnes Zeichen) mit einem String
(mehr als ein Zeichen, i.d.R. mit "\0" abgeschlossen) vergleichst.
Geht nicht!
Vielleicht solltest du dir mal "Zeichenketten und Vektoren" in K&R
angucken...
Für solche Sachen (wenn man schon solche Geschichten wie "printf"
benutzt), sollte man auch das Gegenstück dazu kennen. Es fängt mit eine
"s" an und hört mit einem "f" auf.
Der Fehler stammt davon, dass du in der if-Abfrage nicht den
Vergleichsoperator ==, sondern die Zuweisung = verwendest. Die anderen
Änderungen müssen aber trotzdem sein.
>Der Fehler stammt davon, dass du in der if-Abfrage nicht den>Vergleichsoperator ==, sondern die Zuweisung = verwendest. Die anderen>Änderungen müssen aber trotzdem sein.
Ich weiß ja nicht, aus welcher Programmierecke du kommst, aber in C kann
man Strings nicht durch "==" vergleichen. Dafür gibt es in der
"strings.h" extra Funktionen...
>> Das Programm schaut jetz so aus und funkt auch nicht
#define NO_CARRIER C
void main()
{
char answer=0;
while (1)
{
//waehlen:
printf("+++");
delay_ms(1000);
printf("ATD12345678");//Nummer wählen
answer = getch();
if (answer=="NO_CARRIER");
//goto waehlen;
}
>>wie is das mit den sprintf??>>kann ich dafür auch die anweisung puts bzw gets verwenden?
>sprintf??
Schade, es wäre "scanf"...
print hat grundsätzlich etwas mit ausgeben zu tun.
>if (answer=="NO_CARRIER");
ist definitv ein Vergleich eines char mit einem char* == string, was C
nicht einfach machen will. Sowas geht nicht mal in BASIC.
>Dann muss vor main() dein #define NO CARRIER C
"NO CARRIER" ist eine Reihe von char, die vom Modem an den PIC gesendet
werden.
Der PIC muß also irgendwie mehrere Zeichen verarbeiten können.
Dazu braucht er einen String, der aus mehreren char besteht.
Zum Vergleichen zweier Strings gibt es eine Funktion, deren Namen mir
nicht geläufig ist, da ich sowas im µC zufuß programmiere.
>>wie is das mit den sprintf??>>kann ich dafür auch die anweisung puts bzw gets verwenden?
Besorg dir ein C-Grundlagenbuch!
"Die Programmiersprache C" von Brian Kernighan und Dennis Ritchie ist
äusserst empfehlenswert. Die beiden haben C "erschaffen"...
moin moin,
der c-Vergleich ist das Eine, die Arbeitsweise eines Modes das Andere.
ATDxxx muß mit CR abgeschlossen werden, sonst macht das Modem gar
nichts.
Ausserdem gibt es je nach Modem verschiedene Rückmeldungen, diese deuten
alle auf einen Fehler hin. Nur die Rückmeldung Connect... zeigt den
Begin einer Verbindung an. Besser ist das Modem auf numerisch zu
schalten, dann bekommt man Zahlen(+CR) zurück.
Einfach mal per Terminal Wählversuche mit dem Modem machen und
verschiedene Fehler simulieren.
printf("+++");
(damit wird das Modem Offline geschaltet...und was soll dann kommen?
Sinnig wäre ein ATH(cr) zum Auflegen, dann aber auch auf OK(cr) warten.
Wenn da nicht vorher und nachher ca 1,5sek gewartet wird passiert gar
nichts.)
delay_ms(1000);
(zu kurz)
printf("ATD12345678");//Nummer wählen
(abschließendes CR fehlt, wie soll das Modem wissen, wann die Wahlfolge
zu ende ist?)
Pieter