Добрый день.
Такая вот задачка, сперва опишу проблему, ниже прикреплю код. Есть библиотека работающая с serial port(/dev/ttyS0), и пример к ней, все работает идеально, данные выводит в консоль. Но задача состоит в том что бы данные выводились в окно. Почитал документацию по сигналам и слотам... разбираюсь, но пока что безуспешно.
вот код:
main.cpp
C++ (Qt)
#include <iostream>
#include <QtCore/QCoreApplication>
#include <QThread>
#include <QString>
#include <QStringList>
#include <QDebug>
#include <QSerialPort>
#include "host.h"
void printHelp()
{
std::cout << "Usage: echo_eventmode [--help] [--port=<serial port>] [--set=<port settings>]" << std::endl;
std::cout << std::endl;
#if defined(Q_OS_WIN)
std::cout << "Example: echo_eventmode --port=COM3 --set=9600,8,N,1" << std::endl;
#else
std::cout << "Example: echo_eventmode --port=/dev/ttyS0 --set=9600,8,N,1" << std::endl;
#endif
}
bool processArgs(const QStringList &args, QString &serPort, QString &settings)
{
QHash<QString, QString> argPairs;
foreach( QString ar, args ) {
if ( ar.split('=').size() == 2 ) {
argPairs.insert(ar.split('=').at(0), ar.split('=').at(1));
}
else {
if ( ar == "--help" )
goto LPrintHelpAndExit;
}
}
settings = argPairs.value("--set", "9600,8,n,1");
#if defined(Q_OS_WIN)
serPort = argPairs.value("--port", "COM3");
#else
serPort = argPairs.value("--port", "/dev/ttyS0");
#endif
return true;
LPrintHelpAndExit:
printHelp();
return false;
}
int main(int argc, char *argv[])
{
using TNX::QSerialPort;
QCoreApplication a(argc, argv);
std::cout << "Serial port echo example with event-driven model, Copyright (c) 2010 Inbiza Systems Inc." << std::endl;
std::cout << "Created by Inbiza Labs <labs@inbiza.com>" << std::endl;
std::cout << std::endl;
std::cout << "Main thread id: " << QThread::currentThreadId() << std::endl;
QString portName;
QString settings;
if ( !processArgs(a.arguments(), portName, settings) )
return 0;
QSerialPort serport(portName, settings);
if ( !serport.open() )
qFatal("Cannot open serial port %s. Exiting..", qPrintable(portName));
Host host(serport);
return a.exec();
}
host.cpp
C++ (Qt)
#include <iostream>
#include <QtCore/QCoreApplication>
#include <QThread>
#include <QSerialPort>
#include <QTimerEvent>
#include <QDateTime>
#include "host.h"
Host::Host(TNX::QSerialPort &serPort, QObject *parent)
: QObject(parent), serialPort_(serPort), timerId_(0), byteCounter_(0)
{
using TNX::QSerialPort;
timerId_ = startTimer(5000);
connect(&serialPort_, SIGNAL(readyRead()), SLOT(onDataReceived()));
if ( !serialPort_.setCommTimeouts(QSerialPort::CtScheme_NonBlockingRead) )
qWarning("Cannot set communications timeout values at port %s.", qPrintable(serialPort_.portName()));
}
Host::~Host()
{
}
void Host::onDataReceived()
{
if ( timerId_ )
killTimer(timerId_);
QByteArray data = serialPort_.read(512);
byteCounter_ += data.size();
std::cout << "Thread id: " << QThread::currentThreadId() << " Received data @ " <<
qPrintable(QDateTime::currentDateTime().toString("hh:mm:ss.zzz")) << ". Echo back." << std::endl;
serialPort_.write(data);
if ( byteCounter_ >= 4096 ) {
std::cout << "Event-Driven example is terminated successfully." << std::endl;
qApp->exit(0);
}
// create a wait timer for the next packet
timerId_ = startTimer(5000); // 5sec
}
void Host::timerEvent(QTimerEvent *event)
{
Q_ASSERT(timerId_ == event->timerId());
killTimer(event->timerId());
timerId_ = 0;
std::cout << "Timeout occurred." << std::endl;
}
host.h
C++ (Qt)
#ifndef HOST_H__
#define HOST_H__
#include <QObject>
class QTimerEvent;
namespace TNX { class QSerialPort; }
class Host : public QObject
{
Q_OBJECT
public:
Host(TNX::QSerialPort &serPort, QObject *parent = 0);
~Host();
protected:
virtual void timerEvent(QTimerEvent *event);
private slots:
void onDataReceived();
private:
TNX::QSerialPort &serialPort_;
int timerId_;
int byteCounter_;
};
#endif // HOST_H__
открываю проект в qt creator добавляю класс формы qr desinger mainwindow ... есть ui форма... добавляю виджеты... все работает кроме .... того что я не могу графику связать с программой, не могу передать переменную из ф-и void Host::onDataReceived() в ф-ю... работающую с гуи окном в класе mainwindow