Gerät verfügbar



  • Hallo,
    kann ich irgendwie testen, ob ein Gerät verfügbar ist?
    ich möchte auf einer Seriellen Schnittstelle (usb2Serial) arbeiten und möchte da abfangen, wenn das Kabel abgezogen wird.
    ich habe in einer schleife das read, welches mit -1 bzw. EBADF abbricht. in dem Fall würde ich gerne testen, ob das device noch existiert und nur in dem Fall open erneut aufrufen. Ich weis nicht, ob es reicht, wenn ich nur teste, ob die Datei /dev/xxx (wird mittels udev erstellt als link auf das eigentliche /dev/ttyACMx) noch existiert.

    Gruß Frank



  • Du kannst udev-Regeln erstellen, die bestimmte Befehle ausführen, wenn ein Gerät verschwindet oder dazukommt. Damit könntest du dein Programm benachrichtigen.



  • ich möchte so wenig wie möglich im system ändern...lässt sich der fall nicht sinnvoll im Programm abfangen?

    ich könnte ja auch mein programm per udev starten und beim read-fehler beenden, aber ich würde lieber das programm immer laufen lassen und beim read-fehler nur schauen, ob das device wieder da ist und dann wieder open aufufen



  • das mit dem read-fehler klappt nicht wirklich, da read beim trennen der usb-verbindung kein error-level setzt, geschweige denn -1 zurückgibt.

    /*
        terminal.c - Ein- und Ausgabe ueber die serielle
                     Schnittstelle
    */
    
    # include <stdio.h>
    # include <unistd.h>
    # include <fcntl.h>
    # include <termios.h>
    # include <errno.h>
    
    # define TERM_DEVICE "/dev/arduinoUNO"
    # define TERM_SPEED B9600      /* Bit/Sek */
    
    int main()
     {
      int fd;
      ssize_t length;
      char buffer[16];
      struct termios term_attr;
    
      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)
       {
          int res=(length = read(fd, buffer, 16));
    	if (res == -1)
    	{
    	  perror("terminal: read() failed");
    	} else
    	  write(STDOUT_FILENO, buffer, length);
    
    	printf("res: %d, length:%d, errno: %d\n",res,length,errno);
          sleep(1);//sleep for 1 second
       }
      printf("Aborted.\n");
      close(fd);
      return(0);
     }
    

    beim Trennen der USB-Verbindung wird der durch UDEV angelegte symlink gelöscht, jedoch read und length gehen auf 0 (errno ist immer 0).

    habe ich da einen Denk/Schreibfehler?



  • hat niemand eine idee? mich wundert, dass in sämtlicher Dokumentation steht, dass read -1 zurückgibt, was bei mir aber nicht der Fall ist, obwohl das "Device" (symlink) nicht mehr existiert...wie kann das sein?



  • 0 signalisiert auch EOF. Vermutlich wird das als EOF angesehen. Solange du nicht NONBLOCK liest, kannst du das ja als Hinweis nehmen, dass das Device disconnected ist.



  • Ich arbeite nonblocked,da ich nebenbei eine pipe lese und select nicht hinbekomme (siehe anderer thread).

    Somit kann ich nicht unterscheiden,ob das device weg ist oder einfach nix empfangen wurde.


Anmelden zum Antworten