基本信息
源码名称:串口数据模拟收发(QT)
源码大小:0.01M
文件格式:.rar
开发语言:C/C++
更新时间:2018-04-22
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 5 元×
微信扫码支付:5 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
加载假数据后,模拟真实设备通过串口进行数据收发。
加载假数据后,模拟真实设备通过串口进行数据收发。
#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; } }