实例介绍
【实例简介】加载假数据后,模拟真实设备通过串口进行数据收发。
【实例截图】
#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小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论