在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例Qt 图形界面开发 → 串口数据模拟收发(QT)

串口数据模拟收发(QT)

Qt 图形界面开发

下载此实例
  • 开发语言:C/C++
  • 实例大小:0.01M
  • 下载次数:74
  • 浏览次数:636
  • 发布时间:2018-04-22
  • 实例类别:Qt 图形界面开发
  • 发 布 人:byj123
  • 文件格式:.rar
  • 所需积分:5
 相关标签: 模拟 串口 数据

同类人气实例

实例介绍

【实例简介】加载假数据后,模拟真实设备通过串口进行数据收发。

【实例截图】


from clipboard


【核心代码】
#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;
    }
}

标签: 模拟 串口 数据

实例下载地址

串口数据模拟收发(QT)

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

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

网友评论

发表评论

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

查看所有0条评论>>

小贴士

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

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

关于好例子网

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

;
报警