Code:
	 GCC -o empfangen_gpio_wiring -l rt empfangen_gpio_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>
#include <stdio.h>
//Konfig RASPI USART
#define BAUDRATE B9600  // 9600 Baud definieren für 8E1 I-Bus
char MODEMDEVICE[]= "/dev/ttyAMA0";    // Schnittstelle
int getit; //Nachrichtenblock angekommen
/*
Sx          x=0 aktuellen Sender neu abspielen Nach Stop oder zum neu puffern, x>49 Sender x-48 abspielen
Bx          x=0 abspielen stoppen, x=1 mpd neu starten
Px            x=0 einen Senderplatz zurück x=1 einen Senderplatz hoch
Tx            Taste x am Gerät gedrückt
resetreset     Reboot des Raspi
*/
char eingang[255]="";
char d[1]="";
int anzahl=0;
    
int laenge=0;
int logg=0;
int    fd;                // File descriptor
int sender;
int lautst=95;
long int time_back;
long int time_ok;
struct    termios newtio={};
unsigned char eingangleer()            //Eingangstring leeren
{
    int i;
    for(i=0; i < laenge; i++){
        eingang[i] = 0;
    }
  laenge=0;    
}
unsigned char platzlautsenden()        //Lautstärke und Senderplatz auf den kleinen Zahlen ausgeben
{                                    //Lautstärke 100% und Senderplatz 3 wird zu 100:03
    char nummer[3];
    int i=0;
    char befehl[255]="";
    sprintf(nummer,"%d",lautst);
    strcpy(befehl,"/var/scripte/senden 2");
    if (strlen(nummer)<3){
        strcat(befehl,"0");
    }
    if (strlen(nummer)<2){
        strcat(befehl,"0");
    }
    strcat(befehl,nummer);
    strcat(befehl,":");
    i=sender;
    if(i>99){                //Die Anzeige ist 2-Stellig
        i=99;
    }
    sprintf(nummer,"%d",i);
    if (strlen(nummer)<2){
        strcat(befehl,"0");
    }
    strcat(befehl,nummer);
    system(befehl);
}
unsigned char radioein()            //gewählten Platz in der Playlist abspielen
{ 
    char nummer[3];
    char befehl[255]="";
    sprintf(nummer,"%d",sender);
    strcpy(befehl,"mpc -q play ");
    strcat(befehl,nummer);
    system(befehl);
    platzlautsenden();
}
unsigned char initmpd()                    //Schnittstelle parametrieren und öffnen
{
    char befehl[30]="";
    char s[2]="";
    lautst=95;
    system("/var/scripte/radio2.sh");    //InitScript für mpd
    sleep(1);
    system("mpc playlist > /tmp/mpdlist");    //Playlist zwischenspeichern
    sleep(1);
    FILE *f;
    char Text[300]="";
    char Text1[70]="";
    char Text2[7]="volume";
    f = fopen("/tmp/mpdlist","r");
    anzahl=0;                //Anzahl Einträge der Senderliste zählen
    if(f!=NULL){
        fgets(Text, sizeof(Text), f);
        if(strlen(Text)<2){
            fclose(f);
            return;
        }else{
            anzahl=1;
            while( fgets(Text, sizeof(Text), f) !=0 ){
                if(strlen(Text)>2){
                    anzahl++;
                }
                if(anzahl>199){        //Nicht mehr wie 200
                    break;
                }
            }
        }
        fclose(f);
    }
    strcpy(befehl,"/var/scripte/senden 6");        //kleine Symbole im Display anzeigen lassen
    s[0]=208;                    //Antennensymbol + FM anzeigen, als Zeichen für Bereit
    strcat(befehl,s);
    system(befehl);
    strcpy(befehl,"/var/scripte/senden 7");                
    s[0]=130;                    //Stereo anzeigen
    strcat(befehl,s);
    system(befehl);    
}
unsigned char abspielen()                //Wiedergabe fortsetzen. Ist noch nichts abgespielt worden, Platz 1 abspielen
{
    if (anzahl>0){
        if (sender==0){
            sender=1;
        }else{ if(sender>anzahl){
            sender=anzahl;
            }
            radioein();
        }
    }
}
unsigned char platzplus()                //Senderplatz um 1 erhöhen
{                                        //Bei weniger Sendern in Liste auf Platz 1 zurück
    if (anzahl>0){
        sender++;                                    
        if (sender>anzahl){                            
            sender=1;
        }
        radioein();
    }    
}
unsigned char platzminus()                //Senderplatz um 1 verringern
{                                        //Bei 0 auf letzten Platz springen
    if (anzahl>0){
        sender--;                                    
        if (sender<1){                                
            sender=anzahl;
        }
        radioein();
    }    
}
unsigned char lautsetzen()                //Lautstärke einstellen
{
    char nummer[3];
    char befehl[255]="";
    sprintf(nummer,"%d",lautst);
    strcpy(befehl,"mpc -q volume ");
    strcat(befehl,nummer);
    system(befehl);
    platzlautsenden();
}
unsigned char lauter()                    //Senderplatz um 5 Prozentpunkte erhöhen
{
    if (lautst<96){
        lautst+=5;                                    
        lautsetzen();
    }    
}
unsigned char leiser()                    //Senderplatz um 5 Prozentpunkte verringern
{
    if (lautst>5){
        lautst-=5;                                    
    }else{
        lautst=0;
    }
    lautsetzen();
}
unsigned char radioaus()                //Wiedergabe anhalten
{
    system("mpc -q stop");
    system("/var/scripte/senden 45");
    sleep(1);
}
unsigned char auswerten()                //Angekommene Daten auswerten
{ int i;    
  int fd1;
  int zeile;
  char ret;
  char farbe[6]="";
  
  /* Zum Schreiben öffnen */
    if ((strcmp(eingang,"resetreset") ==0 )){
        system("reboot");
    }
    if (eingang[0] == 83){                         // S
        zeile=eingang[1]-48;               //Werte von 48-255 = 207 mögliche Sender, wird auf 200 limitiert
        if (zeile == 0){               // bei 0 einfach weiter abspielen oder Platz 1 beginnen
            abspielen();
        }else if (zeile<=anzahl){
            sender=zeile;
            radioein();
        }
      }
    if (eingang[0] == 84){                          // T
        if (eingang[1]>49&&eingang[1]<57){    //Wert soweit OK, Taste 1 = Powertaste und wird vom AVR ausgewertet
            if (eingang[1]==50){        //2 - OK Taste
                abspielen();
            }
            if (eingang[1]==51){        //3 - Wippe rechts
                lauter();    
            }
            if (eingang[1]==52){        //4 - BACK Taste
                radioaus();
            }
            if (eingang[1]==53){        //5 - Menü Taste
                system("/var/scripte/senden");
            }
            if (eingang[1]==54){        //6 - Wippe hoch
                platzplus();
            }
            if (eingang[1]==55){        //7 - Wippe links
                leiser();
            }
            if (eingang[1]==56){        //8 - Wippe runter
                platzminus();
            }
        }
    }
    if (eingang[0] == 80){                          // P
        if (eingang[1]==49){             //1
            platzplus();
        }else{
            platzminus();
        }
      }
    if (eingang[0] == 66){                          // B
        if (eingang[1]==48){             //0 Wiedergabe stoppen
            radioaus();
        }
        if (eingang[1]==49){             //1 mpd zurücksetzen
            initmpd();
        }
    }
    eingangleer();
 }
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 die neuen Porteinstellungen
    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 */
    tcflush(fd, TCIFLUSH);
    tcsetattr(fd, TCSANOW, &newtio);
    //getit = O_NDELAY;
    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 Pi wiringPi test program\n") ;
  if (wiringPiSetup () == -1)
    exit (1) ;
  //new end Check wiring pi
  
  pinMode(pin,INPUT);
  
    
    
    char c;
     init();                    //Schnittstelle UART parametrieren und öffnen
    sleep(5);                 //warten bis mpd gestartet ist
     initmpd();                //mpd auf definierten Zustand bringen
    while (1)
        {
    
    value = digitalRead (pin);
     printf("Status Schnittstelle %d \n", getit );
    
    //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
        
    //}
    
    
/*         
        c=receive();                //Zeichen holen
        if((c==13)){            //CR als Abschluß einer Zeile
            auswerten();        
        }else if(c>13&&c<128){        //Alles von ASCii 14 bis 127 wird akzetpiert
            eingang[laenge]=c;        
            laenge++;                
            if (laenge >254){    //Bei 254 Zeichen im Puffer wird automatisch ausgewertet
                auswerten();
            }
        }
    printf("The answer is %X\n", c); // c in Hex ausgeben    %d = Dezimal %H = Hex
 */    
    
    
    
    } 
    
    close (fd);
    return 0;
}
 Grüße Rainer
						
Lesezeichen