当前位置:   article > 正文

QT串口收发_qt串口通信的接收与发送

qt串口通信的接收与发送

串口扫描

将串口模块添加到工程中
在.pro文件中添加serialport
在这里插入图片描述
用到的头文件:

#include <QSerialPortInfo>
#include <QSerialPort>
  • 1
  • 2

QSerialPort类提供访问串口的功能,还可以通过QSerialPortInfo类获取可用串口的信息。
QSerialPortInfo类允许枚举系统中所有串口的信息,包括串口名称、系统位置、描述和制造商。
QSerialPortInfo::availablePorts();返回系统上可用串口的列表。


foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
			//这里只是临时读取可用串口不要在堆区直接开辟空间
	        QSerialPort port;
	        port.setPort(info);
	        //以可读可写的方式打开(临时打开,扫描可用串口)
	        if(port.open(QIODevice::ReadWrite))
	        {
	            //将扫描到的可用串口写入到comboBox里
	            ui->comboBox->addItem(port.portName());
	            //关闭串口
	            port.close();
	        }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
foreach(variable, container)”可以看到,foreach有两个参数:
container:容器,即被遍历的对象
variable:当前元素,即遍历container过程中,当前的那个元素
  • 1
  • 2
  • 3

在这里插入图片描述
声明QSerialPort成员变量
定义指针变量,用来承接在堆区开辟的对象,使之在全局范围内可用
在这里插入图片描述
在主窗口中实例化串口对象,和对可用串口进行扫描
在这里插入图片描述

配置串口信息

通过QSerialPort类型定义的串口对象 对串口参数设置
配置信息主要是在串口打开时设置的,所以我们可以设置在串口打开按钮槽函数里面

设置串口名称

void QSerialPort::setPortName(const QString &name)

  • 1
  • 2
//ui->comboBox->currentText()//是comboBox当前的文本内容
m_port->setPortName(ui->comboBox->currentText());
  • 1
  • 2

设置波特率

setBaudRate(qint32 baudRate, Directions directions = AllDirections)
baudRate:为int类型  的波特率
  • 1
  • 2
    m_port->setBaudRate(ui->comboBox_2->currentText().toInt());
    //ui->comboBox_2->currentText().toInt()//将comboBox_2当前文本内容转换为int
  • 1
  • 2

在这里插入图片描述

设置数据位

setDataBits(DataBits dataBits)
  • 1

DataBits的类型为:
在这里插入图片描述

//comboBox_4数据位comboBox
        //设置数据位
        switch (ui->comboBox_4->currentText().toInt())
        {
        case 8:
            m_port->setDataBits(QSerialPort::Data8);

            break;
        case 7:
            m_port->setDataBits(QSerialPort::Data7);
            break;
        case 6:
            m_port->setDataBits(QSerialPort::Data6);
            break;
        case 5:
            m_port->setDataBits(QSerialPort::Data5);
            break;
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

在这里插入图片描述

设置奇偶校验

在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。

bool setParity(Parity parity)
  • 1

在这里插入图片描述

        if(ui->comboBox_5->currentText() == tr("无"))
            m_port->setParity(QSerialPort::NoParity);
        else if(ui->comboBox_5->currentText() == tr("奇校验"))
            m_port->setParity(QSerialPort::EvenParity);
        else if(ui->comboBox_5->currentText() == tr("偶校验"))
            m_port->setParity(QSerialPort::OddParity);
        else if(ui->comboBox_5->currentText() == tr("空格"))
            m_port->setParity(QSerialPort::SpaceParity);
        else if(ui->comboBox_5->currentText() == tr("标记"))
            m_port->setParity(QSerialPort::MarkParity);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

在这里插入图片描述

设置停止位

bool  setStopBits(StopBits stopBits)
  • 1

在这里插入图片描述

        if(ui->comboBox_3->currentText() == tr("1"))
            m_port->setStopBits(QSerialPort::OneStop);
        else if(ui->comboBox_3->currentText() == tr("1.5"))
            m_port->setStopBits(QSerialPort::OneAndHalfStop);
        else if(ui->comboBox_3->currentText() == tr("2"))
            m_port->setStopBits(QSerialPort::TwoStop);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述

设置流控制

bool setFlowControl(FlowControl flowControl)
  • 1

在这里插入图片描述

        m_port->setFlowControl(QSerialPort::NoFlowControl);		//设置为无流控制
  • 1

设置读取数据的缓存大小

它的大小决定了串口收到数据后可以缓存的数据的大小,如果长时间不将数据从缓冲区取出来,会出现溢出丢数据的情况。所以这个缓存的大小可以根据实际的通信速度和数据量进行设置。

        m_port->setReadBufferSize(40960);
  • 1

打开串口

ReadWrite//可读可写
m_serialPort->open(QIODevice)
  • 1
  • 2

参数可以设置串口为只读、只写、读写三种方式。

串口打开并配置代码

这一过程我主要在串口打开按钮槽函数完成的

    m_port->setBaudRate(ui->comboBox_2->currentText().toInt());//设置波特率
    m_port->setPortName(ui->comboBox->currentText());
    if(m_port->open(QIODevice::ReadWrite))
    {
        //设置数据位
        switch (ui->comboBox_4->currentText().toInt())
        {
        case 8:
            m_port->setDataBits(QSerialPort::Data8);

            break;
        case 7:
            m_port->setDataBits(QSerialPort::Data7);
            break;
        case 6:
            m_port->setDataBits(QSerialPort::Data6);
            break;
        case 5:
            m_port->setDataBits(QSerialPort::Data5);
            break;
        }
        //设置停止位
        if(ui->comboBox_3->currentText() == tr("1"))
            m_port->setStopBits(QSerialPort::OneStop);
        else if(ui->comboBox_3->currentText() == tr("1.5"))
            m_port->setStopBits(QSerialPort::OneAndHalfStop);
        else if(ui->comboBox_3->currentText() == tr("2"))
            m_port->setStopBits(QSerialPort::TwoStop);
        //设置校验位
        if(ui->comboBox_5->currentText() == tr("无"))
            m_port->setParity(QSerialPort::NoParity);
        else if(ui->comboBox_5->currentText() == tr("奇校验"))
            m_port->setParity(QSerialPort::EvenParity);
        else if(ui->comboBox_5->currentText() == tr("偶校验"))
            m_port->setParity(QSerialPort::OddParity);
        else if(ui->comboBox_5->currentText() == tr("空格"))
            m_port->setParity(QSerialPort::SpaceParity);
        else if(ui->comboBox_5->currentText() == tr("标记"))
            m_port->setParity(QSerialPort::MarkParity);
        offAndOn(false);
        m_port->setFlowControl(QSerialPort::NoFlowControl);		//设置为无流控制
        m_port->setReadBufferSize(40960);
    }
    else {
       qDebug() << "串口打开失败";
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

串口接收数据

串口接收数据 是通过信号readyRead信号,接收串口数据

信号:readyRead信号
  • 1
//设置串口监听
    connect(m_port,SIGNAL(readyRead()),this,SLOT(ReadData()));
//ReadData()  //该槽函数需要用户自己完成
  • 1
  • 2
  • 3

设置接收监听
在这里插入图片描述
在这里插入图片描述
checkBox为:
在这里插入图片描述
textEdit为
在这里插入图片描述

void Widget::ReadData()
{
    //关闭串口
    QByteArray arr;
    //判断串口接收方式
    if(ui->checkBox->checkState())
    {
        arr = m_port->readAll().toHex();//将数据转换成16进制
    }
    else
    {
       arr = m_port->readAll();
    }
    ui->textEdit->append(arr);//将数据打印到textEdit
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

串口发送数据

textEdit_2为:
在这里插入图片描述
checkBox_2为:
在这里插入图片描述
checkBox_3为:
在这里插入图片描述

    QByteArray Data_1;
    //获取输入窗口sendData的数据
    QString Data = ui->textEdit_2->toPlainText();
    if(ui->checkBox_3->checkState())
    {
        Data+='\r';Data+='\n';
    }
    if(ui->checkBox_2->checkState())
    {
        Data_1 = QByteArray::fromHex(Data.toLatin1().data());//按十六进制编码发送
    }
    else
    {
        Data_1 = Data.toUtf8();//转换成utf8格式的字节流发送
    }

    // 写入发送缓存区
    m_port->write(Data_1);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

串口关闭

关闭应写在关闭槽函数中

    m_port->close();
    offAndOn(true);//自定义函数,
  • 1
  • 2

offAndOn自定义函数,使comboBox不可再选

void Widget::offAndOn(bool status)
{
    ui->comboBox->setEnabled(status);
    ui->comboBox_2->setEnabled(status);
    ui->comboBox_3->setEnabled(status);
    ui->comboBox_4 ->setEnabled(status);
    ui->comboBox_5 ->setEnabled(status);
}
status false不可选   true可选

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
ui->comboBox->clear();  //清空comboBox
  • 1

源码:

链接:https://pan.baidu.com/s/1zgz6evCmnVrMW0CzBcjkYQ?pwd=2178
提取码:2178

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/132955?site
推荐阅读
相关标签
  

闽ICP备14008679号