QT实例 - 实现串口通信

QT做一个串口通信工具

原文链接:https://blog.csdn.net/hwc3737/article/details/108365795

添加依赖:

①在项目的.pro文件中添加:

QT += serialport

②引入相关头文件

#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>

实现步骤:

①要进行串口通信,第一步一定是搜索可用串口咯,可参考下列实例,搜索当前可用串口并将其输出到一个QComboBox上。
void Widget::on_btn_work_renew_sperial_clicked()
{
    ui->cbox_sperial->clear();		//每次搜索前必将ComboBox清除,否则会导致叠加。
    //遍历找到所有可用串口
    foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        QSerialPort findSerial;
        findSerial.setPort(info);
        if(findSerial.open(QIODevice::ReadWrite))
        {
            ui->cbox_sperial->addItem(findSerial.portName());	//每找到一个便添加至ComboBox
            findSerial.close();
        }
    }
	//最后通过判断ComboBox的项数,若为0则提示未找到串口
    if(ui->cbox_sperial->count() == 0) {
        QMessageBox::information(this, "提示", "未找到可用串口", "确定");
    }
}
②定义一个串口对象,作为主窗口的私有成员对象
QSerialPort *serialport;
③开启串口实现函数
void Widget::openSperial()
{
	//判断ComboBox是否未选中任何项,即没有可用串口,则进行提示并跳出函数
    if(ui->cbox_sperial->currentText().isEmpty()){
        QMessageBox::warning(this, "提示", "未选中任何可用串口", "确定");
        return;
    }
    
    //新建对象
    this->serialport = new QSerialPort;

    //设置串口名
    serialport->setPortName(ui->cbox_sperial->currentText());	//获取界面ComboBox选中的值
    //打开串口读写功能
    serialport->open(QIODevice::ReadWrite);
    //设置波特率
    serialport->setBaudRate(9600);
    //设置数据位
    serialport->setDataBits(QSerialPort::Data8);	//其他可选值有QSerialPort::Data7、QSerialPort::Data6、QSerialPort::Data5
    //设置校验位
    serialport->setParity(QSerialPort::NoParity);	//即无校验,其他可选值有QSerialPort::OddParity(奇校验)、QSerialPort::EvenParity(偶校验)
    //设置停止位
    serialport->setStopBits(QSerialPort::OneStop);	//1位停止位,其他可选值有QSerialPort::TwoStop(2位停止位)
    //设置不启用流控制
    serialport->setFlowControl(QSerialPort::NoFlowControl);

    //绑定数据接收信号,每次接收到数据则触发Read_Data槽函数
    QObject::connect(serialport, SIGNAL(readyRead()), this, SLOT(Read_Data()));
}
④发送数据
void Widget::on_btn_send_data_clicked()
{
	//要发送的数据
	QString data = "hello";
    QByteArray buf;
    bool ok;
    char send16 = data.toInt(&ok,16)&0xFF;		//将数据转换成16进制
    
    if(ok){//转换成功
        //发送过程中禁用关闭串口按钮,保证数据发送时串口不会被意外中断
        ui->btn_sperial_out->setEnabled(false);

        buf = &send16;
        buf.append("\r\n");
        serialport->write(buf);

        //重新启用关闭按钮
        ui->btn_sperial_out->setEnabled(true);
    }else {
        QMessageBox::critical(this, "提示", "数据转换失败", "确定");
    }
}
⑤接收数据
void Widget::Read_Data()
{
    QByteArray buf;
    buf = serialport->readAll();
    qDebug()<<buf;
}

本文为作者从实际项目中脱离出来的总结,仅供参考,亲测可稳定运行。
若有发现问题,欢迎留言补充。
转载请注明出处。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值