POVLED 上位机 实现(1)串口功能

      软件总体为三个部分串口配置及数据收发、文件目录及文本读取、设备管理及文本数据发送。

串口部分实现使用了QT自带类 QSerialPort。

      界面用5个组合框分别配置COM口、波特率、检验位、数据位、停止位。外加一个状态显示、两个按键。

组合框内的参数需要与独立用户数据关联。代码部分我专门加了注释。

捕获

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);


    parameterInit();


}


MainWindow::~MainWindow()
{
    delete ui;
}


QStringList MainWindow::getPortNameList()
{
    QStringList serialPortNameList;
    foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
    {
        serialPortNameList << info.portName();
        qDebug() << "serialPortName:" << info.portName();
    }
    return serialPortNameList;
}


void MainWindow::parameterInit(void)
{


    m_portNameList = getPortNameList();      //检查可用COM口并填充到组合框
    ui->ComID->addItems(m_portNameList);
    //初始化波特率组合框并连接用户数据

    ui->ComSpeed->addItem(QStringLiteral("9600"), QSerialPort::Baud9600); 
    ui->ComSpeed->addItem(QStringLiteral("19200"), QSerialPort::Baud19200);
    ui->ComSpeed->addItem(QStringLiteral("38400"), QSerialPort::Baud38400);
    ui->ComSpeed->addItem(QStringLiteral("115200"), QSerialPort::Baud115200);
    //初始化数据位组合框并连接用户数据

    ui->ComBitCn->addItem(QStringLiteral("5"), QSerialPort::Data5);
    ui->ComBitCn->addItem(QStringLiteral("6"), QSerialPort::Data6);
    ui->ComBitCn->addItem(QStringLiteral("7"), QSerialPort::Data7);
    ui->ComBitCn->addItem(QStringLiteral("8"), QSerialPort::Data8);
    ui->ComBitCn->setCurrentIndex(3);
    //初始化检验位组合框

    ui->ComCkCode->addItem(tr("None"), QSerialPort::NoParity);
    ui->ComCkCode->addItem(tr("Even"), QSerialPort::EvenParity);
    ui->ComCkCode->addItem(tr("Odd"), QSerialPort::OddParity);
    ui->ComCkCode->addItem(tr("Mark"), QSerialPort::MarkParity);
    ui->ComCkCode->addItem(tr("Space"), QSerialPort::SpaceParity);
    //初始化停止位组合框

    ui->ComStopBit->addItem(QStringLiteral("1"), QSerialPort::OneStop);
    ui->ComStopBit->addItem(QStringLiteral("2"), QSerialPort::TwoStop);


    ui->ComDiscnt->setEnabled(true);
}


void MainWindow::srlPortTrMsg(void) //test
{
    const char *ptrdata = "12345";  //发送数据
    m_serialPort->write(ptrdata);
}


void MainWindow::srlPortRxMeg(void) //test
{
    QByteArray info = m_serialPort->readAll();  //接收并打印数据
    qDebug()<<"receive info:"<<info;
}


void MainWindow::on_ComConnect_clicked()
{
    m_serialPort = new QSerialPort();
    if(m_serialPort->isOpen())
    {
        m_serialPort->clear();
        m_serialPort->close();
    }
    //初始化串口对象

    m_serialPort->setPortName(ui->ComID->currentText());
    m_serialPort->setBaudRate(ui->ComSpeed->currentData().toInt());
    m_serialPort->setDataBits(QSerialPort::DataBits(ui->ComBitCn->currentData().toInt()));
    m_serialPort->setStopBits(QSerialPort::StopBits(ui->ComStopBit->currentData().toInt()));
    m_serialPort->setParity(QSerialPort::Parity(ui->ComCkCode->currentData().toInt()));
    m_serialPort->setFlowControl(QSerialPort::NoFlowControl);
    //打开串口

    if(!m_serialPort->open(QIODevice::ReadWrite))
    {
        qDebug() << "打开失败!";
        ui->ComState->setText("串口未打开");
        return;
    }
    //屏蔽配置组合框

    ui->ComID->setEnabled(false);
    ui->ComSpeed->setEnabled(false);
    ui->ComBitCn->setEnabled(false);
    ui->ComCkCode->setEnabled(false);
    ui->ComStopBit->setEnabled(false);
    ui->ComConnect->setEnabled(false);
    ui->ComDiscnt->setEnabled(true);


    qDebug() << "串口打开成功!";
    ui->ComState->setText("串口已打开");


    qDebug() << ui->ComID->currentText();
    qDebug() << ui->ComSpeed->currentData().toInt();
    qDebug() << QSerialPort::DataBits(ui->ComBitCn->currentData().toInt());
    qDebug() << QSerialPort::StopBits(ui->ComStopBit->currentData().toInt());
    qDebug() << QSerialPort::Parity(ui->ComCkCode->currentData().toInt());
    qDebug() << QSerialPort::NoFlowControl;
    //连接信号到数据接收

    connect(m_serialPort,SIGNAL(readyRead()),this,SLOT(srlPortRxMeg()));//test
}




void MainWindow::on_SendData_clicked() //test
{
    srlPortTrMsg();
}
   //关闭串口

void MainWindow::on_ComDiscnt_clicked()
{
    m_serialPort->close();
    m_serialPort->deleteLater();
    ui->ComID->setEnabled(true);
    ui->ComSpeed->setEnabled(true);
    ui->ComBitCn->setEnabled(true);
    ui->ComCkCode->setEnabled(true);
    ui->ComStopBit->setEnabled(true);
    ui->ComConnect->setEnabled(true);
    ui->ComDiscnt->setEnabled(false);
    ui->ComState->setText("串口已关闭");
    qDebug() << "串口已经关闭!";
}


#ifndef MAINWINDOW_H
#define MAINWINDOW_H


#include <QMainWindow>
#include <QSerialPort>
#include <QSerialPortInfo>




QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE


class MainWindow : public QMainWindow
{
    Q_OBJECT


public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    QStringList getPortNameList();
    void parameterInit();
    void srlPortTrMsg();
    //void srlPortRxMeg();
private slots:
    void on_ComConnect_clicked();


    void on_SendData_clicked();


    void srlPortRxMeg();


    void on_ComDiscnt_clicked();


private:
    Ui::MainWindow *ui;
    QSerialPort* m_serialPort; //串口类
    QStringList m_portNameList;
};
#endif // MAINWINDOW_H
posted @ 2021-04-10 02:02  steven_lg  阅读(195)  评论(0)    收藏  举报