qt串口通信问题,向串口发送数据后,试用readall()读取不到数据
qt版本为qt5.5.1
先上代码:
问题是readAll()函数读不到串口数据,求解,谢谢了
--------------------------------------------------------------------
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include "spcomm.h"
#include <QMainWindow>
//#include <QtSerialPort/QtSerialPort>
#include <QSerialPort>
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 <QtSerialPort/QtSerialPort>
#include <QObject>
#include <QByteArray>
class SPComm : public QObject
{
Q_OBJECT
public:
void * memcpy(char *strDest, const char *strSrc, int Count);
explicit SPComm(QObject *parent = 0);
~SPComm();
bool isOpen();
void setPortName(const QString &name);//
QString portName();
virtual bool open();
void read(QByteArray *Data);
protected:
QString m_portName;//我的串口名
int m_baudRate;//我的波特率
QSerialPort *m_serialPort;//实例
signals:
public slots:
};
#endif // SPCOMM_H
------------------------------------------------------
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(this);
}
MainWindow::~MainWindow()
{
delete m_spcomm;
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
QString str ;
m_spcomm->setBaudRate(115200);//波特率
m_spcomm->setPortName("com1");//串口名
str = m_spcomm->portName();
ui->lineEdit->setText(str);
if(m_spcomm->open())
qDebug() << "打开串口成功";
else
{
qDebug() << "打开串口error";
}
}
void MainWindow::on_pushButton_2_clicked()
{
QByteArray Data;
m_spcomm->read(&Data);//调用read函数
qDebug()<<Data;//问题在这里输出为空
}
-----------------------------------------------------------------
spcomm.cpp
#include "spcomm.h"
//#include <Qstring.h>
//这个函数用来设置波特率,打开串口的时候用到
static QSerialPort::BaudRate getBaudRate(int baudRate)
{
switch (baudRate)
{
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()
{
return m_portName;
}
//用来打开串口,调用前,先设置串口名字和波特率
bool SPComm::open()
{
// if (m_serialPort->isOpen())
// {
// return true;
// }
//m_serialPort->setPortName(m_portName);
m_serialPort->setPortName(m_portName);
return m_serialPort->open(QSerialPort::ReadWrite);
}
void SPComm::read(QByteArray *Data)//把读取和写入放到一个函数中了
{
char send[] = {0x80,0x00,0x1A,0x80,0x06,0x00,0x06,0x03,0x0B,0x00,0x01,0xE8,0x48,0x01,0xC2,0x00,0x03,0x05,0x01,0x07,0x01,0x00,0x00,0x07,0xA9,0xDE};
m_serialPort->write(send, sizeof(send));
m_serialPort->flush();//这局结束发send中的数据
*Data=m_serialPort->readAll();//问题在这里!!!!这句读取串口数据在调试中为空,弄不清楚为何读不到,使用其他收数据工具发现这局结束会回复数据,但是我接不到,我尝试过屏蔽掉*Data=m_serialPort->readAll();及相关代码使用其他收数据工具发现这个函数结束串口也会把数据恢复出来,如果不屏蔽,这句之行结束数据被回复出来...
}
SPComm::SPComm(QObject *parent) : QObject(parent)
{
m_serialPort = new QSerialPort();
m_baudRate = 115200;
m_portName = "0";
}
//析构的时候 删除 数据
SPComm::~SPComm()
{
delete m_serialPort;
}
----------------------------------------------------
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}