QT-手把手制作一个串口助手
新建工程
填写工程名字和路径。
然后一路下一步。最后版本控制选择无,点完成。
制作界面
主窗口
双击进入到UI界面。
按照这个界面进行拖动。该界面大概有5个不同的组件,接下来一个一个进行设置。
首先设置主窗口的大小,点击画布,然后到右下角的属性编译器里进行修改大小。
接收发送区
接放入第一个组件,并设置名字,大小。设置大小的方法的上面一样,设置为350*200。名字为text_rx
添加第二个组件,文本输入框。宽350高70。名字为text_tx
按键
添加第三个组件,按键。按照下图的位置放置按键。并双击修改上面显示的文字,注意不是修改名称。
修改个按键的名称从上到下,从左到右为:
左边依次为:key_Ref_com;key_Baud;key_led;key_hex_show;key_clear_rx;key_hex_tx;key_tx;
右边依次为:key_onoff_COM;key_char_show;key_char_tx;key_clear_tx。
修改按键的默认颜色:
下拉选择区
添加第四个组件,下拉输入。
名字为:com_com;com_Baud
双击波特率后面的那个框,填入常用的波特率选项。
标签
最后添加第五个组件,标签。用来显示发送和接收的字节个数。
名字为:tx_num;rx_num.
注意这里是四个便签RX,TX用来指示,他们后面都跟了一个,实际使用的是这两个。
现在让我们编译运行下。
可以看到出现的窗口和什么设置的一样。当然点每个按键都是不管用的,因为我们还没有写具体的代码,下面开始编写各按键的功能。
代码编写
1. 搜索串口
1.在usart_te.pro文件里添加串口库
QT += core gui serialport
2.在mainwindow.h文件里声明搜索串口函数。
3.在mainwindow.cpp文件里编写搜索函数。
添加头文件:
#include "QSerialPort" //串口头文件
#include "QSerialPortInfo" //串口信息
定义一个串口指针:
QSerialPort *COM = new QSerialPort(); //定义串口指针,实例化串口
void MainWindow::on_key_Ref_com_clicked()
{
ui->com_com->clear();
foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
{
ui->com_com->addItem(info.portName());
}
}
运行:
每点击一下刷新按键,就会进入一下该函数,首先会清除com_com下拉框的内容。然后寻找存在的串口,并放到com_com下拉框里。
2.开关串口
//按键 打开串口 点击函数
void MainWindow::on_key_onoff_COM_clicked()
{
//串口初始化
QSerialPort::BaudRate baudrate;//波特率
QSerialPort::StopBits stopbits;//停止位
QSerialPort::DataBits databits;//数据位
QSerialPort::Parity checkbits;//校验位
//停止位 1位
stopbits = QSerialPort::OneStop;
//校验位 无
checkbits = QSerialPort::NoParity;
//数据位 8位
databits = QSerialPort::Data8;
//波特率
if(ui->com_Baud->currentText() == "4800")
{
baudrate = QSerialPort::Baud4800;
}
else if(ui->com_Baud->currentText() == "9600")
{
baudrate = QSerialPort::Baud9600;
}
else if(ui->com_Baud->currentText() == "115200")
{
baudrate = QSerialPort::Baud115200;
}
else if(ui->com_Baud->currentText() == "19200")
{
baudrate = QSerialPort::Baud19200;
}
//串口属性初始化
COM->setPortName(ui->com_com->currentText());//端口的名字
COM->setBaudRate(baudrate);//设置波特率
COM->setStopBits(stopbits);//停止位
COM->setDataBits(databits);//数据位
COM->setParity(checkbits);//奇偶校验位
//串口操作 key_onoff_COM
if(ui->key_onoff_COM->text() == "打开串口")
{
if(COM->open(QIODevice::ReadWrite) == true) //判断是否打开了串口
{
ui->key_onoff_COM->setText("关闭串口"); //显示关闭串口
ui->key_led->setStyleSheet("background-color:red"); //led变红
}
else //串口打开不成功
{
QMessageBox::critical(this,"错误提示","打开串口失败!或其他错误。\r\n请选择正确的串口或串口被占用");
}
}
else
{
COM->close();//关闭串口
ui->key_onoff_COM->setText("打开串口"); //显示关闭串口
ui->key_led->setStyleSheet("background-color:rgb(232, 232, 232)");
}
}
记得在mainwindow.h文件里声明一下。
点击运行查看现象。
3.选择发送与显示的格式
发送:
在private:里定义一个发送模式的标志位,默认为0,字符串发送。
//修改发送方式 为char
void MainWindow::on_key_char_tx_clicked()
{
ui->key_char_tx->setStyleSheet("background-color: rgb( 149, 231, 85)");
rx_mode=0;
ui->key_hex_tx->setStyleSheet("background-color:rgb(232, 232, 232)");
}
//修改发送方式 为hex
void MainWindow::on_key_hex_tx_clicked()
{
ui->key_char_tx->setStyleSheet("background-color:rgb(232, 232, 232)");
rx_mode=1;
ui->key_hex_tx->setStyleSheet("background-color:rgb( 149, 231, 85)");
}
显示:
在private:里定义一个显示模式的标志位,默认为0,字符串显示。
//修改显示方式 为HEX
void MainWindow::on_key_hex_show_clicked()
{
ui->key_char_show->setStyleSheet("background-color:rgb( 232, 232, 232)");
showmode=1;
ui->key_hex_show->setStyleSheet("background-color:rgb( 149, 231, 85)");
}
//修改显示方式 为char
void MainWindow::on_key_char_show_clicked()
{
ui->key_char_show->setStyleSheet("background-color: rgb( 149, 231, 85)");
showmode=0;
ui->key_hex_show->setStyleSheet("background-color:rgb(232, 232, 232)");
}
默认:
默认为字符串发送和接收,在初始化的时候就先将这两个按键设置为绿色。
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->key_char_show->setStyleSheet("background-color: rgb(149, 231, 85)"); //默认为字符串显示
ui->key_char_tx->setStyleSheet("background-color: rgb(149, 231, 85)"); //默认为字符串发送
}
4.发送数据和记录发送数量
在private:里定义一个tx_num变量来记录发送了多少个数据。
//串口发送函数
void MainWindow::on_key_tx_clicked()
{
if(ui->key_onoff_COM->text() == "关闭串口")
{
if(tx_mode==1) //hex 发送
{
tx_num+= COM->write(QByteArray::fromHex( ui->text_tx->toPlainText().toLatin1()));
}
else if(tx_mode==0) //char发送
{
tx_num+= COM->write(ui->text_tx->toPlainText().toLatin1());//串口发送
}
ui->tx_num->setText(QString::number(tx_num));
}
else
{
QMessageBox::critical(this,"错误提示","请先打开串口");
}
}
5.接收数据和记录接收数量
同样在private:里定义一个rx_num变量来记录接收到的数据个数。
在MainWindow::MainWindow()函数里进行串口接收与函数的链接,当串口有数据接收时自动进入到关联的函数里运行。
connect(COM,SIGNAL(readyRead()),this,SLOT(RX_FUN()));//信号槽连接
//串口接收
void MainWindow::RX_FUN()
{
QByteArray buf; //接收缓冲区
buf = COM->readAll();//接收数据存到 buf 里
rx_num+=buf.size();
ui->rx_num->setText(QString::number(rx_num));
QString str;//字符变量
if(showmode == 0)
{
if(!buf.isEmpty()) //如果缓冲区非空
{
str=tr(buf); //将字节数组类型的数据转换成字符类型
ui->textBrowser->insertPlainText(str); //显示在显示区
ui->textBrowser->moveCursor(QTextCursor::End); //光标移动到最后一行
}
}
else
{
if(!buf.isEmpty()) //如果缓冲区非空
{
for(int i =0 ;i<buf.size() ;++i)
{
str += QString("%1 ").arg(buf[i] & 0xff,2,16,QLatin1Char('0'));
}
ui->textBrowser->insertPlainText(str); //显示在显示区
ui->textBrowser->moveCursor(QTextCursor::End); //光标移动到最后一行
}
}
}
6.清除接收区和发送区
这一部分比较简单当有对应按键点击时,进入到对应函数里,将数据清空即可。
清除接收区:
void MainWindow::on_key_clear_rx_clicked()
{
ui->textBrowser->clear(); //清除接收区
rx_num=0;
ui->tx_num->setText(QString::number(tx_num=0));
ui->rx_num->setText(QString::number(rx_num=0));
}
清除发送区:
//清除发送区
void MainWindow::on_key_clear_tx_clicked()
{
ui->text_tx->clear(); //清除发送区
}
结束
到此为止,关于用QT制作串口助手的步骤全部都结束了。
如果想将制作好的软件,在其他电脑上使用,可以参考我这篇文件,打包成EXE文件。
将QT打包成EXE文件
下一篇是在这篇文章的基础上做一个给单片机进行OTA升级的上位机。