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