Zum Inhalt springen

Problem bei einem COM1 Programm


Phade

Empfohlene Beiträge

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,

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • Antworten 67
  • Erstellt
  • Letzte Antwort

Top-Benutzer in diesem Thema

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]

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 ???

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?!!...

Link zu diesem Kommentar
Auf anderen Seiten teilen

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!" :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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,

Link zu diesem Kommentar
Auf anderen Seiten teilen

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,

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Wochen später...

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,

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.....

Link zu diesem Kommentar
Auf anderen Seiten teilen

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>

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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???!!!???

Link zu diesem Kommentar
Auf anderen Seiten teilen

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>

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...