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串口工具的制作的主要内容,如果未能解决你的问题,请参考以下文章