实例介绍
【实例简介】加载假数据后,模拟真实设备通过串口进行数据收发。
【实例截图】
#include"QFileDialog" #include"QTextStream" #include"QFile" #include"QDateTime" class QSerialPort; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); ui->Baud->setCurrentIndex(3); ui->stopdata->setCurrentIndex(1); ui->time->setText("50"); ui->cmdcount->setStyleSheet("background:transparent;border-width:0;border-style:outset"); myport = new QSerialPort(this); timer=new QTimer; savetime = 0; ui->databit->addItem(QStringLiteral("8"),QSerialPort::Data8); ui->databit->addItem(QStringLiteral("7"),QSerialPort::Data7); ui->parity->addItem(QStringLiteral("无校验"),QSerialPort::NoParity); ui->parity->addItem(QStringLiteral("奇校验"),QSerialPort::OddParity); ui->parity->addItem(QStringLiteral("偶校验"),QSerialPort::EvenParity); ui->parity->addItem(QStringLiteral("Space"),QSerialPort::SpaceParity); ui->parity->addItem(QStringLiteral("Mark"),QSerialPort::MarkParity); ui->stopdata->addItem(QStringLiteral("1"),QSerialPort::OneStop); ui->stopdata->addItem(QStringLiteral("2"),QSerialPort::TwoStop); connect(myport,SIGNAL(readyRead()),this,SLOT(readdatas())); connect(timer, &QTimer::timeout, this, [&](){ui->send->click();}); ui->send->setEnabled(false); } MainWindow::~MainWindow() { delete ui; } void MainWindow::opencom() { bool com; QString serialPortName = ui->serialname->currentText(); QString baudstr = ui->Baud->currentText(); int baud= baudstr.toInt(); myport->setPortName(serialPortName); myport->setBaudRate(baud); int databit = ui->databit->currentText().toInt(); switch (databit) { case 7: myport->setDataBits(QSerialPort::Data7); break; case 8: myport->setDataBits(QSerialPort::Data8); break; default: break; } int parity = ui->parity->currentIndex(); switch (parity) { case 0: myport->setParity(QSerialPort::NoParity); break; case 1: myport->setParity(QSerialPort::OddParity); break; case 2: myport->setParity(QSerialPort::EvenParity); break; case 3: myport->setParity(QSerialPort::SpaceParity); break; case 4: myport->setParity(QSerialPort::MarkParity); break; default: break; } int stopbit = ui->stopdata->currentText().toInt(); switch (stopbit) { case 1: myport->setStopBits(QSerialPort::OneStop); break; case 2: myport->setStopBits(QSerialPort::TwoStop); break; default: break; } myport->setFlowControl(QSerialPort::NoFlowControl); com= myport->open(QIODevice::ReadWrite); if(com) { ui->flag->setText(serialPortName ="打开成功"); } else { ui->flag->setText(serialPortName ="打开失败"); } } void MainWindow::readdatas() { QByteArray sData ="接收:"; QByteArray rData; int i=0; QDateTime currenttime = QDateTime::currentDateTime(); timestr = currenttime.toString("yyyy.MM.dd hh:mm:ss:"); this->time = ui->time->text().toInt(); myport->waitForReadyRead(this->time); if(myport->isOpen()) { rData = myport->readAll(); QString recvdat = rData.toHex(); int len = recvdat.length(); for(i=0;i<len;i ) { recvdat.insert((2 3*i)," "); } recvdata.append(recvdat); QString s = QString::number(len,10); sData = recvdata; if(rData.length()) { if(savetime) { sData.insert(0,timestr); } ui->textbox->setTextColor(QColor("black")); ui->textbox->append(sData); finddata(); } else{ } } myport->clear(); } void MainWindow::writedata(QString senddata,QByteArray sdata) { QString out= {"发送:"}; QDateTime currenttime = QDateTime::currentDateTime(); timestr = currenttime.toString("yyyy.MM.dd hh:mm:ss:"); out =senddata; myport->clear(); int a = myport->write(sdata); myport->waitForBytesWritten(time); if(-1 != a) { ui->textbox->setTextColor(QColor("red")); if(savetime) { out.insert(0,timestr); } ui->textbox->append(out); if(!sendflag) { ui->textbox->append(""); } } else{} } char MainWindow::ConvertHexChar(char ch) { if((ch >= '0') && (ch <= '9')) return ch-0x30; else if((ch >= 'A') && (ch <= 'F')) return ch-'A' 10; else if((ch >= 'a') && (ch <= 'f')) return ch-'a' 10; else return (-1); } void MainWindow::String2Hex(QString str, QByteArray &senddata) { int hexdata,lowhexdata; int hexdatalen = 0; int len = str.length(); // qDebug()<<len;//计算数据长度 senddata.resize(len/2); char lstr,hstr; for(int i=0; i<len; ) { //char lstr, hstr=str[i].toLatin1(); if(hstr == ' ') { i ; continue; } i ; if(i >= len) break; lstr = str[i].toLatin1(); hexdata = ConvertHexChar(hstr); lowhexdata = ConvertHexChar(lstr); if((hexdata == 16) || (lowhexdata == 16)) break; else hexdata = hexdata*16 lowhexdata; i ; senddata[hexdatalen] = (char)hexdata; hexdatalen ; } senddata.resize(hexdatalen); } void MainWindow::open() { QString filename,fileneme1; filename = QFileDialog::getOpenFileName(this, tr("选择文件"), fileneme1, tr("data(*.txt *.dat *.ini)")); //选择路径 if ( filename.isEmpty() ) { return; } else { fileneme1 = filename; } ui->path->setText(filename); QFile file(filename); int a = file.open(QIODevice::ReadOnly); if(!a) { QMessageBox::warning(this,"Warning","can't open",QMessageBox::Yes); } QTextStream in(&file); readdata = in.readAll(); QString str1 = "senddata:"; int count = readdata.count(str1); if(count == -1) { ui->statusBar->showMessage("nodata",2000); } else { QString s = QString::number(count,10); ui->cmdcount->setText(s); } } void MainWindow::finddata() { QString str1 = "receivedata: "; recvdata = recvdata.trimmed(); sendflag = 0; str1.append(recvdata); recvdata.clear(); QByteArray senddata; if(str1.length() > 20) { int a = readdata.indexOf(str1,0,Qt::CaseInsensitive); if(-1 != a) { QString out = readdata.mid(a); int b = out.indexOf("senddata:",0,Qt::CaseInsensitive); out = out.mid(b); int c = out.indexOf("receivedata: ",0,Qt::CaseInsensitive); out = out.left(c); out = out.mid(10); out = out.trimmed(); MainWindow::String2Hex(out,senddata); MainWindow::writedata(out,senddata); } else{} } } void MainWindow::on_send_clicked() { if(myport->isOpen()) { sendflag = 1; QString data = ui->cmd->text(); if(data.length()) { QByteArray sdata; MainWindow::String2Hex(data,sdata); this->writedata(data,sdata); } else { QMessageBox::warning(this,"waring","发送内容不能为空"); } } else { QMessageBox::warning(this,"warning","串口未打开!",QMessageBox::Yes); } } void MainWindow::on_Baud_currentTextChanged() { QString str = ui->Baud->currentText(); int baud = str.toInt(); switch (baud) { case 1200: ui->time->setText("100");break; case 2400: ui->time->setText("80");break; case 4800: ui->time->setText("50");break; case 9600: ui->time->setText("50");break; case 19200: ui->time->setText("20");break; case 38400: ui->time->setText("10");break; break; default: break; } } void MainWindow::on_open_clicked() { open(); } void MainWindow::on_GO_clicked() { QString str = ui->GO->text(); QString str1 ="开始"; QString str2 = "停止"; if(str == str1) { data= 1; } else { data = 2; } switch (data) { case 1://开始功能 opencom(); if(myport->isOpen()) { ui->GO->setText(str2); ui->send->setEnabled(true); } break; case 2://停止功能 ui->send->setEnabled(false); myport->close(); ui->flag->clear(); ui->GO->setText(str1); break; default: break; } } void MainWindow::on_clean_clicked() { ui->textbox->clear(); } void MainWindow::on_save_clicked() { QString filename; filename = QFileDialog::getSaveFileName(this, tr("保存文件"), "", tr("data(*.txt)")); QFile file(filename); file.open(QFile::WriteOnly); QTextStream write(&file); write<<ui->textbox->toPlainText(); file.close(); } void MainWindow::on_checkBox_stateChanged(int arg1) { if(ui->checkBox->isChecked()) { timer->start(1000); } else { timer->stop(); } } void MainWindow::on_savetime_stateChanged(int arg1) { if(ui->savetime->isChecked()) { savetime = 1; } else { savetime = 0; } }
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论