目录
一、前言
QextSerialPort是一个串口通信库,使QT4具有串口通信的功能。本例主要讲解QextSerialPort的一些使用方法和例程。
二、QextSerialPort的常用函数
串口设置:
setPortName(COM); //设置串口号,如COM2
setBaudRate(baud); //设置波特率
setDataBits(databits); //设置数据位
setParity(parity); //设置校验位
setStopBits(stopbits); //设置停止位
setFlowControl(flow); //设置流量控制
setTimeout(timeout); //设置延迟
读写:
readAll();
write(Data);
三、效果展示
虚拟串口工具的作用,就是建立一个COM2和COM12的虚拟通道来通讯。
四、源码分析
CSerial.h
#ifndef CSERIAL_H
#define CSERIAL_H
#include "./qextserial/qextserialport.h"
class CSerial : public QextSerialPort
{
public:
//默认构造函数,默认参数
explicit CSerial(
QString portName = "COM2",
BaudRateType baud = BAUD9600, \
DataBitsType databits = DATA_8, \
ParityType parity = PAR_NONE, \
StopBitsType stopbits = STOP_1, \
FlowType flow = FLOW_OFF, \
long timeout = 256);
~CSerial();
};
#endif // CSERIAL_H
CSerial.cpp
#include "CSerial.h"
#include <QDebug>
CSerial::CSerial(QString portName, BaudRateType baud, \
DataBitsType databits, ParityType parity, \
StopBitsType stopbits, FlowType flow, \
long timeout) :
QextSerialPort(portName, QextSerialPort::Polling)
{
open(QIODevice::ReadWrite);
setBaudRate(baud); //设置波特率
setDataBits(databits); //设置数据位
setParity(parity); //设置校验位
setStopBits(stopbits); //设置停止位
setFlowControl(flow); //设置流量控制
setTimeout(timeout); //设置延迟
qDebug() << QString("open serial port: %1").arg(portName);
}
CSerial::~CSerial()
{
}
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class CSerial;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
void recieveData();
private slots:
void timerEvent(QTimerEvent *event);
void stSendData();
private:
Ui::MainWindow *ui;
CSerial *m_pSerial;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "CSerial.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_pSerial = new CSerial();
connect(ui->Btn_Send, SIGNAL(clicked()), this, SLOT(stSendData()));
//定时器
startTimer(10);
}
MainWindow::~MainWindow()
{
if(m_pSerial != NULL)
{
//析构时要断开串口, 防止占用析构失败
if(m_pSerial->isOpen())
{
m_pSerial->close();
}
delete m_pSerial;
m_pSerial = NULL;
}
delete ui;
}
void MainWindow::timerEvent(QTimerEvent *event)
{
//接收数据
QByteArray readArray = m_pSerial->readAll();
if(!readArray.isEmpty())
{
ui->textEdit_Receive->append("[Reveive]:" + readArray);
}
}
void MainWindow::stSendData()
{
//发送数据
QByteArray sendArray = ui->textEdit_SendBuf->toPlainText().toAscii();
int sendLen = m_pSerial->write(sendArray);
if(sendLen == sendArray.size())
{
ui->textEdit_Send->append("[Send]:" + sendArray);
}
}
五、Demo/相关包
VSPD虚拟串口工具(百度云盘):
链接:https://pan.baidu.com/s/110CS49jaGgJ4Q11NEWKbjQ
提取码:uko3
源码Demo:
链接:https://pan.baidu.com/s/1V1tXGAQGgfF6wUslzKH_uA
提取码:cjq5