[gelöst] read mit sleep funktioniert nicht



  • Hallo,

    ich versuche die serielle schnittstelle zu lesen...funktioniert auch, nur leider frisst der Code 100% CPU-Last.
    diesem wollte ich mttels sleep Einhalt gebieten, nur leider funktioniert read dann nicht mehr, bzw. kommt am port nix mehr an.

    hier mal der code:

    /*
        terminal.c - Ein- und Ausgabe ueber die serielle
                     Schnittstelle
    */
    
    # include <stdio.h>
    # include <unistd.h>
    # include <fcntl.h>
    # include <termios.h>
    
    //# define TERM_DEVICE "/dev/ttyS0"   /* = COM1 */
    //# define TERM_DEVICE "/dev/ttyACM0"
    # define TERM_DEVICE "/dev/arduinoUNO"
    //# define TERM_SPEED B19200      /* Bit/Sek */
    # define TERM_SPEED B9600      /* Bit/Sek */
    
    int main()
     {
      int fd;//, old_flags;
      ssize_t length;
      char buffer[16];
      struct termios term_attr;
      fd_set input_fdset;
    
      if ((fd = open(TERM_DEVICE, O_RDWR)) == -1)
       {
        perror("terminal: Can't open device " TERM_DEVICE);
        return(1);
       }
                /* RS232 konfigurieren */
      if (tcgetattr(fd, &term_attr) != 0)
       {
        perror("terminal: tcgetattr() failed");
        return(1);
       }
      term_attr.c_cflag = TERM_SPEED | CS8 | CRTSCTS | CLOCAL;
      term_attr.c_iflag = 0;
      term_attr.c_oflag = OPOST | ONLCR;
      term_attr.c_lflag = 0;
      if (tcsetattr(fd, TCSAFLUSH, &term_attr) != 0)
        perror("terminal: tcsetattr() failed");
    
      while (1)
       {
    	if ((length = read(fd, buffer, 16)) == -1)
    	  perror("terminal: read() failed");
    	else
    	  write(STDOUT_FILENO, buffer, length);
    
          sleep(500); //ohne sleep funktioniert es
       }
      printf("Aborted.\n");
      close(fd);
      return(0);
     }
    

    gibt es etwas ähnliches wie sleep, was read, bzw. den Puffer der Schnittstelle nicht blockiert?

    //Edit: ich seh gerade, unter c erwartet die sleep-funktion die Zeit in sekunden (in delphi uns anderen Sprachen sind es millisekunden)...dann ist natürlich klar, warum mit wert 500 nix passiert 😉

    Gruß Frank



  • Ich kenne die ganzen tc-Flags nicht. Aber stellst du damit den Filedescriptor auf non-blocking? Wenn ja, dann solltest du lieber man: select(2) oder man: epoll benutzen. Ansonsten würde ich die Größe des Buffers erhöhen (zB 1024)



  • die serielle Schnittstelle ist nicht auf non-blocking (kommt später)...aber diese sendet permanent etwas (aber nicht viel...nur Befehlscodes)

    lässt denn select die kommunikation von Pipes Richtung Serielle Schnittstelle zu, wenn beide FileDescriptoren in dem select drin sind?



  • frank schrieb:

    die serielle Schnittstelle ist nicht auf non-blocking (kommt später)...aber diese sendet permanent etwas (aber nicht viel...nur Befehlscodes)

    Achso, dann ist das sleep vielleicht wirklich besser. Es gibt auch usleep/nanosleep, wenn du kürzer warten willst.

    lässt denn select die kommunikation von Pipes Richtung Serielle Schnittstelle zu, wenn beide FileDescriptoren in dem select drin sind?

    Ich verstehe die Frage nicht ganz. Aber ja, du kannst alle Deskriptoren darein packen. Ob es Dateien, Schnitstellen, Sockets, eventfds etc. sind.



  • hab das mal probiert umzusetzen...siehe http://www.c-plusplus.net/forum/292121


Anmelden zum Antworten