前言
Qt框架式一个可以用c++语言来开发的框架,对于嵌入式开发来说,Qt框架可以用来开发上位机,用来对设备进行操纵,也可以用来开发图形界面,当做Linux系统的gui。所以说,基于Qt框架来开发软件,是嵌入式工程师必备的一项技能。
这里写的是一款所有嵌入式工程师都要用到的软件,串口调试工具。这里我是用c++写的,我写的功能比较简陋,也就只有串口收发之类的简单功能。对比一些成熟的串口调试工具肯定是不如的,但是不妨当作练手的小项目。
一、功能设计
项目要实现什么功能,最好在一开始就能定下来,写起来也方便,bug也少。
在实际开发中,很多时候都会在写完后加需求,或者在项目进行中加需求,这很麻烦,因为会打乱事先设计好的软件框架。
1串口接收数据
2串口发送数据
3带有时间戳
4不论是收发都能在窗口看到
5能设置波特率、数据网、验证位、停止位等功能
6能把接收数据转化为十六进制或者ascii字符格式
二、UI布局
创建widget任务,先把UI界面弄好,Qt提供了方便快速的界面设计方式,很多东西用代码来实现是很复杂的,既麻烦,效果还不好。
直接在widget里,用拖动控件的方法,很容易就把这个UI搞好了。
也就用到了几个很基础的控件,pushbutton、textedit、tatel、checkbox。
三、写代码
widget.cpp中的代码,注释都差不多写了。
就是有个奇怪的问题,本来想改个背景图片,变得好看点的,但加入图片之后,运行就会变得很卡,也不知道为什么。
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QMessageBox>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
resize(750,500);//窗口大小
QPixmap pixmap(":/image/image/yp.jpg"); // 加载图片
QPalette palette;
palette.setBrush(this->backgroundRole(), QBrush(pixmap.scaled(this->size(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation))); // 调整图片大小以适应窗口大小
this->setPalette(palette); // 设置调色板
this->setAutoFillBackground(true); // 自动填充背景
ui->textEdit->setStyleSheet("QTextEdit { background-color: rgba(255, 255, 255, 128); }");
ui->textEdit_2->setStyleSheet("QTextEdit { background-color: rgba(255, 255, 255, 128); }");
setWindowTitle("串口调试助手(●′ω`●)");//窗口标题
time1= new QTimer(this);
serial=new QSerialPort(this);
time1->start(500);//开启一个200ms的定时器
connect(time1,&QTimer::timeout,this,&Widget::timerEvent);//时间到后,发出timeout信号,触发槽函数timerevent
ui->comboBox_2->setCurrentIndex(4);
ui->comboBox_3->setCurrentIndex(3);
ui->comboBox_4->setCurrentIndex(2);
ui->comboBox_5->setCurrentIndex(0);
rx_len=0;
tx_len=0;
connect(serial,QSerialPort::readyRead,this,&Widget::serial_port);//当串口有数据时,转到槽
ui->checkBox->setCheckState(Qt::Checked);//默认选中ascii
}
Widget::~Widget()
{
delete ui;
}
void Widget::timerEvent()
{
QStringList newPortStringList;//创建容器
newPortStringList.clear();
foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())//foreach关键字,遍历列表,放到info中
{
newPortStringList+=info.portName();//将可用串口的名字放到字符串容器中
//qDebug()<<newPortStringList;
}
if(newPortStringList.size()!=PortStringList.size())
{
PortStringList=newPortStringList;//PortStringList是私有成员,是全局的,保存上一次的串口名字
ui->comboBox->clear();//将下拉栏清空
ui->comboBox->addItems(PortStringList);//上次串口名字加入
}</


5725

被折叠的 条评论
为什么被折叠?



