Qt系列——TCPWIFI串口工具的制作

Posted 何以问天涯

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt系列——TCPWIFI串口工具的制作相关的知识,希望对你有一定的参考价值。

一、简介

本文章实现TCP、WIFI、串口工具的功能开发,这样方便与单片机MCU进行上下位机相互通信调试。
实现的TCP连接界面如下:
在这里插入图片描述
实现的WiFi界面如下:
在这里插入图片描述
实现的串口调试界面如下:
在这里插入图片描述

二、核心代码之路

所实现的TCP连接核心代码

点击连接按钮

//===================================================================================
// 函数名称 | on_btnConnectTcp_clicked()
//-----------------------------------------------------------------------------------
// 函数输入 |
//-----------------------------------------------------------------------------------
// 函数功能 | 建立连接
//-----------------------------------------------------------------------------------
// 返回值为 |
//-----------------------------------------------------------------------------------
// 函数作者 | xt
//===================================================================================
void DialogTcpClient::on_btnConnectTcp_clicked()
{
    if(!m_isEnter)//进入
    {
        ui->textEditRead->clear();
        //获取服务器的ip和端口
        QString strIP = ui->ledAddress->text();
        qint16 port = ui->ledPort->text().toInt();

        if(ui->ledPort->text()=="")
        {
            QMessageBox::information(this,tr("error"),tr("Server Port is wrong!"));
            return;
        }
        if(!m_serverIp->setAddress(strIP))//IP是否正确解析
        {
            QMessageBox::information(this,tr("error"),tr("Server IP address is wrong!"));
            return;
        }

        //1、----分配空间,指定父对象
        m_tcpSocket = new QTcpSocket();

        ui->textEditRead->setText("建立连接中...");

        //2、----建立好连接
        connect(m_tcpSocket,SIGNAL(connected()),this,SLOT(slotConnecting()));

        //3、----获取对方发送的内容
        connect(m_tcpSocket,SIGNAL(readyRead()),this,SLOT(slotDataReceived()));


        //4、----断开链接
        connect(m_tcpSocket,SIGNAL(disconnected()),this,SLOT(slotDisconnected()));

        //5、----主动和服务器建立连接
        m_tcpSocket->connectToHost(*m_serverIp,port);
        ui->btnConnectTcp->setText(tr("断开"));
        m_isEnter = true;
    }
    else
    {
        ui->btnConnectTcp->setText(tr("连接"));
        if(NULL == m_tcpSocket) return ;

        //主动和客户端端口断开连接
        m_tcpSocket->disconnectFromHost();
        m_tcpSocket->close();
        delete m_tcpSocket;
        m_tcpSocket = NULL;
        m_isEnter=false;
        ui->textEditRead->clear();

    }
}

建立握手连接信号,如果connected,触发连接成功信号:

//===================================================================================
// 函数名称 | slotConnecting()
//-----------------------------------------------------------------------------------
// 函数输入 |
//-----------------------------------------------------------------------------------
// 函数功能 | 建立连接中
//-----------------------------------------------------------------------------------
// 返回值为 |
//-----------------------------------------------------------------------------------
// 函数作者 | xt
//===================================================================================
void DialogTcpClient::slotConnecting()
{
    ui->btnSend->setEnabled(true); //发送按钮使能
    IconHelper::Instance()->SetSvg(ui->labWIFI,"./Resources/SVG/WiFi-On.svg",25);
    ui->textEditRead->append("成功和服务器建立连接");
}

获取套接字:

//===================================================================================
// 函数名称 | slotDataReceived()
//-----------------------------------------------------------------------------------
// 函数输入 |
//-----------------------------------------------------------------------------------
// 函数功能 | 数据接收,从套接字将有效数据显示
//-----------------------------------------------------------------------------------
// 返回值为 |
//-----------------------------------------------------------------------------------
// 函数作者 | xt
//===================================================================================
void DialogTcpClient::slotDataReceived()
{

    while(m_tcpSocket->bytesAvailable()>0)
    {
        unsigned short uint_Len = m_tcpSocket->bytesAvailable();
        if(uint_Len>N_COMMU_BUF)
        {
            QMessageBox::information(NULL,"slotDataReceived","数组长度超标!");
            return;
        }
        BYTE auch_Bytes[N_COMMU_BUF];
        m_tcpSocket->read((char *)auch_Bytes,uint_Len);
       
    }

    
}

监测断开连接信号:

//===================================================================================
// 函数名称 | slotDisconnected()
//-----------------------------------------------------------------------------------
// 函数输入 |
//-----------------------------------------------------------------------------------
// 函数功能 | 断开连接
//-----------------------------------------------------------------------------------
// 返回值为 |
//-----------------------------------------------------------------------------------
// 函数作者 | xt
//===================================================================================
void DialogTcpClient::slotDisconnected()
{
    ui->btnSend->setEnabled(false); //发送按钮失效
    IconHelper::Instance()->SetSvg(ui->labWIFI,"./Resources/SVG/WiFi-Off.svg",25);
    IconHelper::Instance()->SetSvg(ui->labCRC,"./Resources/SVG/CRC_Wrong.svg",20);
}

TCP写入函数

m_tcpSocket->write((char*)puch_NewBigBuf,uin_NewSize);

串口连接代码

初始化串口端口搜寻:

//===================================================================================
// 函数名称 | InitConnect()
//-----------------------------------------------------------------------------------
// 函数输入 |
//-----------------------------------------------------------------------------------
// 函数功能 | 初始连接
//-----------------------------------------------------------------------------------
// 返回值为 |
//-----------------------------------------------------------------------------------
// 函数作者 | xt
//===================================================================================
void Frm_Usart1::InitConnect()
{
    //----搜索串口名称
    foreach(const QSerialPortInfo &itPortInfo,QSerialPortInfo ::availablePorts()) //搜索串口,并添加到选项上供使用者选择
    {
        QSerialPort CurrentPort;
        CurrentPort.setPort(itPortInfo);
        if(CurrentPort.open(QIODevice::ReadWrite))
        {
            ui->comBoxPort->addItem(CurrentPort.portName());//插入串口的名字
            CurrentPort.close();   //先开再关,把串口名称先导入
        }

    }
}

连接按钮:

//===================================================================================
// 函数名称 | UpdateUsartParam()
//-----------------------------------------------------------------------------------
// 函数输入 |
//-----------------------------------------------------------------------------------
// 函数功能 | 连接重新赋值参数
//-----------------------------------------------------------------------------------
// 返回值为 |
//-----------------------------------------------------------------------------------
// 函数作者 | xt
//===================================================================================
void Frm_Usart1::UpdateUsartParam()
{
    on_btnCleanRxArea_clicked();
    m_CurrentPort = new QSerialPort;

    //设置串口名
    m_CurrentPort->setPortName(ui->comBoxPort->currentText());
    //设置波特率
    m_CurrentPort->setBaudRate(seriaBaudRateList[ui->comBoxBaudRate->currentIndex()],QSerialPort::AllDirections);
    //设置数据位数
    m_CurrentPort->setDataBits(seriaDataBitsList[ui->comBoxDateBits->currentIndex()]);
    //设置奇偶校验
    m_CurrentPort->setParity(seriaParityList[ui->comBoxParity->currentIndex()]);
    //设置停止位
    m_CurrentPort->setStopBits(seriaStopBitsList[ui->comBoxStopBits->currentIndex()]);
    //设置流控制
    m_CurrentPort->setFlowControl(QSerialPort::NoFlowControl);
    //打开串口
    m_CurrentPort->open(QIODevice::ReadWrite);

    if(m_CurrentPort->isOpen())
    {
        UpdateTexEditArea("Succeesfully open the Port ");

        //关闭设置菜单使能
        ui->comBoxPort->setEnabled(false);
        ui->comBoxBaudRate->setEnabled(false);
        ui->comBoxDateBits->setEnabled(false);
        ui->comBoxParity->setEnabled(false);
        ui->comBoxStopBits->setEnabled(false);
        ui->btnConnect->setText("断开");
        ui->btnSend->setEnabled(true);
        ui->widget_LedButton->setLightRed();
    }
    else
    {
        UpdateTexEditArea("Failed to open serial port");
    }

    //连接信号槽
    QObject::connect(m_CurrentPort, &QSerialPort::readyRead, this, &Frm_Usart1::slotReadData);
}

断开连接:

//===================================================================================
// 函数名称 | DisConnectUsart()
//-----------------------------------------------------------------------------------
// 函数输入 |
//-----------------------------------------------------------------------------------
// 函数功能 | 关闭串口
//-----------------------------------------------------------------------------------
// 返回值为 |
//-----------------------------------------------------------------------------------
// 函数作者 | xt
//===================================================================================
void Frm_Usart1::DisConnectUsart()
{
    m_CurrentPort->clear();
    m_CurrentPort->close();
    m_CurrentPort->deleteLater();

    UpdateTexEditArea("Serial connection has been disconnected");
    //恢复设置使能
    ui->comBoxPort->setEnabled(true);
    ui->comBoxBaudRate->setEnabled(true);
    ui->comBoxDateBits->setEnabled(true);
    ui->comBoxParity->setEnabled(true);
    ui->comBoxStopBits->setEnabled(true);
    ui->btnConnect->setEnabled(true);
    ui->btnConnect->setText("连接");
    ui->btnSend->setEnabled(false);
    ui->widget_LedButton->setGray();


}

发送字节

//===================================================================================
// 函数名称 | SendingProcess()
//-----------------------------------------------------------------------------------
// 函数输入 |PC要发送的字节
//-----------------------------------------------------------------------------------
// 函数功能 | 发送处理流程
//-----------------------------------------------------------------------------------
// 返回值为 |
//-----------------------------------------------------------------------------------
// 函数作者 | xt
//===================================================================================
void Frm_Usart1::SendingProcess(QByteArray byte_SendBuf)
{
    if(NULL == m_CurrentPort) return;
    m_CurrentPort->write(byte_SendBuf);
    m_ulTxCount += byte_SendBuf.count();
    ui->labTxByte->setText(QString::number(m_ulTxCount));
}

以上是关于Qt系列——TCPWIFI串口工具的制作的主要内容,如果未能解决你的问题,请参考以下文章

Qt系列——TCPWIFI串口工具的制作

Qt系列——TCPWIFI串口工具的制作

Qt 开源串口工具serialplot

Linux&imx6ull 使用QT开发串口工具(完整版)

一个基于QT的开源串口调试工具

一个基于QT的开源串口调试工具