Qt笔记---使用QSerialPort开发串口程序

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 : 处理串口数据
    }
}

如果是高频率的串口数据接收,使用多线程处理接收的数据和解析。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值