#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QIODevice>
#include <QtSerialPort/QSerialPortInfo>
#include <QMessageBox>
#include <QFileDialog>
#include <fstream>
#include <QFile>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
initForm();
initChart();
}
MainWindow::~MainWindow()
{
delete ui;
}
//初始化界面
void MainWindow::initForm()
{
setWindowTitle(tr("串口调试 A1105"));
//将QRadioButton分组
group1 = new QButtonGroup(this);
group2 = new QButtonGroup(this);
group1->addButton(ui->sendTextMode,1);
group1->addButton(ui->sendHexMode,2);
group2->addButton(ui->recTextMode,1);
group2->addButton(ui->recHexMode,2);
ui->lineEdit_offset1->setEnabled(false);
ui->lineEdit_offset2->setEnabled(false);
ui->botelv->setCurrentIndex(4);
ui->shujuwei->setCurrentIndex(3);
connect(ui->sendTextMode,SIGNAL(clicked()),this,SLOT(group1_clicked()));
connect(ui->sendHexMode,SIGNAL(clicked()),this,SLOT(group1_clicked()));
connect(ui->recTextMode,SIGNAL(clicked()),this,SLOT(group2_clicked()));
connect(ui->recHexMode,SIGNAL(clicked()),this,SLOT(group2_clicked()));
//改变串口的各种选项时,重新启动串口
connect(ui->chuankou,SIGNAL(currentIndexChanged(int)),this,SLOT(saveConfig()));
connect(ui->botelv,SIGNAL(currentIndexChanged(int)),this,SLOT(saveConfig()));
connect(ui->shujuwei,SIGNAL(currentIndexChanged(int)),this,SLOT(saveConfig()));
connect(ui->jiaoyanwei,SIGNAL(currentIndexChanged(int)),this,SLOT(saveConfig()));
connect(ui->tingzhiwei,SIGNAL(currentIndexChanged(int)),this,SLOT(saveConfig()));
//初始化串口信息(在.PRO文件中加入QT+=serialport)
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
QSerialPort serial;
serial.setPort(info);
if(serial.open(QIODevice::ReadWrite))
{
ui->chuankou->addItem(info.portName());
serial.close();
}
}
//选中自动发送,每隔一段时间就发送一次
timer = new QTimer();
connect(timer,SIGNAL(timeout()),this,SLOT(selectAutoSend()));
}
//每次选项改变的时候重新启动串口,各种参数好像能使用枚举类型搞定
void MainWindow::saveConfig()
{
MainWindow::portname = ui->chuankou->currentText();
MainWindow::baudrate = ui->botelv->currentText().toInt();
MainWindow::databit = ui->shujuwei->currentText().toInt();
MainWindow::parity = ui->jiaoyanwei->currentText();
MainWindow::stopbit = ui->tingzhiwei->currentText().toDouble();
qDebug() <<"串口参数改变,串口号/波特率/数据位/检验位/停止位:" <<portname <<baudrate <<databit <<parity <<stopbit;
}
void MainWindow::on_openBtn_clicked()
{
if(ui->openBtn->text() == "打开串口")
{
myPort = new QSerialPort(this);
myPort->setPortName(portname);
if(myPort->open(QIODevice::ReadWrite))
{
myPort->setBaudRate(ui->botelv->currentText().toInt());
myPort->setDataBits(QSerialPort::DataBits(ui->shujuwei->currentText().toInt()));
myPort->setParity(QSerialPort::Parity(ui->jiaoyanwei->currentIndex()));
myPort->setStopBits(QSerialPort::StopBits(ui->tingzhiwei->currentIndex()));
statusBar()->showMessage(tr("串口已经打开"));//状态栏显示的内容
connect(myPort, SIGNAL(readyRead()), this, SLOT(readCom()));
}
else
{
QMessageBox::information(this,tr("提示框"),tr("串口打开失败!"));
return;
}
ui->openBtn->setText(tr("关闭串口"));
}
else
{
myPort->close(); //初始化控件不可用
statusBar()->showMessage(tr("串口已经关闭")); //状态栏显示的内容
ui->openBtn->setText(tr("打开串口"));
if(timer->isActive())
timer->stop();
return;
}
}
//是一个槽函数,不断读取从机器返回来的数据
void MainWindow::readCom()
{
QByteArray byte_data = myPort->readAll(); //读取串口数据
STRUCT_SERIAL_DATA receiveData;
static QString strDisplay, strData;
static int dataCount = 0;
static bool dataFlag = false;
bool ok;
if (currentCount >= maxCount) //当前显示行数
{
ui->receiveText->clear(); //清屏
currentCount = 0;
}
if (byte_data.isEmpty())
{
qDebug() << "Error:: Receive Empty Message!!!!!!!!!!!!!";
return;
}
//将读取到的数据进行转化,是否是按16进制显示
if(isHexDisplay)
{
QString str = byte_data.toHex(); //返回16进制编码的副本
str = str.toUpper ();
qDebug() << "ReceiveData" << str;
strData += str;
int tempCount = 0;
QString strTemp;
while(!strData.isEmpty())
{
strTemp = strData.mid(tempCount,2);
if(!dataFlag)
{
if((strData.length() - tempCount) >= 2*RECEIVE_DATA_NUMBER)
{
if((0 == dataCount) && strTemp == "FA")
{
dataFlag = true;
strData = strData.mid(tempCount,strData.length()-tempCount);
tempCount= 0;
continue;
}
}
else
{
strData = strData.mid(tempCount,strData.length()-tempCount);
break;
}
}
else
{
m_receiveData[dataCount] = strTemp.toShort(&ok,16);
strDisplay += strTemp;
strDisplay += " ";
dataCount++;
if(8 == dataCount)
{
strDisplay +="\n";
ui->receiveText->insertPlainText(strDisplay);
strDisplay.clear();
currentCount++;
if(0xFB == m_receiveData[7])
{
if(m_receiveData[1] || m_receiveData[2] || m_receiveData[3] || m_receiveData[4])
{
receiveData.chlData[0] = m_receiveData[2] + (((uint16_t)m_receiveData[1]) << 8);
receiveData.chlData[1] = m_receiveData[4] + (((uint16_t)m_receiveData[3]) << 8);
receiveData.offset[0] = m_receiveData[5] & 0x3F;
receiveData.offset[1] = m_receiveData[6] & 0x3F;
emit serialDataUpdate(receiveData);
}
}
dataCount= 0;
dataFlag = false;
strData = strData.mid(2*RECEIVE_DATA_NUMBER, strData.length()-2*RECEIVE_DATA_NUMBER);
tempCount= 0;
}
}
tempCount += 2;
}
}
else
{
ui->receiveText->insertPlainText(byte_data);
}
byte_data.clear();
}
//清空接收框
void MainWindow::on_receiveCleanBtn_clicked()
{
ui->receiveText->clear();
}
//保存接收数据
void MainWindow::on_saveReceiveBtn_clicked()
{
QString text = ui->receiveText->toPlainText();
if(text == "")
{
QMessageBox::warning(this,tr("警告框"),tr("文本框没有信息,无法保存"));
return;
}
QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"),"./receieve.txt",tr("Text files (*.txt)"));
QFile file(fileName);
if(file.open((QIODevice::
QChart动态曲线(支持缩放)
4星 · 超过85%的资源 需积分: 50 165 浏览量
2020-01-08
14:41:09
上传
评论 14
收藏 100KB RAR 举报
xu5477243
- 粉丝: 8
- 资源: 10
最新资源
- 同等学力申硕考试 组合数学
- 同等学力 离散数学与组合数学
- 50条最常用Linux系统命令大全手册
- 斯沃数控仿真软件7.2版数控加工中心车床铣床编程仿真模拟教程斯沃系统手册可编程序控制器系统(ABPLC)说明
- 2023NOC软件创意编程赛项真题-python小高初赛
- 2024安全信息安全与评估
- 斯沃数控仿真软件7.2版数控加工中心车床铣床编程仿真模拟教程斯沃系统手册DASEN-9i-连接手册PLC-手册
- SpringBoot集成MyBatis-Plus
- 基于python-contrib-opencv,dlib,pyqt5实现电脑端摄像头读取视频,实时人脸录入,人脸识别等功能
- 斯沃数控仿真软件7.2版数控加工中心车床铣床编程仿真模拟教程斯沃系统手册DASEN-3i-h连接手册PLC手册
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈