- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 10 von 46

Thema: Internetradio

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Experte Avatar von ePyx
    Registriert seit
    14.05.2008
    Ort
    Falkensee
    Beiträge
    700
    Der Code sieht sehr nach zusammen kopiert und entsprechend erweitert aus. Was schon recht doof ist, der bei termios der aktuelle Zustand des Terminals nicht gespeichert, sondern einfach überschrieben wird.

    Das TTY-Device kann man als O_NONBLOCK deklarieren. Um zu erkennen ob Bytes im Puffer der seriellen Schnittstelle sind, kann man Signale benutzen. Das einfachste wäre das SIGIO-Signal, welches aufgerufen wird, sobald Daten eintreffen. Eine andere Möglichkeit um zu Prüfen ob Daten verfügbar sind ist :

    Code:
    int bytes_avaiable;ioctl(serial_file_descriptor, FIONREAD, &bytes_available);
    Wobei das kein komplettes Beispiel ist, daher sollte man sich die manpages ansehen.

    PS : Das Ausführen der Befehle mit System kann im Übrigen hunds-gefährlich werden, da sollte man eher einen bestehenden Prozess forken.
    Grüße,
    Daniel

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    24.06.2007
    Alter
    45
    Beiträge
    61
    Danke für deine Info. Dein PS verstehe ich leider nicht, da ich bin ich wohl zu wenig bewandert. Das mit der Deklaration von O_NONBLOCK habe ich zusätzlich vom MODEMDEVICE auch schon probiert. Da kommt aber dann erstmal immer eine 0 und keine Daten mehr an. Ich muss mir das wohl oder übel noch näher ansehen.
    Wenns brennt, dann brennts....

  3. #3
    Erfahrener Benutzer Roboter Experte Avatar von ePyx
    Registriert seit
    14.05.2008
    Ort
    Falkensee
    Beiträge
    700
    Mit meinem PS meinte ich, dass es sehr gefährlich sein kann Befehle per System auszuführen. Beispielsweise durch Pufferüberläufe etc. . Daher gibt es die Möglichkeit Prozesse mit fork zu starten und ihnen Parameter zu übergeben bzw. sie während der Laufzeit zu steuern.
    Grüße,
    Daniel

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    24.06.2007
    Alter
    45
    Beiträge
    61
    Hallo Daniel,

    ich hab den Code jetzt mal aufgeräumt und alles rausgeworfen was ich im Moment nicht brauche.

    Code:
    // Compile GCC -o serial_wiring -l rt serial_wiring.c -lwiringPi
    
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <termios.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <time.h>
    //WiringPi include für SEN/STA Erkennung
    #include <wiringPi.h>
    //Konfig RASPI USART
    #define BAUDRATE B9600  // 9600 Baud definieren für 8E1 I-Bus
    char MODEMDEVICE[]= "/dev/ttyAMA0";    // Schnittstelle wählen
    int getit; //Nachrichtenblock angekommen
    int    fd;                // File descriptor
    struct    termios newtio={};
    
    unsigned char receive()                        //Zeichen empfangen
    {
        
        int res;
        unsigned char buffer;
    
        res = read(fd, &buffer, 1);
    
        getit = fd;
        return buffer;
    }
    
    int init()                        //Schnittstelle parametrieren und öffnen für I-Bus 9600 8E1
    {
        //O_RDONLY, O_WRONLY or O_RDWR -
        //O_NDELAY (geht weiter, wenn keine Daten da sind und gibt "-1" zurueck)
        // man 2 open fuer mehr Infos - see "man 2 open" for more info
        // O_NOCTTY No ControllTeleType 
    
        fd = open(MODEMDEVICE, O_RDONLY | O_NOCTTY );
        if (fd < 0){
            printf("Fehler beim oeffnen von %s\n", MODEMDEVICE);
            exit(-1);
        }
        memset(&newtio, 0, sizeof(newtio));
        newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD | PARENB;    //setzt Einstellungen vom UART 
        newtio.c_iflag = IGNPAR;
        newtio.c_oflag = 0;
        newtio.c_lflag = 0;         /* set input mode (non-canonical, no echo, ...) */
        newtio.c_cc[VTIME] = 0;     /* inter-character timer unused */
        newtio.c_cc[VMIN] = 1;    /* blocking read until 1 chars received old 1 */
        newtio.c_cc[VSTART]   = 0;     /* Ctrl-q startet Datenübertragung */
        newtio.c_cc[VSTOP]    = 0;     /* Ctrl-s stoppt Datenübertragung*/
        
        tcflush(fd, TCIFLUSH);
        tcsetattr(fd, TCSANOW, &newtio);
        return fd;
    }
    
    int main(int argc, char** argv)        //Programmstart
    {
      //new
      int pin = 7;  //GPIO 4
      int value = 0; // Deklaration Eingangswert GPIO4
      getit = 0;
      printf ("Raspberry Test UART+wiringPi\n") ;
    
      if (wiringPiSetup () == -1)
        exit (1) ;
      //Fehlerrückgabe wiringPi
      
      pinMode(pin,INPUT); //wiringPi GPIO4 Pin7 deklarieren
      
    
        char c;
         init();                    //Schnittstelle UART parametrieren und öffnen
        //sleep(5);                 //nix tun
         
        while (1)
            {
        
        value = digitalRead (pin);
         printf("Status SEN/STA %d \n", value );
        
        //printf("SEN/STA: %d\n", value); // BUSRUHE?
        
        c=receive();
        //if((value==1)){
            printf("MESSAGE %X\n", c); // c in Hex ausgeben    %d = Dezimal %H = Hex
            
      
            } 
        
        close (fd);
        return 0;
    }
    Welche manpages meinst du? In der "open" hab ich nichts entdeckt. Wie vielleicht schon erwähnt ich bin leider kein Profi deshalb wohl auch die dummen Fragen.

    Wie geht das genau mit SIGIO bzw in welchem man finde ich das?

    Grüße

    Rainer
    Wenns brennt, dann brennts....

  5. #5
    Erfahrener Benutzer Roboter Experte Avatar von ePyx
    Registriert seit
    14.05.2008
    Ort
    Falkensee
    Beiträge
    700
    Gibt keine dummen Fragen. Nur zusammen kopieren, sich danach wundern das nichts geht und dann fragen ist der falsche Weg. Bin auch kein Profi und habe mir das auch selbst beibringen müssen, da ich es benutzen wollte.

    Bei SIGIO handelt es sich um ein Signal, welches an den Prozess (also dein Programm) gesendet wird, sobald auf einem Filedescriptor ein I/O-Event stattfindet. Ähnlich funktioniert es bspw. wenn man CTRL+C sendet, dass wird
    auch als Signal an den Prozess geschickt. Damit ist es dann möglich trotz des Abbruchs das Programm sauber zu beenden. Signale haben Nichts mit open oder anderen Syscalls zu tun, daher wirst du dort auch nichts finden.

    Beispiel : http://www.tldp.org/HOWTO/Serial-Pro...OWTO/x115.html , Beispiel 3.3 Asynchronous Input

    Ein Beispiel auf Deutsch findet sich beispielsweise hier : http://www.cs.hs-rm.de/~linn/vpdv01/...u/addendum.htm

    Als Tipp kann ich nur noch geben, dass man die manpages auch auf deutsch installieren kann.
    Grüße,
    Daniel

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    24.06.2007
    Alter
    45
    Beiträge
    61
    Naja ich dachte bei Fragen zu dem hier geposteten Code auf dessen Basis ich aufsetzen wollte ist keine so schlechte Idee, da ich bis auf die serielle Com eigentlich dachte alles verstanden zu haben. Dass das gleich so ans eingemachte geht, wenn man Anfang und Ende bestimmen will, war mir dann doch nicht Bewusst. Aber hey werde das schon irgendwie hinbekommen.

    Immerhin funktioniert schon mal die Hardware und die Umsetzung auf den K-Line Bus des Autos. Da werde ich die Komm auch noch hinkriegen...

    Und auf den Lerneffekt freu ich mich schon. Will ja nicht das jemand für mich mein Programm schreibt. Naja senden wird dann hoffentlich einfacher .

    Danke für die Links und viele Grüße

    Rainer
    Wenns brennt, dann brennts....

  7. #7
    Erfahrener Benutzer Roboter Experte Avatar von ePyx
    Registriert seit
    14.05.2008
    Ort
    Falkensee
    Beiträge
    700
    Zitat Zitat von gesamtplan Beitrag anzeigen
    Und auf den Lerneffekt freu ich mich schon. Will ja nicht das jemand für mich mein Programm schreibt. Naja senden wird dann hoffentlich einfacher .
    Wollte ich damit auch nicht sagen, nur für klare Verhältnisse sorgen. Das Thema serielle Schnittstelle ist unter Linux halt um einiges gewichtiger, da sich dort früher halt alles abgespielt hat und es auch nichts anderes gab. Senden ist wirklich um einiges einfacher, von daher brauchst dir da nicht allzu viele Gedanken machen. Aber auch beim empfangen gibt es nicht so viel zu beachten, mit dem Gröbsten habe ich dich ja nun beworfen.

    Im Übrigen ist die Netzwerkprogrammierung noch um einiges trickreicher, da man sehr oft fragmentierte Datenströme hat und das Empfangen in der Regel nicht so schön einfach geht. Besonders wenn Daten möglichst synchron sein sollen.
    Grüße,
    Daniel

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests