Hallo,
meine erste Übung in QT4 sollte sein, dass ich mit einem schieberegler den wert an die serielle schnittstelle schicke. ich habe aber probleme diese Funktion in einer QT-Klasse richtig zu beschreiben. Es ist reduziert auf eine Fehlermeldung, die ich nicht verstehe:
src/main.cpp:92: Fehler: keine passende Funktion für Aufruf von »QObject::connect(QSlider*&, const char [16], Seriell&, const char [9])«
/usr/include/qt4/QtCore/qobject.h:197: Anmerkung: Kandidaten sind: static bool QObject::connect(const QObject*, const char*, const QObject*, const char*, Qt::ConnectionType)
/usr/include/qt4/QtCore/qobject.h:302: Anmerkung: bool QObject::connect(const QObject*, const char*, const char*, Qt::ConnectionType) const
Der Quellcode:
#include <QApplication>
//#include "dialogimpl.h"
#include <QVBoxLayout>
#include <QSpinBox>
#include <QSlider>
#include <QObject>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#include <cstring>
#include <fstream>
#include <iostream>
#include <iomanip> //für setwd
#include <ctime>
#include <unistd.h>
#include <sys/ioctl.h>
using namespace std;
void open_ser(void);
int fd,c, res;
struct termios oldtio,newtio;
/* baudrate settings are defined in <asm/termbits.h>, which is
included by <termios.h> */
#define BAUDRATE B38400
/* change this definition for the correct port */
#define MODEMDEVICE "/dev/ttyS2"
#define _POSIX_SOURCE 1 /* POSIX compliant source */
#define FALSE 0
#define TRUE 1
class Seriell:public QObject{
Q_OBJECT
public:
Seriell(QObject *parent=0);
//char senden();
void event(){
senden();
}
signals:
void valueChanged(int);
public slots:
void senden();
};
void Seriell::senden()
{
char Out[20];
//int a;
ofstream schreiben(MODEMDEVICE);
strcat(Out,"hallo");//"20=5!'\13'");
schreiben.write(Out,strlen(Out));
}
//
int main(int argc, char *argv[])
{
Seriell test;
open_ser();
QApplication app( argc, argv );
QWidget* win =new QWidget;
QVBoxLayout* layout=new QVBoxLayout(win);
QSpinBox* spin =new QSpinBox;
QSlider* slider =new QSlider(Qt::Horizontal);
//Minimum-Maximum Wert für Spinbox
spin->setMinimum(0);
spin->setMaximum(10);
//Minimum-Maximum Wert für Slider
slider->setMinimum(0);
slider->setMaximum(10);
//Widgets hinzufügen
layout->addWidget(spin);
layout->addWidget(slider);
//Signal- und Slot Verbindung
QObject::connect(spin,SIGNAL(valueChanged(int)),
slider,SLOT(setValue(int)));
QObject::connect(slider,SIGNAL(valueChanged()),
test,SLOT(event()));
win->show();
return app.exec();
}
void open_ser()
{
/*
Open modem device for reading and writing and not as controlling tty
because we don't want to get killed if linenoise sends CTRL-C.
*/
fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );
if (fd <0) {perror(MODEMDEVICE); exit(-1); }
fd_set readfs; /* file descriptor set */
tcgetattr(fd,&oldtio); /* save current serial port settings */
bzero(&newtio, sizeof(newtio)); /* clear struct for new port settings */
/*
BAUDRATE: Set bps rate. You could also use cfsetispeed and cfsetospeed.
CRTSCTS : output hardware flow control (only used if the cable has
all necessary lines. See sect. 7 of Serial-HOWTO)
CS8 : 8n1 (8bit,no parity,1 stopbit)
CLOCAL : local connection, no modem contol
CREAD : enable receiving characters
*/
newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
/*
IGNPAR : ignore bytes with parity errors
ICRNL : map CR to NL (otherwise a CR input on the other computer
will not terminate input)
otherwise make device raw (no other input processing)
*/
newtio.c_iflag = IGNPAR | ICRNL;
/*
Raw output.
*/
newtio.c_oflag = 0;
/*
ICANON : enable canonical input
disable all echo functionality, and don't send signals to calling program
*/
newtio.c_lflag = ICANON;
/*
initialize all control characters
default values can be found in /usr/include/termios.h, and are given
in the comments, but we don't need them here
*/
newtio.c_cc[VINTR] = 0; /* Ctrl-c */
newtio.c_cc[VQUIT] = 0; /* Ctrl-\ */
newtio.c_cc[VERASE] = 0; /* del */
newtio.c_cc[VKILL] = 0; /* @ */
newtio.c_cc[VEOF] = 4; /* Ctrl-d */
newtio.c_cc[VTIME] = 0; /* inter-character timer unused */
newtio.c_cc[VMIN] = 1; /* blocking read until 1 character arrives */
newtio.c_cc[VSWTC] = 0; /* '\0' */
newtio.c_cc[VSTART] = 0; /* Ctrl-q */
newtio.c_cc[VSTOP] = 0; /* Ctrl-s */
newtio.c_cc[VSUSP] = 0; /* Ctrl-z */
newtio.c_cc[VEOL] = 0; /* '\0' */
newtio.c_cc[VREPRINT] = 0; /* Ctrl-r */
newtio.c_cc[VDISCARD] = 0; /* Ctrl-u */
newtio.c_cc[VWERASE] = 0; /* Ctrl-w */
newtio.c_cc[VLNEXT] = 0; /* Ctrl-v */
newtio.c_cc[VEOL2] = 0; /* '\0' */
/*
now clean the modem line and activate the settings for the port
*/
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);
/*
terminal settings done, now handle input
*/
return;
}
Problem mit eigenem Slot
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Wenn connect() einen Pointer möchte, solltest Du ihn auch einen geben und kein Objekt - C++ Basics.
Benutze außerdem bitte die
Benutze außerdem bitte die
Code: Alles auswählen
- Tags - den Code kann so keiner wirklich esen!MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
'Funktioniert nicht' ist keine Fehlerbeschreibung
Und bevor hier noch ein Anfänger durchsurft und sich den Code zum Serialport abschaut folgender Tipp: http://qextserialport.sourceforge.net/