Close () - filedescriptors mit Qt unter Linux

Hintergrund-Informationen:

Ich habe das schreiben von code zur Steuerung eines angeschlossenen Geräts über ein USB-Kabel, aber die Emulation einer RS-232-port.

Das fragliche Gerät ist ein Arduino-mikrocontroller gesteuert servo-pan-und tilt-Bühne (aber das ist nicht wichtig).

Ich habe es geschafft zum schreiben von Zeichen auf die USB emulierte serielle Schnittstelle mit Hilfe der C++ Sprache mit dem g++ - compiler festlegen, in NetBeans IDE mit dem folgenden code:

    #include <cstdlib>
    #include <stdio.h>   /* Standard input/output definitions */
    #include <string.h>  /* String function definitions */
    #include <unistd.h>  /* UNIX standard function definitions */
    #include <fcntl.h>   /* File control definitions */
    #include <errno.h>   /* Error number definitions */
    #include <termios.h> /* POSIX terminal control definitions */

    /*
     * 'open_port()' - Open serial port 1.
     *
     * Returns the file descriptor on success or -1 on error.
     */

    int
    open_port(void)
    {
        int fd; /* File descriptor for the port */

        fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);
        if (fd == -1)
        {
            /*
            * Could not open the port.
            */

            perror("open_port: Unable to open /dev/ttyUSB0 - ");
        }
        else
            fcntl(fd, F_SETFL, 0);

        int pannumber = 90;
        char str[256];
        int tiltnumber = 90;
        char str2[256];
        char panchar = 0xA5;
        char tiltchar = 0xA5;

        while (tiltchar != 0x00) {
            printf ("Enter the pan number: ");
            gets ( str );
            printf ("\n");
            pannumber = atoi ( str );

            printf ("Enter the tilt number: ");
            gets ( str2 );
            printf ("\n");

            tiltnumber = atoi ( str2 );
            panchar = (char) pannumber;
            tiltchar = (char) tiltnumber;
            int n = 0;
            char mydata[] = { 'U' , 'U' , 'U' , 'U' , panchar , tiltchar };
            n = write(fd, mydata, 6);
            if (n < 0)
            fputs("write() of 6 bytes failed!\n", stderr);
        }
        close(fd);
        return (fd);
    }

Dieser gut funktioniert : (Das "UUUU" chars werden verwendet, um einen handshake mit dem sketch läuft auf dem arduino und die nächsten zwei Zeichen, legen Sie die servo-Winkel).

Frage:

Habe ich versucht, das gleiche zu tun mit Qt Creator mit zwei grafischen Schiebereglern die Werte zwischen 0 und 180, die konvertiert werden chars und geschickt wie oben.

Diese auch funktioniert, ABER beim kompilieren mit der Qt creator IDE ist es nicht, wie die close(fd); Befehl. Wenn ich kommentieren diese Zeile aus läuft das Programm, aber letztendlich sind es beschwert sich über zu viele Dateien offen.

Qt-code:

void MainWindow::TiltValueChangedHandler() {
    tiltValue =   ui->verticalSlider->value();
    panValue = ui->horizontalSlider->value();
    ui->label_3->setText(QString::number(tiltValue));
    ui->label_4->setText(QString::number(panValue));

    panValue++; //To prevent the error when 0 is sent over serial to range is effectively 1 to 181.

    int fd; /* File descriptor for the port. */

    fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);
    if (fd == -1)
    {
        /*
         * Could not open the port.
         */

        perror("open_port: Unable to open /dev/ttyUSB0 - ");
    }
    else
        fcntl(fd, F_SETFL, 0);

    char panchar = (char) panValue;
    char tiltchar = (char) tiltValue;

    int n = 0;
    char mydata[] = { 'U' , 'U' , 'U' , 'U' , panchar , tiltchar };
    n = write(fd, mydata, 6);
    if (n < 0)
        fputs("write() of 6 bytes failed!\n", stderr);

    //close(fd);
    //above line has to be commented out or will not compile but file not does not close!
    return;
 }

Qt compiler-Fehler beim close(fd) nicht auskommentiert ist:

Fehler: keine passende Funktion für Aufruf von " MainWindow::close(int&)'

  • Klingt wie ein namespace-Konflikt. Versuchen ::close(fd).
  • Eine weitere Sache: in der Regel nennen wir Qt in dieser form. QT ist in der Regel QuickTime.
InformationsquelleAutor Zac | 2011-04-07
Schreibe einen Kommentar