• qt实现ubuntu下使用模拟串口进行虚拟机与本机串口收发调试


    本练习适合刚接触QT的小伙伴,大佬略过。

    先上成果图:

    首先使用串口模拟工具模拟出两个虚拟串口出来:

     本机com1虚拟机com2,将虚拟机的串口打开设置为com2:

    然后进入Linux终端中查看目前插入设备的信息:

    dmesg |grep ttys*

     接着将设备权限改为777(任何用户可读可写可执行,我这边是已知ttyS1是com2口,如果不知道自己挨个试一下即可。)

    sudo chmod 777 /dev/ttyS1

    最后附上部分qt代码:

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    #include <QDebug>
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        SerialPort = new QSerialPort();
        serialInit();
        connect(SerialPort,SIGNAL(readyRead()),this,SLOT(serialRead()));
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    //界面加载时刷新界面相应控件信息
    void MainWindow::serialInit()
    {
        ui->cboPort->clear();
        //读取串口信息
        foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
        {
    
    //        if(!info.portName().contains("USB"))
    //            continue;
    
            qDebug() << info.portName();
            //自动读取串口号添加到端口下拉框中
            QSerialPort serial;
            serial.setPort(info);
            if(serial.open(QIODevice::ReadWrite))
            {
                qDebug() << "open success";
                ui->cboPort->addItem(info.portName());
    //            serial.close();
            }
            else {
              qDebug() << "open fail";
            }
    
    
            QStringList baudList;//波特率
            QStringList parityList;//奇偶校验
            QStringList dataBitList;//数据位
            QStringList stopBitList;//停止位
    
            baudList<<"1200"<<"2400"<<"4800"<<"9600"
                   <<"14400"<<"19200"<<"38400"<<"56000"
                  <<"57600"<<"115200";
            ui->cboBaud->addItems(baudList);
            ui->cboBaud->setCurrentIndex(3);
    
            parityList<<("None")<<("Odd")<<("Even");
            ui->cboVerify->addItems(parityList);
        }
    }
    //收到界面信号时执行的方法
    void MainWindow::serialRead()
    {
        QString strBuffer;
        //从缓冲区中读取数据
        QByteArray buffer = SerialPort->readAll();
        if(!buffer.isEmpty())//非空说明有数据接受
        {
            //转换成16进制大写
            QString str = buffer.toHex().data();
            str = str.toUpper();
            //一个16进制占4位,8位为一字节,所以每两位16进制空一格
            for(int i=0;i<str.length();i+=2)
            {
                qDebug() << "str.Length"+str.length();
                 qDebug() << "str"+str;
                QString strTem = str.mid(i,2);
                strBuffer +=strTem;
                strBuffer +=" ";
            }
            //读取之前显示数据
            QString receive = ui->txtRec->toPlainText();
            //清空显示
            ui->txtRec->clear();
            receive += QString(strBuffer);
            ui->txtRec->appendPlainText(receive);
        }
        buffer.clear();
    }
    
    void MainWindow::on_btnOpenSerial_clicked()
    {
        //打开串口
        if(ui->btnOpenSerial->text() == "打开串口")
        {
            //设置串口号
            SerialPort->setPortName(ui->cboPort->currentText());
    
            //打开串口
            if(SerialPort->open(QIODevice::ReadWrite))
            {
                //设置波特率
                SerialPort->setBaudRate(ui->cboBaud->currentText().toInt());
                //设置数据位数
                switch(ui->cboNumBit->currentIndex())
                {
                case 5:SerialPort->setDataBits(QSerialPort::Data5);break;
                case 6:SerialPort->setDataBits(QSerialPort::Data6);break;
                case 7:SerialPort->setDataBits(QSerialPort::Data7);break;
                case 8:SerialPort->setDataBits(QSerialPort::Data8);break;
                default:break;
                }
    
                //设置奇偶
                switch(ui->cboVerify->currentIndex())
                {
                case 0:SerialPort->setParity(QSerialPort::NoParity);break;
                case 1:SerialPort->setParity(QSerialPort::OddParity);break;
                case 2:SerialPort->setParity(QSerialPort::EvenParity);break;
                default:break;
                }
    
                //设置流控制
                SerialPort->setFlowControl(QSerialPort::NoFlowControl);
                //设置停止位
                switch(ui->cboStop->currentIndex())
                {
                case 1:SerialPort->setStopBits(QSerialPort::OneStop);
                case 2:SerialPort->setStopBits(QSerialPort::TwoStop);
                default:break;
                }
            }
            //打不开串口提示报错
            else
            {
                QMessageBox::about(NULL,"提示","串口无法打开\r\n不存在或已被占用");
                return ;
            }
    
            ui->btnOpenSerial->setText("关闭串口");
            //下拉菜单控件使能
            ui->cboBaud->setEnabled(false);
            ui->cboNumBit->setEnabled(false);
            ui->cboPort->setEnabled(false);
            ui->cboStop->setEnabled(false);
            ui->cboVerify->setEnabled(false);
    
            //发送按键使能
            ui->btnSend->setEnabled(true);
        }
        else
        {
            SerialPort->close();
            ui->btnOpenSerial->setText("打开串口");
            //下拉按键使能
            ui->cboBaud->setEnabled(true);
            ui->cboNumBit->setEnabled(true);
            ui->cboPort->setEnabled(true);
            ui->cboStop->setEnabled(true);
            ui->cboVerify->setEnabled(true);
    
            //发送按键使能
            ui->btnSend->setEnabled(false);
        }
    }
    
    void MainWindow::on_btnSend_clicked()
    {
        QByteArray data;
        //获取输入窗口sendData的数据
        QString strData = ui->txtSend->toPlainText();
        data = QByteArray::fromHex(strData.toLatin1().data());
        //写入发送缓冲区
        SerialPort->write(data);
    }
  • 相关阅读:
    【总结】设备树语法及常用API函数【转】
    【转】ios蓝牙开发学习笔记(四)ios蓝牙应用的后台处理 -- 不错
    SQL存储过程相关信息查看
    DBCC CHECKIDENT
    SQL CAST与CONVERT区别
    SQl查询数据库库名,表名、表的列名
    SQL语句资料
    SQL中rownum和order by的执行顺序的问题
    完整的ASP.NET存储过程分页,排序,鼠标移至变色
    最简单删除SQL Server中所有数据的方法(不用考虑表之间的约束条件,即主表与子表的关系)
  • 原文地址:https://www.cnblogs.com/jyj666/p/16090952.html
Copyright © 2020-2023  润新知