文件工程网盘:
可执行文件:
链接:https://pan.baidu.com/s/1oyJDISwJZRfUjb4fhNl23w?pwd=f5de
提取码:f5de
--来自百度网盘超级会员V4的分享
项目工程(下面代码的具体位置可以跟着下面项目工程中的文件进行对比):
链接:https://pan.baidu.com/s/183MNSYEjDzN5uuz7TSD8tg?pwd=dc0k
提取码:dc0k
--来自百度网盘超级会员V4的分享
设计界面:
https://www.bilibili.com/video/BV1tp4y1i7EJ?p=10&vd_source=f738cb9bab54cc5b145b41cdb71328ee
实现逻辑功能:
QT上位机开发之串口助手(下)_哔哩哔哩_bilibili
将串口调试助手打包成windows端的软件:
https://www.bilibili.com/video/BV1tp4y1i7EJ?p=12&vd_source=f738cb9bab54cc5b145b41cdb71328ee第一次跟着视频做:
最终结果:
链接:https://pan.baidu.com/s/1bQ2fMhkrGrVOPuqnlZlS1A?pwd=ci5q
提取码:ci5q
--来自百度网盘超级会员V4的分享
第二次做:
首先画出界面,并且修改必要的控件名称,设置合理的布局,以及规定窗口和各个模块的大小,最后设置默认值:这一步可以对照着自己的设置进行对接,设置QComboBox的默认值时,首先选中控件QComboBox,然后选择下面的内容:
第二步就是实现逻辑功能:
参考文章:
第一步: 添加对应的模块,会用到串口模块:serialport所以添加上:
QT += core gui serialport
#第一步: 添加对应的模块,会用到串口模块:serialport所以添加上
第二步: 下面修改的代码中需要用到SerialPor头文件(类),这个头文件的作用可以帮助创建一个串口对象
#include <QSerialPort>
//第二步: 下面修改的代码中需要用到SerialPor头文件(类),这个头文件的作用可以帮助创建一个串口对象
第三步: 声明一个串口对象,串口对象的名称是serialport,在声明对象是要注意的是需要在类QSerialPort之后加一个*,不然会报错。
QSerialPort* serialport;
//第三步: 声明一个串口对象,串口对象的名称是serialport,在声明对象是要注意的是需要在类QSerialPort之后加一个*,不然会报错。
第四步: 在这里添加QString类。是为了在对应的cpp文件中使用对应的类型定义变量,在这里对应的是mywidget.cpp中的第9行,也就是QStringList SerialPortName;//在QT的形目工程文件中中进行注释,使用的是#,而在别的文件中使用的是//
#include <QString>
//第四步: 在这里添加QString类。是为了在对应的cpp文件中使用对应的类型定义变量,在这里对应的是mywidget.cpp中的第9行,也就是QStringList SerialPortName;
//第五步: 定义了一个字符串列表,list1: [ "Android", "Qt Creator"," ", "Java", "C++" ],List1是一个QStringList类型,//当List1显示时,就是以上面的信号是显示,并且,QStringList类型的变量添加内容是,可以通过不同方式:QStringList list;list << "Bill Murray" << "John Doe" ;
setWindowTitle("串口调试助手");#设置窗口的标题
QStringList SerialPortName;#声明一个字符串列表类型的对象
//第六步: 填写foreach()函数里面的参数,第一个参数是var,因为我们要得到的是串口的信息,所以选择定义串口的信息有关的
//变量info,并且取地址,第二个参数是容器,所以就是var在container中取出,这样var和container是相同类的
//不断地进行遍历,并且不断地将串口的名字添加到字符串列表SerialPortName中去,
//QSerialPortInfo::availablePorts(),可以在帮助中查到,这个函数的作用取得系统的可以获得的串口:Returns a list of available serial ports on the system.
//foreach(var,container)函数是用来遍历的,其中var是容器内的变量,container是容器,
foreach (const QSerialPortInfo &info,QSerialPortInfo::availablePorts()) {
SerialPortName<<info.portName();
}
//第七步:这个串口可以提供与串口相关的信息
#include <QSerialPortInfo> //第七步:这个串口可以提供与串口相关的信息
//第八步: 将获得的字符串列表SerialPortName中的信息加到SerialNameCb中去,在帮助中查找那个QComboBox的additems()函数
//因为加的是字符串列表类型,所以使用的是addItems()函数,void QComboBox::addItems(const QStringList &texts)
ui->SerialNameCb->addItems(SerialPortName);
//第九步; 创建了一个串口的对象serialport,这个对象之前就在mywidget.h文件中声明,这个对象的父类是窗口
serialport = new QSerialPort(this);
//第十步: 将openCb按钮转到槽,写函数
void MyWidget::on_OpenBtn_clicked() //第十步: 将openCb按钮转到槽,写函数
{
//10.1: 首先定义一些系列的变量,数据位,波特率。停止位,校验位
QSerialPort::BaudRate baudrate;
QSerialPort::DataBits databits;
QSerialPort::Parity checkbits;
QSerialPort::StopBits stopbits;
//10.2: 使用一系列if命令来给上边定义的变量进行赋值
//10.3: 使用一系列的标准命令根据BaudRateCb,DataCb,ParityCb,StopCb按钮上的文本信息,对数据为进行赋值
if(ui->BaudRateCb->currentText()=="1200")
{
baudrate=QSerialPort::Baud1200;
}else if(ui->BaudRateCb->currentText()=="2400")
{
baudrate=QSerialPort::Baud2400;
}else if(ui->BaudRateCb->currentText()=="4800")
{
baudrate=QSerialPort::Baud4800;
}else if(ui->BaudRateCb->currentText()=="9600")
{
baudrate=QSerialPort::Baud9600;
}else if(ui->BaudRateCb->currentText()=="115200")
{
baudrate=QSerialPort::Baud115200;
}
if(ui->DataCb->currentText()=="5")
{
databits=QSerialPort::Data5;
}else if(ui->DataCb->currentText()=="6")
{
databits=QSerialPort::Data6;
}else if(ui->DataCb->currentText()=="7")
{
databits=QSerialPort::Data7;
}else if(ui->DataCb->currentText()=="8")
{
databits=QSerialPort::Data8;
}
if(ui->ParityCb->currentText()=="none")
{
checkbits=QSerialPort::NoParity;
}
if(ui->StopCb->currentText()=="1")
{
stopbits=QSerialPort::OneStop;
}else if(ui->StopCb->currentText()=="1.5")
{
stopbits=QSerialPort::OneAndHalfStop;
}else if(ui->StopCb->currentText()=="2")
{
stopbits=QSerialPort::TwoStop;
}
//第十一步: 将信息方式到串口中去
serialport->setPortName(ui->SerialNameCb->currentText());//将串口名放置到串口中去
serialport->setBaudRate(baudrate);
serialport->setDataBits(databits);
serialport->setParity(checkbits);
serialport->setStopBits(stopbits);
//第十二步: 查看串口是否打开,可以在帮助中查找QIODevice::ReadWrite的使用方法
// This enum is used with open() to describe the mode in which a device is opened. It is also returned by openMode().
if(serialport->open(QIODevice::ReadWrite))
{
QMessageBox::information(this,"提示","成功");
}else {
QMessageBox::critical(this,"提示","失败");
}
}
//第十三步: 使接收框可以收到信息;
connect(serialport,SIGNAL(readyRead()),this,SLOT(serialPortReadyRead_Slot()));
//第十四步: 添加对应的槽函数,注意起名字时要合理
void serialPortReadyRead_Slot();//第十四步: 添加对应的槽函数,注意起名字时要合理
//第十五步:实现接收框可以接受信息
void MyWidget::serialPortReadyRead_Slot()
{
QString buf;
buf=QString(serialport->readAll());
ui->ReceiveEdit->appendPlainText(buf);
}
//第十六步: 点击按钮转到槽关闭串口
void MyWidget::on_CloseBtn_clicked()//第十六步: 点击按钮转到槽关闭串口
{
serialport->close();
}
/第十七步: 将发送框里面的信息发送到串口,然后在第十五步中可以实现接收框接受串口的信息 /第十八步:引用中的代码 ui->textEdit->toPlainText().toLocal8Bit() 是用于获取文本编辑框中的内容,并将其转换为本地字节序列。这段代码返回的是一个 QByteArray 类型的数据。 //而 toLocal8Bit().data() 则是将这个字节序列转换为 char* 类型的指针
void MyWidget::on_SendBtn_clicked()//第十七步: 将发送框里面的信息发送到串口,然后在第十五步中可以实现接收框接受串口的信息
{
//第十八步:引用中的代码 ui->textEdit->toPlainText().toLocal8Bit() 是用于获取文本编辑框中的内容,并将其转换为本地字节序列。这段代码返回的是一个 QByteArray 类型的数据。
//而 toLocal8Bit().data() 则是将这个字节序列转换为 char* 类型的指针
serialport->write(ui->SendBtn->text().toLocal8Bit().data());
}
//第十九步: 实现将接收框清除
void MyWidget::on_ClearBtn_clicked()
{
ui->ReceiveEdit->clear();//第十九步: 实现将接收框清除
}
#第二十步: 将图标(.ico文件)复制到 工程名文件下例如:D:\Qt514\workspace\serialtwo之下有一个serialport.ico文件,添加下面代码后运行(或者D:\Qt514\workspace\serialport\serial之下,然后将QT平台切换到Release模式下,在运行一遍就可以了)
RC_ICONS=serialport.ico#第二十步: 将图标(.ico文件)复制到 工程名文件下例如:D:\Qt514\workspace\serialtwo之下有一个serialport.ico文件
打包方法;
QT生成可执行文件_小破孩 != ERR的博客-CSDN博客
出现问题:
打包之后的可执行文件无法正常启动,可能是因为32bit写的使用的是64bit打包的记得换成32bit的反之亦然:本电脑是64bit
解决方法:
QT出现应用程序无法正常启动0xc000007b的错误_qt 0xc000007b_水军总督的博客-CSDN博客
qt打包exe程序出现应用程序无法正常启动0xc000007b或者其他的错误_路奇怪的博客-CSDN博客
如有不妥之处或者侵权行为,请及时联系本人删除。