C-Code aus 2009 lässt sich nicht kompilieren

  • [font="Arial"]Hallo zusammen,[/font]


    [font="Arial"]nachdem ich schon längere Zeit immer mal wieder mitlese, hab ich mich jetzt doch mal angemeldet weil ich bei folgendem Problem nicht weiterkomme:[/font]


    [font="Arial"]Ich möchte meinen Heizkessel gerne über eine RS232 Schnittstelle steuern. Hierzu habe ich ein Tutorial inklusive Sourcecode gefunden. [/font]


    [font="Arial"]

    Code
    #include <sys/types.h>#include <sys/socket.h>                                                             #include <stdio.h>                                                                  #include <netinet/in.h>                                                             #include <arpa/inet.h>                                                              #include <string.h>                                                                 #include <fcntl.h>                                                                  #include <errno.h>                                                                  #include <termios.h>                                                                #include <sys/stat.h>                                                               #include <stdlib.h>                                                                 #include <stdarg.h>                                                                 #include <signal.h>                                                                 #include <unistd.h>                                                                 #include "sys/ioctl.h"                                                              #include "fcntl.h"                                                                  #include <pthread.h>                                                                int tty_fd;pthread_t leseTTY;int server_socket;                                                                  volatile int client_socket=-1;unsigned char start[3]          = {'{','M','C'};unsigned char datas[10][3]={{0x08,00,0x0c},{0x08,00,0x0b},{0x08,00,0x0a}                           ,{0x08,00,0x0d},{0x08,00,70},{0x08,00,75}                           ,{0x08,00,15},{0x08,00,8},{0x08,00,9}                           ,{0x08,00,68}};unsigned char *namen[10]  ={"Puffer Oben    ","Puffer Mitte   ","Puffer Unten   "                            ,"Boiler         ","Aussen         ","Puffer Ladezst."                            ,"Abgas          ","Kessel         ","Ruecklauf      "                            ,"Vorlauf MK1    "};unsigned char ende[1]     = {'}'};        unsigned char stopp[6]    = {'{','M','E',0,0,'}'};unsigned char boilerAn[8]    = {'{','I','H',2,0x40,0x40,0,'}'};float werte[10];const int anzahlWerte = 10;volatile unsigned char ausgabe[500];unsigned char ausgabeText[500];volatile int sonderwaermflag=0;int tty_open(char* tty_dev) {  struct termios new_attributes;  tty_fd = open(tty_dev,O_RDWR| O_NOCTTY | O_NONBLOCK);  bzero(&new_attributes,sizeof(new_attributes));  new_attributes.c_cflag &= ~PARENB;  new_attributes.c_cflag &= ~CSTOPB;  new_attributes.c_cflag &= ~CSIZE;  new_attributes.c_cflag |= CS8;  new_attributes.c_cflag |= B19200;  int zahl = tcsetattr(tty_fd, TCSANOW, &new_attributes);  if (zahl < 0) {    printf ("Fehler %d\n",zahl);  }  return tty_fd;}void erzeugeUndSendeOutString() {  unsigned char tmp[123];   int i,pruef=0,lang = 0;  memcpy(tmp+lang,start,3);  lang += 6;  for ( i = 0 ; i < 10 ; i++) {    memcpy(tmp+lang,datas[i],3);    lang += 3;  }  tmp[5] = 20;           // Zeit  for (i=0;i<lang;i++) {    if (i>=5) {      pruef += tmp[i];    }  }  tmp[3] = lang-5;  tmp[4] = pruef%256;  tmp[lang]= ende[0];  lang++;  write(tty_fd,tmp,lang);}void setzeAusgabe(char *was) {  strcpy(ausgabeText,was);}void leseLeer() {  unsigned char tmp[30];  unsigned wort[500];  int lang;  int a,i;  int anzahlBytes = -1;  ausgabe[0]=0;  lang=0;  a = read (tty_fd,tmp,1);  while ((a != -1)) {    if (a>0) {      if (lang == 3) {        anzahlBytes = tmp[0];      }      wort[lang]=tmp[0];      lang++;      if (tmp[0] == '}') {        if (lang >= anzahlBytes && anzahlBytes > 0) {          break;        }      }    }    a = read (tty_fd,tmp,1);  }}void leseundInterpretiereInString() {  unsigned char tmp[30];  unsigned wort[500];  int lang;  int a,i;  float wert;  int anzahlBytes = -1;  while (1) {    ausgabe[0]=0;    lang=0;    a = read (tty_fd,tmp,1);    while ((a != -1)) {      if (a>0) {        if (lang == 3) {          anzahlBytes = tmp[0];        }        wort[lang]=tmp[0];        lang++;        if (tmp[0] == '}') {          if (lang >= anzahlBytes && anzahlBytes > 0) {            break;          }        }      }      a = read (tty_fd,tmp,1);    }    for (i=0 ; i < 10 ; i++) {      for (a=5;a<lang;a+=5) {        if (wort[a]==datas[i][0] && wort[a+1]==datas[i][1] && wort[a+2]==datas[i][2]) {          wert=(float)wort[a+3]*256.0+(float)wort[a+4];          if (wert > 65000) wert-= 65536;                   if (wert < -1000 || wert > 10000) {            wert = werte[i];            wert=0;          }          if (!strstr(namen[i],"Puffer Ladezst.")) {            wert /=10;            sprintf(tmp," %2.2f",wert);          }          else {            sprintf(tmp," %2.2f%%",wert);          }          werte[i] = wert;          sprintf (ausgabe,"%s%s:%s\n",ausgabe,namen[i],tmp);        }      }    }    setzeAusgabe(ausgabe);    if (sonderwaermflag) {      write(tty_fd,boilerAn,8);//      leseLeer();      sonderwaermflag=0;    }  }}char *parse (char *was) {                                                             char *tmp;                                                                          char *retVal = malloc(strlen(was));                                                 strcpy(retVal,was);                                                                 tmp = strstr(retVal,"\n");                                                          if (tmp != NULL) {                                                                    tmp[0]=0;                                                                         }                                                                                   while ((tmp = strstr(retVal,"\t"))) {                                                 tmp[0] = (char)' ';                                                               }                                                                                   while ((tmp = strstr(retVal,"  "))) {                                                 memmove(tmp,tmp+1,strlen(tmp));                                                   }                                                                                   return retVal;                                                                    }   int serverStart(int port) {                                                           int anzahl, laenge;                                                                 struct sockaddr_in serverinfo, clientinfo;                                          char zeichen[200];                                                                  char empfangen[1000];                                                               int execCode;                                                                                                                                                           if (port == -1) port = 5100;                                                                                                                                            server_socket = socket(AF_INET, SOCK_STREAM, 0);                                                                                                                        serverinfo.sin_family = AF_INET;                                                    serverinfo.sin_addr.s_addr = htonl(INADDR_ANY);                                     serverinfo.sin_port = htons(port);                                                  laenge = sizeof(serverinfo);                                                                                                                                            execCode = bind(server_socket, (struct sockaddr *)&serverinfo, laenge);             if (execCode == -1) {                                                                 printf ("Funktion bind konnte nicht ausgefuehrt werden, das Programm wird\n");      printf ("in 5 Sekunden beendet\n");                                                 sleep(5);                                                                           return 3;                                                                         }                                                                                   execCode = listen(server_socket, 3);                                                if (execCode == -1) {                                                                 printf ("Funktion listen konnte nicht ausgefuehrt werden, das Programm wird\n");    printf ("in 5 Sekunden beendet\n");                                                 sleep(5);                                                                           return 1;                                                                         }         while (1) {                                                                           client_socket = -1;                                                                 printf("\n Der Server wartet...");                                                  fflush(stdout);                                                                     client_socket = accept(server_socket, (struct sockaddr *)&clientinfo, &laenge);     printf("\n Verbindung mit %s\n",inet_ntoa(clientinfo.sin_addr));                    sprintf(zeichen,"\nHilfe durch Eingabe von help\n\n");                              write(client_socket,zeichen,strlen(zeichen));                                       while (1) {                                                                           write(client_socket,"# ",2);                                                        anzahl = read(client_socket,empfangen,sizeof(empfangen));                           empfangen[anzahl]=0;                                                                char *tmp=parse(empfangen);                                                         strcpy(empfangen,tmp);                                                              free(tmp);                                                                          printf ("%s\n",empfangen);                                                          if (strstr(empfangen,"close")==empfangen) {                                           break;                                                                            }                                                                                   else if (strstr(empfangen,"shutdown")==empfangen) {                                   write(client_socket,"bye\n",4);                                                     close(client_socket);                                                               close(server_socket);                                                               return 0;                                                                         }                                                                                   else if (strstr(empfangen,"help")==empfangen) {                                       sprintf (zeichen,"Hilfe:\n");                                                       sprintf (zeichen,"%s  close           - Verbindung beenden\n",zeichen);              sprintf (zeichen,"%s  shutdown        - Server runterfahren\n",zeichen);             sprintf (zeichen,"%s  sonderwaerclose - Heizt den Boiler auf und terminiert\n",zeichen);        sprintf (zeichen,"%s  sonderwaermen   - Heizt den Boiler auf\n",zeichen);        sprintf (zeichen,"%s  statclose       - Zeigt die aktuellen Temperaturen an ",zeichen);        sprintf (zeichen,"%sund terminiert\n",zeichen);        sprintf (zeichen,"%s  status          - Zeigt die aktuellen Temperaturen an\n",zeichen);        write(client_socket,zeichen,strlen(zeichen));                                     }                                                                                   else if (strstr(empfangen,"status")==empfangen) {        sprintf (zeichen,"%s",ausgabeText);        write(client_socket,zeichen,strlen(zeichen));      }      else if (strstr(empfangen,"statclose")==empfangen) {        sprintf (zeichen,"\n%s",ausgabeText);        write(client_socket,zeichen,strlen(zeichen));        break;      }                                                                                   else if (strstr(empfangen,"sonderwaermen")==empfangen) {        sonderwaermflag=1;      }                                                                                   else if (strstr(empfangen,"sonderwaerclose")==empfangen) {        sonderwaermflag=1;        break;      }                                                                                 }    close(client_socket);  }  return 0;                                                                         }                                                                                   int main(int argc, char *argv[]) {  int port = 5123;    if (tty_open(argv[1])<0) {    fprintf (stderr,"tty open error %s\n", strerror(errno));    exit(EXIT_FAILURE);  }   erzeugeUndSendeOutString();  pthread_create(&leseTTY,NULL,(void *)&leseundInterpretiereInString,NULL);  serverStart(port);  write(tty_fd,stopp,6);  close(tty_fd);  exit(0);}


    Quelle: http://ulrich-franzke.de/haustechnik/eta_programm1.html


    Wenn ich es jetzt wie im Tutorial beschrieben kompilieren möchte, bekomme ich folgende Fehlermeldung:


    Vermutlich ist es ein Fehler im Code, aber ich habe leider von C gar keine (und von anderen Sprachennur rudimentäre) Ahnung. Was ich erfolglos probiert habe:


    - Da der Code aus 2009 stammt, habe ich die ältest gcc Version, die ich finden konnte (4.4), probiert. Die Fehlermeldung war etwas anders dargestellt aber inhaltlich wohl identisch

    [font="Arial"]- libpthread-stubs0-dev nachinstalliert[/font]


    [font="Arial"]Kann mir jemand sagen wo das Problem liegt?[/font]


    [font="Arial"]:danke_ATDE: schonmal[/font]


    [size=12][font="Arial"]Gruß Muto[/font]

    Edited once, last by Muto (November 15, 2016 at 11:33 PM).


  • Wenn ich es jetzt wie im Tutorial beschrieben kompilieren möchte, bekomme ich folgende Fehlermeldung:

    Das sind "nur" Warnungen. Schau mal nach, das binary sollte compiliert worden sein.

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!