zoukankan      html  css  js  c++  java
  • Qt 串口操作

    引用串口

    • .pro文件中添加QT += serialport语句。

    • 添加头文件

    #include <QSerialPort>
    #include <QSerialPortInfo>
    

    创建串口对象

    QSerialPort serial;
    

    初始化串口

    //设置串口名
    serial.setPortName("COM7");
    //设置波特率
    serial.setBaudRate(QSerialPort::Baud1152000);
    //设置数据位数
    serial.setDataBits(QSerialPort::Data8);
    //设置奇偶校验
    serial.setParity(QSerialPort::NoParity);
    //设置停止位
    serial.setStopBits(QSerialPort::OneStop);
    //设置流控制
    serial.setFlowControl(QSerialPort::NoFlowControl);
    //打开串口
    serial.open(QIODevice::ReadWrite);
    //清空缓存
    serial.flush();
    

    读写串口

    //读串口
    QByteArray buffer;
    buffer = serial.readAll();
    //写串口
    serial.write(buffer);
    

    关闭串口

    serial.close();
    

    读取随机数据

    由串口设备主动发出数据,通讯时间是不明确时,可以使用信号槽绑定串口读就绪信号,当有数据就绪时自动调用槽函数读取和处理。

    1. 创建串口对象后,为串口的读就绪信号添加一个槽函数。
    //连接信号和槽
    QObject::connect(&serial, &QSerialPort::readyRead, this, &MainWindow::serialPortReadyRead);
    
    
    1. 编写槽函数用于读取数据
    void MainWindow::serialPortReadyRead()
    {
        //读取数据
        QByteArray buffer = serial.readAll();
    
        //处理数据
        //……
    
    }
    

    读取响应数据

    这类通讯逻辑通常是主机发送指令给设备,设备接收指令并完成动作后返回数据。这种情况可以通过等待超时的方式进行数据接收,等待指令回复的时间根据具体情况设定,当第一次读取到数据后可再等待短暂的时间来确定消息是否被接收完毕。

    QByteArray MainWindow::serialPortRead(int ms)
    {
        QByteArray buffer;
    
        if(serial.waitForReadyRead(ms))
        {
            for (;;)
            {
                buffer += serial.readAll();
                if(!serial.waitForReadyRead(20))
                {
                    return buffer;
                }
            }
        }
    
        return NULL;
    }
    

    获取可用串口

    通过尝试以读写方式打开列表中的串口,如果能打开成功说明这个串口可用。

    QStringList MainWindow::GetEnableCommPort()
    {
        QStringList CommPortList;
    
        foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
        {
            QSerialPort serial;
            serial.setPort(info);
            if (serial.open(QIODevice::ReadWrite))
            {
                CommPortList.append(serial.portName());
                serial.close();
            }
        }
    
        return CommPortList;
    }
    
  • 相关阅读:
    iframe框架
    HTML 中 id与name 区别
    使用display:inline-block产生间隙
    html5新增语义化标签
    子选择器与后代选择器的区别
    各种居中问题
    腾讯 地图 机器学习岗 春招实习123面(猝)
    腾讯 微信春招nlp实习生一面二面(猝)
    264. Ugly Number II(丑数 剑指offer 34)
    263. Ugly Number(判断是否是丑数 剑指offer34)
  • 原文地址:https://www.cnblogs.com/llil/p/13435972.html
Copyright © 2011-2022 走看看