QT串口收发

  • 串口扫描
  • 配置串口信息
  • 设置串口名称
  • 设置波特率
  • 设置数据位
  • 设置奇偶校验
  • 设置停止位
  • 设置流控制
  • 设置读取数据的缓存大小
  • 打开串口
  • 串口打开并配置代码
  • 串口接收数据
  • 串口发送数据
  • 串口关闭
  • offAndOn自定义函数,使comboBox不可再选
  • 源码:


串口扫描

将串口模块添加到工程中

在.pro文件中添加serialport

qt android usb串口 qt 串口接收_开发语言


用到的头文件:

#include <QSerialPortInfo>
#include <QSerialPort>

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();
	        }
}
foreach(variable, container)”可以看到,foreach有两个参数:
container:容器,即被遍历的对象
variable:当前元素,即遍历container过程中,当前的那个元素

qt android usb串口 qt 串口接收_开发语言_02


声明QSerialPort成员变量

定义指针变量,用来承接在堆区开辟的对象,使之在全局范围内可用

qt android usb串口 qt 串口接收_串口_03


在主窗口中实例化串口对象,和对可用串口进行扫描

qt android usb串口 qt 串口接收_c++_04

配置串口信息

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

设置串口名称

void QSerialPort::setPortName(const QString &name)
//ui->comboBox->currentText()//是comboBox当前的文本内容
m_port->setPortName(ui->comboBox->currentText());

设置波特率

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

qt android usb串口 qt 串口接收_qt android usb串口_05

设置数据位

setDataBits(DataBits dataBits)

DataBits的类型为:

qt android usb串口 qt 串口接收_c++_06

//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;
        }

qt android usb串口 qt 串口接收_qt android usb串口_07

设置奇偶校验

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

bool setParity(Parity parity)

qt android usb串口 qt 串口接收_qt_08

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);

qt android usb串口 qt 串口接收_qt_09

设置停止位

bool  setStopBits(StopBits stopBits)

qt android usb串口 qt 串口接收_c++_10

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);

qt android usb串口 qt 串口接收_c++_11

设置流控制

bool setFlowControl(FlowControl flowControl)

qt android usb串口 qt 串口接收_串口_12

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

设置读取数据的缓存大小

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

m_port->setReadBufferSize(40960);

打开串口

ReadWrite//可读可写
m_serialPort->open(QIODevice);

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

串口打开并配置代码

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

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() << "串口打开失败";
    }

串口接收数据

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

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

设置接收监听

qt android usb串口 qt 串口接收_开发语言_13


qt android usb串口 qt 串口接收_串口_14


checkBox为:

qt android usb串口 qt 串口接收_qt android usb串口_15


textEdit为

qt android usb串口 qt 串口接收_qt_16

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
}

串口发送数据

textEdit_2为:

qt android usb串口 qt 串口接收_串口_17


checkBox_2为:

qt android usb串口 qt 串口接收_qt_18


checkBox_3为:

qt android usb串口 qt 串口接收_qt android usb串口_19

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);

串口关闭

关闭应写在关闭槽函数中

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

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可选
ui->comboBox->clear();  //清空comboBox

源码:

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