Qt之打印机串口
-
新建一个Qt项目:
文件->新建文件或项目(ctrl+n)
-
单机 choose 之后
-
全部下一步到完成
-
成功建立一个Qt Widgets Application
-
新建一个管理SerialPort的类 右击项目名字->添加新文件 弹出 如下框:
-
选择C++ Class,单机 choose 弹出如下框: 并填写 单机下一步 之后 单机完成
-
编写SPComm类:
在SPComm.h中加入头文件
#include <QtSerialPort/QtSerialPort>
-
在头文件中 声明串口功能:
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;
-
在CPP文件中实现对应的功能:
//这个函数用来设置波特率,打开串口的时候用到
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;
}
-
串口类编写完成:
测试一下能否调用:
1.双击mainwindow.ui
-
切换到了设计模式:
2 拖入按钮
-
3 双击按钮,设置按钮的名字
-
4设置好按钮的名字为 <打开串口>
5右击按钮->转到曹->选择clicked()->点击OK
跳转到了 一下界面
-
为这个按钮添加功能代码:
首先在mainwindow.h中添加SPComm.h的头文件
-
在mainwindow.h头文件中,添加这行代码 SPComm *m_spcomm;
private:
Ui::MainWindow *ui;
SPComm *m_spcomm;
在mainwindow.cpp的构造函数中
-
添加 m_spcomm = new SPComm();
析构函数中
添加delete m_spcomm;
-
双击mainwindow.cpp 回到按钮那里添加功能
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() << "关闭串口成功";
}
-
点击 按钮 编译 并且运行成
-
如果想编写一个打印机串口程序
根据以上步骤 同理
添加一个Printer类
根据协议编发送指令,写打印机的功能。
比如发送协议 进行 切纸 换行 打印数据