基本信息
源码名称:串口数据模拟收发(QT)
源码大小:0.01M
文件格式:.rar
开发语言:C/C++
更新时间:2018-04-22
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300

本次赞助数额为: 5 元 
   源码介绍
加载假数据后,模拟真实设备通过串口进行数据收发。



#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;
    }
}