Phade Geschrieben 19. Mai 2005 Autor Geschrieben 19. Mai 2005 Zu den Flags und moeglichen Fehlerkonstanten solltest du einmal in die Manpage schauen (man 2 open). Ja, habe ich, dort wird erklärt wer was macht. Wie formuliere ich ... #define CDROM "/dev/cdrom" ... static int open_cdrom (void) { int fd = open (CDROM, O_RDONLY | O_NONBLOCK); if (fd == -1) { if (errno == ENOMEDIUM) printf ("Keine CD im Laufwerk!\n"); else perror ("Fehler bei open()"); exit (EXIT_FAILURE); } return fd; }[/PHP] so um, das es zu meinem Port passt??? Es geht mir besonders um diese Stelle: [PHP] ... if (errno == ENOMEDIUM) //Hier geht es mir besonders drum printf ("Keine CD im Laufwerk!\n"); else printf ("Fehler bei open()"); // Habe hier perror dur printf ersetzt exit (EXIT_FAILURE); ... Thanx, Zitieren
Maulwurf_der_Schlaue Geschrieben 19. Mai 2005 Geschrieben 19. Mai 2005 dazu solltest du zuerst schauen was (errno == ENOMEDIUM) noch alles in erno stehen kann da du am com-port arbeitest wird wohl die auswertung eNoMedium nicht viel bringen... vielleicht so was wie eNoInput oder so... da müsstest du nachschauen... ... #define COM1 "/dev/ttyS0" ... static int status_com1 (void) { int fd = open (COM1, <deine Parameter>); if (fd == -1) { if (errno == <wenn kein input>) printf ("Kein Gerät angeschlossen...\n"); else perror ("Fehler bei open()"); return (-1); } return fd; } int main(int argc, char* argv[]) { int com_status = status_com1(); if (com_status > 0) { // was bei angeschlossem bzw. lesbaren Port passieren soll. } return 0; } [/PHP] Zitieren
Phade Geschrieben 19. Mai 2005 Autor Geschrieben 19. Mai 2005 Also ich habe jetzt mal folgendes zusammengetippt....: /* port.cpp*/ #include <stdio.h> // Standard input/output definitions #include <string.h> // String function definitions #include <unistd.h> // UNIX standard functiondefinations #include <fcntl.h> // File controll definations #include <errno.h> // Error number definations #include <termios.h> // POSIX terminal controll definations #include <iostream.h> /* * 'open_port()' - Open serial port 1. * * Returns the file descriptor on success or -1 on error. */ #define port "/dev/ttyS0" static int open_port(void) { int fd = open (port, O_RDWR | O_NOCTTY | O_NDELAY); // File discriptor for the Port if (fd == -1) { if (errno == ENOTTY) printf("Kein Gerät angeschlossen !\n"); else printf("open_port: Unable to open /dev/ttyS0 - \n"); return (-1); } return fd; } int main(int argc, char* argv[]) { int fd = open_port(); if (fd > 0) { printf("Com1: %d\n", fd); } else { printf("An Com1 liegen keine Daten an!"); } return fd; } [/PHP] Er gibt mir nur Com1 aus, sonst nüschts....ich glaube ich habe was vergessen...... Wo habe ich denn jetzt noch was falsch bzw. könnte ich optimieren ??? Zitieren
Phade Geschrieben 19. Mai 2005 Autor Geschrieben 19. Mai 2005 Ich habe die main-Funktion jetzt so gecodet: int main(int argc, char* argv[]) { int fd = open_port(); if (fd > 0) { printf("Com1: %d\n",open_port); } else { printf("An Com1 liegen keine Daten an!\n"); } return 0; }[/PHP] und bekomme in der Konsole fogendes ausgegeben: [code]isesrv101:/home/Phade/C-Programme # ./port Com1: 134514316 isesrv101:/home/Phade/C-Programme #[/code] Ich vermute mal, das das nicht vom Thermostaten kommt, der müsste doch eigentlich viel mehr ausgeben..... Oder irre ich mich da? Zitieren
Klotzkopp Geschrieben 19. Mai 2005 Geschrieben 19. Mai 2005 Der Filedeskriptor stellt nur ein Handle dar, mit dem du auf die Schnittstelle zugreifen kannst. Er beinhaltet selbst noch keine ausgelesenen Daten. Daher ergibt es auch keinen Sinn, den "Wert" des Deskriptors auszugeben. Entscheidend ist nur, ob er ungleich Null (nicht größer als Null) ist, denn nur dann hat das Öffnen der Schnittstelle funktioniert. Zitieren
Phade Geschrieben 19. Mai 2005 Autor Geschrieben 19. Mai 2005 Der Filedeskriptor stellt nur ein Handle dar, mit dem du auf die Schnittstelle zugreifen kannst. Er beinhaltet selbst noch keine ausgelesenen Daten. Daher ergibt es auch keinen Sinn, den "Wert" des Deskriptors auszugeben. Entscheidend ist nur, ob er ungleich Null (nicht größer als Null) ist, denn nur dann hat das Öffnen der Schnittstelle funktioniert. Also könne ich auch als printf sagen Com1 geöffnet, oder nicht??? Dann muss ich also jetzt noch eine Funktion schreiben, die Port ausliest?!!... Zitieren
Delryn Geschrieben 19. Mai 2005 Geschrieben 19. Mai 2005 Ich würd erstmal einen Gang zurückfahren. Dein Betrieb sagt du hast soviel Zeit bis du fertig bist. Dann würde ich sagen, fang klein an, lerne jetzt von grundauf C++, am besten durch eines der genannten Tutorials. Vielleicht entdeckst du ja scho nach einer Woche Stellen wo du denkst "Mensch, deshalb ging das bei meinem Code nie!" Zitieren
Aquano Geschrieben 19. Mai 2005 Geschrieben 19. Mai 2005 Also könne ich auch als printf sagen Com1 geöffnet, oder nicht??? Dann muss ich also jetzt noch eine Funktion schreiben, die Port ausliest?!!... Ja könntest Du. Ja musst Du. Solltest Du die Aufgabe jetzt mit Hilfe des Forums lösen, so gehen deinevorgesetzten aus, dass Du das jetzt alles alleine kannst. Daher könnten deine nächsten Termine etwas eng werden. Man sieht, dass Du nur eine Idee davon hast, was Du machst. Zitieren
Phade Geschrieben 20. Mai 2005 Autor Geschrieben 20. Mai 2005 Solltest Du die Aufgabe jetzt mit Hilfe des Forums lösen, so gehen deinevorgesetzten aus, dass Du das jetzt alles alleine kannst. Daher könnten deine nächsten Termine etwas eng werden. Man sieht, dass Du nur eine Idee davon hast, was Du machst. Hmm, da muss ich dir recht geben. Zum Glück, schreiben wir hier kaum Programme selber, diese Aufgabe war Quasi eine Abschnittsaufgabe, als nächstes komm eine Aufgabe über Netzwerke oder so etwas (verstehst du?). Aber nichts desto trotz hast du recht, nachher kommt noch einer und sagt, da ich das ja kann müsste ich da mal eben was machen und muss dann bis 12 fertig sein.... Ich werde mal meine Bücher die ich hier habe zu Rate ziehen und natürlich die Links von euch. Falls sich noch Fragen ergebn, werde ich sie dann hier stellen, denn unbedingt ein neues Thema anzufangen wäre ja quatsch.... thanx, Zitieren
Phade Geschrieben 20. Mai 2005 Autor Geschrieben 20. Mai 2005 Hi nochmal, wie ihr sicher schon richtig vermutet, stehe ich gerade mal wieder auf dem Schlauch. Und zwar habe ich in meinen Unterlagen gelesen, das man entweder fprintf benutzen kann, oder fputs. Wobei ich dann aber bei fputs noch zusätzlich fp als Zeiger benutzen muss und dann noch fgets.... Jetzt weiß ich nicht so recht, welche von den beiden Optionen nehmen soll. Ist eventuell eine dumme Bildunglücke, aber leider habe ich diese. (Zudem fehlt mir das Programmierer denken; ich sehen zwar den Quelltext, verstehe auch das meiste, nur fallen mir zum Beispiel Optimiermöglichkeiten nicht auf, oder halt jetzt das mit dem fprintf oder fputs....) Trotzdem Thanx, Zitieren
Phade Geschrieben 31. Mai 2005 Autor Geschrieben 31. Mai 2005 Hallöchen zum dritten, bin nun so weit: /***************************************************************** ****************************************************************** **This C-Code is Freeware. You can use it, or canche something.*** **When you have some upgrades, send me an Email.****************** **stefan.aust1@gmx.net . And now, have a lot of fun !************* ****************************************************************** **The programm was tested on a Linuxsystem************************ ****************************************************************** *****************************************************************/ #include <stdio.h> /* Standard input/output definitions */ #include <string.h> /* String function definitions */ #include <unistd.h> /* UNIX standard function definitions */ #include <fcntl.h> /* File control definitions */ #include <errno.h> /* Error number definitions */ #include <termios.h> /* POSIX terminal control definitions */ /* Definition of Port */ #define port "/dev/ttyS0" /* Open COM1 */ static int open_port(void) { char fd = open (port, O_RDWR | O_NOCTTY | O_NDELAY); /* fd is the File descriptor for the Port */ if (fd == -1) { if (errno == ENOTTY) printf("NO HARDWARE CONNECTED !\n"); else printf("open_port: Unable to open /dev/ttyS0 - \n"); return (-1); } return fd; } /* Status Messages */ int main(int argc, char * argv[]) { char fd = open_port(); if (fd > 0) { printf("Com1 open! \n", &fd); } else { printf("Com1 not open!!\n"); } return 0; } /* Print Data from COM1 */ static void read_port (char fd) { /**Declaration for the read proces**/ /**Hier hänge ich jetzt**/ } [/PHP] Aber ich muss sagen das ich nicht weiter weiß und komme. Ich habe jetzt den halben Tag im Netz gesucht und alle meine Bücher gewälzt aber nüschts gefunden..... Das heißt, ich habe schon etwas gefunden, nur verwirrt mich das etwas, in diesem Beispiel wird [i]struct[/i] verwendet. Wäre das "besser"??? Da hänge ich halt jetzt.... thanx, Zitieren
Guybrush Threepwood Geschrieben 31. Mai 2005 Geschrieben 31. Mai 2005 Was ist denn jetzt das Problem mit dem Programm? Warum ist fd bei dir vom Typ char? open gibt ein int zurück. Zitieren
Maulwurf_der_Schlaue Geschrieben 31. Mai 2005 Geschrieben 31. Mai 2005 bin jetzt auch verwirrt wg: static int open_port(void) << hier int als rückgabewert char fd = .... << hier char welches zurückgegeben wird ... return fd; was is denn nun sache Zitieren
Phade Geschrieben 31. Mai 2005 Autor Geschrieben 31. Mai 2005 Siehst du, da geht es ja schon los, dann kann ich ja lange suchen... Mein Problem ist die letzte Funktion, die, die den COM1 auslesen soll. Ich weiß nicht, wie ich das hin bekomme. Ich habe ein Beispiel gefunden, wo es um CDs auslesen geht, gefunden und die benutzen halt struct. Und ich weiß nicht, ob ich das jetzt nicht auch benutzen kann oder nicht..... Zitieren
Maulwurf_der_Schlaue Geschrieben 31. Mai 2005 Geschrieben 31. Mai 2005 wo verwendest du in deinem obigen Quellcode Struct?? oder steh ich aufm schlauch? <edit> verwenden musst du es nicht void f() { static int x = 47; } says that x is not visible outside of f(). googlesuche nach "static int" </edit> <edit2> du musst deine Funktionen nicht unbedingt unzugänglich für außerhalb deines Programms machen. </edit2> Zitieren
Klotzkopp Geschrieben 31. Mai 2005 Geschrieben 31. Mai 2005 Mein Problem ist die letzte Funktion, die, die den COM1 auslesen soll. Ich weiß nicht, wie ich das hin bekomme.Die passende Funktion heißt read. Ich glaube aber nicht, dass dir die weiterhilft. Im Beispielcode wurden wohl nicht ohne Grund ioctl benutzt. Ich habe ein Beispiel gefunden, wo es um CDs auslesen geht, gefunden und die benutzen halt struct. Und ich weiß nicht, ob ich das jetzt nicht auch benutzen kann oder nicht.....Das Problem ist, dass du nicht weißt, was Schlüsselwörter wie struct und static überhaupt bedeuten. Du kannst dieses Problem nicht lösen, ohne vorher den richtigen Umgang mit den Werkzeugen zu lernen. Code zum Auslesen von CDs bringt dir gar nichts, das hat mit deinem Problem nichts zu tun. Such nicht nach Beispielcode. Du bist nicht in der Lage, für dich hilfreichen Code als solchen zu erkennen. Halte dich an die Dokumentation von open, read und ioctl. Und arbeite ein paar Grundlagentutorials durch. Sonst bist du in einem Jahr noch nicht fertig. Das, was du bisher geschafft hast, sollte selbst bei einem Anfänger eigentlich nicht länger als eine Stunde gedauert haben. Zitieren
Phade Geschrieben 31. Mai 2005 Autor Geschrieben 31. Mai 2005 Nein ich benutze es nicht, sondern in dem Beispiel welches ich gefunden haben wird es benutzt. Wie meinst du das mit dem nicht unbedingt außerhalb des Programms machen??? Kann ich das in die main-Funktion schreiben??? Ich dachte das das zur Übersicht besser wäre???!!!??? Zitieren
Maulwurf_der_Schlaue Geschrieben 31. Mai 2005 Geschrieben 31. Mai 2005 bitte bitte bitte, mach ein paar tutorials zu den grundlagen von c/c++ und wenn du die gemacht hasst dann versuch erst dein hier beschriebenes problem zu lösen... hier nochmal eins: http://tutorial.schornboeck.net/inhalt.htm <edit> nicht suchen ob da dein problem irgendwie aufgegriffen wird. mach es komplett durch und mach dir notizen zum nachschlagen... </edit> Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.