Anzeige:
Ergebnis 1 bis 5 von 5

Thema: qt und open(..) + write(..) funktioniert nicht

  1. #1
    Moderator Avatar von geronet
    Registriert seit
    23.05.2001
    Ort
    Grainau
    Beiträge
    96

    Unhappy qt und open(..) + write(..) funktioniert nicht

    Hallöchen,

    ein sehr seltsames Problem gibts hier zu lösen. Habe ein qt Programm mit Hilfe des Designers geschrieben, und wollte nun auf die serielle Schnittstelle zugreifen, dies gibt aber in einer Klassenfunktion immer einen Fehler, komischerweise im Konstruktor aber nicht !?

    In dieser init-Funktion wird /dev/ttyS0 geöffnet, ein paar Parameter gesetzt und dann ein write ausgeführt, was auch erfolgreich ist.
    Code:
    #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 */
    
    int fd;                         /* File descriptor for the port */
    
    void Qcontrol::init ()
    {
            fd = open ("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
            if (fd < 0)
            {
                    //Could not open the port.
                    fprintf (stderr, "open(..) failed: %s\n", strerror (errno));
            }
            else
            {
                    struct termios my_termios;
                    printf ("fd is %d\n", fd);
                    tcgetattr (fd, &my_termios);
                    // NOTE: you may want to save the port attributes
                    //       here so that you can restore them later
                    printf ("old cflag=%08x\n", my_termios.c_cflag);
                    printf ("old oflag=%08x\n", my_termios.c_oflag);
                    printf ("old iflag=%08x\n", my_termios.c_iflag);
                    printf ("old lflag=%08x\n", my_termios.c_lflag);
                    printf ("old line=%02x\n", my_termios.c_line);
    
                    tcflush (fd, TCIFLUSH);
    
                    my_termios.c_cflag = B38400 | CS8 | CREAD | CLOCAL | HUPCL;
    
                    cfsetospeed (&my_termios, B38400);
                    tcsetattr (fd, TCSANOW, &my_termios);
    
                    printf ("new cflag=%08x\n", my_termios.c_cflag);
                    printf ("new oflag=%08x\n", my_termios.c_oflag);
                    printf ("new iflag=%08x\n", my_termios.c_iflag);
                    printf ("new lflag=%08x\n", my_termios.c_lflag);
                    printf ("new line=%02x\n", my_termios.c_line);
            }
    
            int n = write (fd, "c0", 2);
            if (n < 0)
                    fprintf (stderr, "write() failed: %s\n", strerror (errno));
            else
                    fprintf (stderr, "write() success: %d\n", n);
    
            fprintf (stderr, "ready\n");
    }
    Rufe ich nun mit Hilfe eines Schiebereglers diese Funktion auf, versuche ich nochmal mit write zu schreiben, dies gibt aber immer den Fehler "write() failed: Ungültige Adresse":
    Code:
    void Qcontrol::slider0moved (int value)
    {
                    printf ("fd is %d\n", fd);
            lcd0->display (255 - value);
            int n = write (fd, "c0", 2);
            if (n < 0)
                    fprintf (stderr, "write() failed: %s\n", strerror (errno));
            n = write (fd, (void *) (255 - value), 1);
            if (n < 0)
                    fprintf (stderr, "write() failed: %s\n", strerror (errno));
    
    }
    An "fd" hat sich zwischenzeitlich nichts geändert, wie man an der Ausgabe sehen kann (es ist ja auch ganz oben global deklariert):
    Code:
    fd is 7
    old cflag=00000cbf
    old oflag=00000004
    old iflag=00000500
    old lflag=00008a20
    old line=00
    new cflag=00000cbf
    new oflag=00000004
    new iflag=00000500
    new lflag=00008a20
    new line=00
    write() success: 2
    ready
    fd is 7
    write() failed: Ungültige Adresse
    fd is 7
    write() failed: Ungültige Adresse

    Ich versteh nun nicht warum das zweite write(..) einen Fehler macht, ist in der Klassenfunktion irgendwas anders?

    Die main.cpp habe ich mal weggelassen, ist auch nur Standardkram drin.

    Grüsse und schönen Dank für Hilfe,
    Stefan

  2. #2
    Moderator Avatar von geronet
    Registriert seit
    23.05.2001
    Ort
    Grainau
    Beiträge
    96
    Hat sich erledigt, das "(void *) (255 - value)" hat ihm nicht gepasst

  3. #3
    Registrierter Benutzer
    Registriert seit
    06.12.2005
    Ort
    CH - Zug
    Beiträge
    88
    hi

    arbeite selber mit der schnittstelle aber flag HUPCL hab ich noch nie gesehn =)
    was macht das ding?
    sry bin gerade zu faul um die manpage auzurufen
    habe lange blut geschwitzt bis ich mal die schnittstelle im richtigen modus hatte für mein prog.
    /* -->
    RTFM
    <-- */

  4. #4
    Moderator Avatar von geronet
    Registriert seit
    23.05.2001
    Ort
    Grainau
    Beiträge
    96
    Keine Ahnung, hab das einfach rauskopiert

  5. #5
    Registrierter Benutzer
    Registriert seit
    06.12.2005
    Ort
    CH - Zug
    Beiträge
    88
    Oo ^^

    oke
    /* -->
    RTFM
    <-- */

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •