基本信息
源码名称:串口数据模拟收发(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;
}
}