实例介绍
【实例截图】
【文件目录】
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()
{
}
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论