Qt笔记-使用QSerialPort开发串口程序
在Qt项目中开发串口通信程序,可以使用Qt中用于开发串口的类QSerialPort。
使用方法
使用该类需要在pro文件中添加该模块。
QT += serialport
在要使用的文件中包含QSerialPort和QSerialPortInfo两个头文件。
其中QSerialPortInfo类用于获取可连接的串口列表,QSerialPort类用于创建串口连接,收发数据。
SerialPortService.h
class SerialPortService : public QObject
{
Q_OBJECT
public:
explicit SerialPortService(QObject *parent = 0);
/**
* @brief findEnablePort : 查找可用的串口号
* @return : 串口号
*/
QStringList findEnablePort();
/**
* @brief setSerialPort : 设置串口数据
* @param port : 串口号
* @param BaudRate : 波特率
* @return : true为设置成功,false为设置失败
*/
bool setSerialPort(const QString &port, const QString &BaudRate);
/**
* @brief isOpen : 判断串口是否打开
* @return : true为串口已打开,false为串口未打开
*/
bool isOpen();
/**
* @brief closePort : 关闭串口
* @return : true为串口关闭成功,false为串口关闭失败
*/
bool closePort();
/**
* @brief sendCmd : 向串口发送数据
* @param cmd : 要发送的数据
* @return : true发送成功,false发送失败
*/
bool sendCmd(const QByteArray &cmd);
private slots:
// 接收串口数据
void onReadMsg();
private:
// 串口对象
QSerialPort *m_serialPort;
};
SerialPortService.cpp
SerialPortService::SerialPortService(QObject *parent) : QObject(parent)
{
m_serialPort = new QSerialPort;
}
QStringList SerialPortService::findEnablePort()
{
QStringList listPort;
// 获取所有串口列表
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
QSerialPort serial;
serial.setPort(info);
// 添加能够打开的串口,否则被占用
if(serial.open(QIODevice::ReadWrite))
{
listPort.append(serial.portName());
serial.close();
}
}
return listPort;
}
bool SerialPortService::setSerialPort(const QString &port, const QString &BaudRate)
{
if(!m_serialPort)
return false;
m_serialPort->setPortName(port);
if(m_serialPort->open(QIODevice::ReadWrite))
{
// 设置波特率
m_serialPort->setBaudRate(BaudRate.toInt());
// 设置数据位8
m_serialPort->setDataBits(QSerialPort::Data8);
// 设置校验位
m_serialPort->setParity(QSerialPort::OddParity);
// 设置停止位1
m_serialPort->setStopBits(QSerialPort::OneStop);
// 设置为无流控制
m_serialPort->setFlowControl(QSerialPort::NoFlowControl);
// 连接接收串口数据的槽函数
connect(m_serialPort, SIGNAL(readyRead()), this, SLOT(onReadMsg()), Qt::DirectConnection);
return true;
}
return false;
}
bool SerialPortService::isOpen()
{
if(NULL == m_serialPort)
return false;
return m_serialPort->isOpen();
}
bool SerialPortService::closePort()
{
if(NULL == m_serialPort)
return false;
m_serialPort->close();
return true;
}
bool SerialPortService::sendCmd(const QByteArray &cmd)
{
if(m_serialPort)
{
if(!isOpen())
return false;
if(m_serialPort->write(cmd) == cmd.size())
return m_serialPort->flush(); // 立刻发送
else
return false;
}
return false;
}
void SerialPortService::onReadMsg()
{
QByteArray recByteArray = m_serialPort->readAll();
int len = recByteArray.size();
if(len > 0)
{
// TODO : 处理串口数据
}
}
如果是高频率的串口数据接收,使用多线程处理接收的数据和解析。