我在用QT creator想写一个串口通信程序时,跟很多人一样也是D:\documents\HelloSerialPort\mainwindow.cpp:20: error: undefined reference to SPComm::isOpen() const
D:\documents\HelloSerialPort\debug\mainwindow.o:-1: In function `ZN10MainWindow23on_pushButton_2_clickedEv':
D:\documents\HelloSerialPort\mainwindow.cpp:30: error: undefined reference to `SPComm::isOpen() const'
看网上说是在pro文件中添加类所在的目录,可是我怎么知道它是哪个目录呢?完全不懂啊,求教!下面是我的文件
//mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "SPComm.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
private:
Ui::MainWindow *ui;
SPComm *m_spcomm;
};
#endif // MAINWINDOW_H
spcomm.h
#ifndef SPCOMM_H
#define SPCOMM_H
#include <QObject>
#include <QtSerialPort/QtSerialPort>
class SPComm : public QObject
{
Q_OBJECT
public:
explicit SPComm(QObject *parent = 0);
~SPComm();
bool isOpen() const;
void setPortName(const QString &name);
QString portName() const;
void setBaudRate(int baudRate);
int baudRate() const;
virtual bool open();
virtual void close();
virtual bool clear();
int readData(char *buffer, int count, int timeout = 1000);
int writeData(char *data, int size);
int write(char ch);
protected:
QString m_portName;
int m_baudRate;
QSerialPort *m_serialPort;
signals:
public slots:
};
#endif // SPCOMM_H
增加下面段语句
bool SPComm::isOpen() const
{
if(m_serialPort->isOpen())
return true;
else
return false;
}
// main.cpp
#include "mainwindow.h"
#include "spcomm.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
//mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_spcomm = new SPComm();
}
MainWindow::~MainWindow()
{
delete ui;
delete m_spcomm;
}
void MainWindow::on_pushButton_clicked()
{
if(m_spcomm->isOpen())
return;
m_spcomm->setBaudRate(9600);
m_spcomm->setPortName("com1");
if(m_spcomm->open())
qDebug() << "打开串口成功";
}
void MainWindow::on_pushButton_2_clicked()
{
if(m_spcomm->isOpen())
m_spcomm->close();
qDebug() << "关闭串口成功";
}
//spcomm.cpp
#include "spcomm.h"
/*SPComm::SPComm(QObject *parent) : QObject(parent)
{
}
*/
static QSerialPort::BaudRate getBaudRate(int baudRate)
{
switch (baudRate)
{
case 1200:
return QSerialPort::Baud1200;
case 2400:
return QSerialPort::Baud2400;
case 4800:
return QSerialPort::Baud4800;
case 9600:
return QSerialPort::Baud9600;
case 19200:
return QSerialPort::Baud19200;
case 38400:
return QSerialPort::Baud38400;
case 57600:
return QSerialPort::Baud57600;
case 115200:
return QSerialPort::Baud115200;
default:
return QSerialPort::UnknownBaud;
}
}
//这个函数用来设置串口的名字
//window 下用"com1" linux下用"/dev/ttyS0"
void SPComm::setPortName(const QString &name)
{
m_portName = name;
}
//用来获取串口的名字
QString SPComm::portName() const
{
return m_portName;
}
//设置波特率 9600 19200 38400
void SPComm::setBaudRate(int baudRate)
{
m_baudRate = baudRate;
}
//用来打开串口,调用前,先设置串口名字和波特率
bool SPComm::open()
{
if (m_serialPort->isOpen())
{
return true;
}
m_serialPort->setPortName(m_portName);
m_serialPort->setBaudRate(getBaudRate(m_baudRate));
m_serialPort->setParity(QSerialPort::NoParity);
m_serialPort->setDataBits(QSerialPort::Data8);
m_serialPort->setStopBits(QSerialPort::OneStop);
m_serialPort->setFlowControl(QSerialPort::NoFlowControl);
m_serialPort->setReadBufferSize(1024);
return m_serialPort->open(QSerialPort::ReadWrite);
}
//用来关闭串口
void SPComm::close()
{
if (m_serialPort->isOpen())
{
m_serialPort->close();
}
}
//重启串口,清楚数据
bool SPComm::clear()
{
if (m_serialPort->isOpen())
{
m_serialPort->clear();
this->close();
return this->open();
}
return false;
}
//用来接收串口发来的数据
int SPComm::readData(char *buffer, int count, int timeout)
{
int len = 0;
forever
{
int n = m_serialPort->read(&buffer[len], count - len);
if (n == -1)
{
return -1;
}
else if (n == 0 && !m_serialPort->waitForReadyRead(timeout))
{
return -2;
}
else
{
len += n;
if (count == len)
break;
}
}
return len;
}
//发送数据到串口 比如发送协议
int SPComm::writeData(char *data, int size)
{
int len = 0;
forever
{
int n = m_serialPort->write(&data[len], size - len);
if (n == -1)
{
return -1;
}
else
{
len += n;
if (size == len)
break;
}
}
return len;
}
//别忘记了
//构造函数 添加初始化数据
SPComm::SPComm(QObject *parent) : QObject(parent)
{
m_serialPort = new QSerialPort();
m_baudRate = 9600;
m_portName = "";
}
//析构的时候 删除 数据
SPComm::~SPComm()
{
delete m_serialPort;
}
不知道是要在pro文件中添加什么呢?
在Pro中加上QT += serialport
可能是你只是在.h文件中声明了bool isOpen() const;而没有在.cpp文件中定义它。