在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例Android手机应用开发 → Qt 窗口开发实例(串口通讯)

Qt 窗口开发实例(串口通讯)

Android手机应用开发

下载此实例
  • 开发语言:C/C++
  • 实例大小:2.38M
  • 下载次数:31
  • 浏览次数:395
  • 发布时间:2021-04-02
  • 实例类别:Android手机应用开发
  • 发 布 人:wangbenqing
  • 文件格式:.rar
  • 所需积分:2
 相关标签: Qt 开发 窗口 实例

实例介绍

【实例简介】源码 资料

【实例截图】

from clipboard

【文件目录】

class2

├── Qt_Serial
│   ├── Qt_Serial.pro
│   ├── Qt_Serial.pro.user
│   ├── canDLL
│   │   ├── ECANVCIlib32bit
│   │   │   ├── CHUSBDLL.dll
│   │   │   ├── ECanVci.dll
│   │   │   └── ECanVci.lib
│   │   ├── ECANVCIlib64bit
│   │   │   ├── CHUSBDLL64.dll
│   │   │   ├── ECanVci64.dll
│   │   │   └── ECanVci64.lib
│   │   ├── ECanVci.h
│   │   ├── EcanVCI动态库使用手册5.31.pdf
│   │   ├── Guangcheng Technology USBCAN Interface Function Library Instruction Manual.pdf
│   │   └── Linux
│   │       ├── linux.rar
│   │       ├── linux32
│   │       │   ├── ECanVci.h
│   │       │   ├── Makefile
│   │       │   ├── readme.txt
│   │       │   ├── test
│   │       │   └── test.c
│   │       └── linux64
│   │           ├── ECanVci.h
│   │           ├── Makefile
│   │           ├── readme.txt
│   │           ├── test
│   │           └── test.c
│   ├── main.cpp
│   ├── widget.cpp
│   ├── widget.h
│   └── widget.ui
├── Qt_Serial 项目说明.txt
└── build-Qt_Serial-Desktop_Qt_5_11_1_MinGW_32bit-Debug
    ├── Makefile
    ├── Makefile.Debug
    ├── Makefile.Release
    ├── debug
    │   ├── Qt_Serial.exe
    │   ├── SQLiteDatabaseTest.exe
    │   ├── main.o
    │   ├── moc_predefs.h
    │   ├── moc_widget.cpp
    │   ├── moc_widget.o
    │   └── widget.o
    ├── release
    └── ui_widget.h

10 directories, 38 files


【核心代码】


#include "widget.h"
#include "ui_widget.h"
#include "QSerialPortInfo"
#include "QMessageBox"
#include <QDebug> //系统打印用到的头文件
#include <Qtsql> //包含QtSQL模块中的头文件
#include "canDLL/ECanVci.h"

#define DEBUG_INFOR_EN 1



Widget::Widget(QWidget *parent) :
 QWidget(parent),
 ui(new Ui::Widget)
{
 ui->setupUi(this);

 qDebug()<<QSqlDatabase::drivers();//打印Qt支持的数据库引擎

 serialPort = new QSerialPort(this);
 timer = new QTimer(this);

 scanCycleMs = 2000;//定时器的定时周期值
 serialNamePort.clear();//初始化好时先清空串口列表

 //关联timer定时器定时周期时间到时的timeout信号后就执行onTimeOut()槽函数(用于周期性的更新串口列表)。
 connect(timer, SIGNAL(timeout()), this, SLOT(onTimeOut()));

 //关联信号和执行槽函数的关系【打开得串口接收到可读数据就触发readyRead信号然后执行serialPortReadyRead_slot函数】
 connect(serialPort,SIGNAL(readyRead()),this,SLOT(serialPortReadyRead_slot()));

 //初始化时先使用foreach获取设备接口上的所有串口的设备号
 foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
 serialNamePort<<info.portName();
 ui->serialCb->addItems(serialNamePort);//添加搜索到的串口号到serialCb控件列表中
 }

 Widget::ScanStart();//启动定时器并开始按照预设定时器时间更新串口列表

 /* 使用Qt 调用外部lib --》 下面是打开设备的代码例子*/
 int nDeviceType = 3; /* USBCAN-I */
 int nDeviceInd = 0;
 int nReserved =0;
 DWORD dwRel;
 dwRel = OpenDevice(nDeviceType, nDeviceInd, nReserved);
 if (dwRel != STATUS_OK)
 {
 QMessageBox::critical(this,"警告","打开CAN设备失败,如需使用CAN设备请连接CAN设备");
 }else{
 QMessageBox::information(this,"提示","打开CAN设备成功");
 }
}

Widget::~Widget()
{
 delete ui;
}
void Widget::serialPortReadyRead_slot()
{
 QString buf;
 //读取到有串口数据就存入buf中
 buf = QString(serialPort->readAll());
 //将buf中得所有数据显示到控件中
 //ui->recvEdit->appendPlainText(buf);//使用这个显示会出现莫名的换行,看起来很不舒服
 ui->recvEdit->insertPlainText(buf);//这是插入显示接在之前的数据中后面继续显示
 ui->recvEdit->setWordWrapMode(QTextOption::WrapAnywhere);
 ui->recvEdit->moveCursor(QTextCursor::End);//设置recvEdit控件的下拉光标始终移到最后显示最新的数据
 //qDebug()<<buf.toUtf8().toHex();//接收到的串口数据进行调试打印输出 字符串转换成十六进制输出
}
void Widget::on_openBt_clicked()
{
 QSerialPort::BaudRate baudRate;
 QSerialPort::DataBits dataBits;
 QSerialPort::StopBits stopBits;
 QSerialPort::Parity checkBits;
 //波特率设置
 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;
 }
 //数据位设置
 switch (ui->dataCb->currentText().toInt()) { //这里把控件中的QString数据类型转换成int类型
 case 5:
 dataBits = QSerialPort::Data5;
 break;
 case 6:
 dataBits = QSerialPort::Data6;
 break;
 case 7:
 dataBits = QSerialPort::Data7;
 break;
 case 8:
 dataBits = QSerialPort::Data8;
 break;
 default:
 dataBits = QSerialPort::Data8;
 break;
 }
 //停止位
 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;
 }
 //校验位
 if(ui->checkCb->currentText() == "none"){
 checkBits = QSerialPort::NoParity;
 }
 //将界面中的串口配置参数写入串口的设置项中
 serialPort->setPortName(ui->serialCb->currentText());//获取串口控件列表中选中的串口号
 serialPort->setBaudRate(baudRate);
 serialPort->setDataBits(dataBits);
 serialPort->setStopBits(stopBits);
 serialPort->setParity(checkBits);
 //判断串口是否已经打开
 if(serialPort->open(QIODevice::ReadWrite) == true){
 QMessageBox::information(this,"提示","指定串口打开成功");
 }else{
 QMessageBox::critical(this,"提示","指定串口打开失败");
 }

}

void Widget::on_closeBt_clicked()
{
 serialPort->close();//关闭当前打开的串口号
}
#if 0
void serial::on_sendBox_clicked()
{ QByteArray Data_1;
 //获取输入窗口sendData的数据
 QString Data = ui->sendData->toPlainText();
 if(c) {Data ='\r';Data ='\n';}//插入换行
 if(b==0) Data_1 = Data.toUtf8();//转换成utf8格式的字节流发送
 else Data_1 = QByteArray::fromHex (Data.toLatin1().data());//按十六进制编码发送
 // 写入发送缓存区
 SerialPort.write(Data_1);
}
#endif
void Widget::on_sendBt_clicked()
{
 QString Data = ui->sendEdit->text();//获取输入窗口sendData的数据
 //RadioBtn 控件是否被选中--选中了就证明需要在发送的数据尾部加新行
 if(ui->RadioBtn->isChecked()){
 Data ='\r';//插入回车CR
 Data ='\n';//插入换行Enter
 serialPort->write(Data.toLocal8Bit().data());
 }else{
 //RadioBtn 控件没被选中--则直接发送数据
 serialPort->write(Data.toLocal8Bit().data());
 }
 //直接获取sendEdit控件的数据进行发送
 //serialPort->write(ui->sendEdit->text().toLocal8Bit().data());
}

void Widget::on_clrBt_clicked()
{
 ui->recvEdit->clear();//清除接收区所有收到的数据
}
//==============================================
//开始扫描
void Widget::ScanStart()
{
 timer->stop();
 timer->start(scanCycleMs);
}
//停止扫描
void Widget::ScanStop(){
 timer->stop();
}
//周期扫描串口列表服务
void Widget::onTimeOut(){

 //用一个静态对象存储启动时间
 //static QTime tmBegin = QTime::currentTime();
 //qint64 tmEllapsd = tmBegin.elapsed();//将tmBegin流失的时间存储到变量
 //qint64 nSkip = tmEllapsd - m_tmLast;

 QStringList newPortStringList;
 //搜索串口
 foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()){
 #if DEBUG_INFOR_EN
 qDebug() << "Name : " << info.portName();
 qDebug() << "Description : " << info.description();
 qDebug() << "Manufacturer: " << info.manufacturer();
 #endif
 newPortStringList  = info.portName();
 }

 //更新旧的串口列表
 if(newPortStringList.size() != serialNamePort.size())
 {
 serialNamePort = newPortStringList;
 ui->serialCb->clear();
 ui->serialCb->addItems(serialNamePort);//更新添加搜索到的串口号到serialCb控件列表中
 }
}

void Widget::on_RadioBtn_clicked()
{


}


标签: Qt 开发 窗口 实例

实例下载地址

Qt 窗口开发实例(串口通讯)

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警