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.
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; }
>> 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
der fehler ist folgender: Executing: "C:\Programme\PICC\Ccsc.exe" "RS232Test_06_11_22.c" +FM +DF +LN +T -A +M +Z +Y=9 +EA >>> Warning 203 "C:\AAPIC\RS232 Modem\RS232Test_06_11_22.c" Line 40(1,1): Condition always TRUE >>> Warning 201 "C:\AAPIC\RS232 Modem\RS232Test_06_11_22.c" Line 50(1,1): Assignment inside relational expression *** Error 22 "C:\AAPIC\RS232 Modem\RS232Test_06_11_22.c" Line 50(24,25): Bad expression syntax 1 Errors, 2 Warnings. Halting build on first failure as requested. BUILD FAILED: Fri Jan 05 18:13:10 2007 Warnings.
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...
@ unbeschreiblicher Rahul (Gast) Er vergleicht Zeichen, aber hat die Bedeutung des Zeichens im Klartext verwendet. Deshalb #define PIPAPO c
>> 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"...
unbeschreiblicher Rahul (Gast) ist wirklich unbeschreiblich!!!! Danke ich werde mir das buch besorgen!!
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.