- #include "mainwindow.h"
- #include "ui_mainwindow.h"
- #include <QTimer>
- #include <QDebug>
- MainWindow::MainWindow(QWidget *parent) :
- QMainWindow(parent),
- ui(new Ui::MainWindow), m_serialPort(new QSerialPort()), m_timer(new QTimer)
- {
- ui->setupUi(this);
- QComboBox* serialCbo = findChild<QComboBox*>("cboSerial", Qt::FindChildOption::FindChildrenRecursively);
- //获取所有串口信息
- foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
- {
- qDebug() << "serialPortName:" << info.portName();
- qDebug() << "isBusy:" << info.isBusy();
- qDebug() << "isNull:" << info.isNull();
- qDebug() << "serialCbo:" << serialCbo;
- if(!info.isBusy()){
- serialCbo->addItem(info.portName());
- }
- }
- }
- MainWindow::~MainWindow()
- {
- delete ui;
- }
- void MainWindow::on_btnOpenSerial_clicked()
- {
- QPushButton* btn = findChild<QPushButton*>("btnOpenSerial", Qt::FindChildOption::FindChildrenRecursively);
- if(btn->text() == "打开串口"){//打开
- if(m_serialPort->isOpen())//如果串口已经打开了 先给他关闭了
- {
- m_serialPort->clear();
- m_serialPort->close();
- }
- //设置串口名字 假设我们上面已经成功获取到了 并且使用第一个
- QComboBox* serialCbo = findChild<QComboBox*>("cboSerial", Qt::FindChildOption::FindChildrenRecursively);
- m_serialPort->setPortName(serialCbo->currentText());
- QLabel* serialState = findChild<QLabel*>("lblSerialState", Qt::FindChildOption::FindChildrenRecursively);
- if(!m_serialPort->open(QIODevice::ReadWrite))//用ReadWrite 的模式尝试打开串口
- {
- serialState->setText(serialCbo->currentText() + "打开失败!");
- return;
- }
- //打开成功
- serialState->setText(serialCbo->currentText() + "打开成功!");
- m_serialPort->setBaudRate(QSerialPort::Baud9600,QSerialPort::AllDirections);//设置波特率和读写方向
- m_serialPort->setDataBits(QSerialPort::Data8); //数据位为8位
- m_serialPort->setFlowControl(QSerialPort::NoFlowControl);//无流控制
- m_serialPort->setParity(QSerialPort::NoParity); //无校验位
- m_serialPort->setStopBits(QSerialPort::OneStop); //一位停止位
- //连接信号槽 当下位机发送数据QSerialPortInfo 会发送个 readyRead 信号,我们定义个槽void receiveInfo()解析数据
- connect(m_serialPort,SIGNAL(readyRead()),this, SLOT(receiveInfo()));
- connect(m_timer,SIGNAL(timeout()),this, SLOT(timeUpdate()));
- btn->setText("关闭串口");
- }else {//关闭
- QComboBox* serialCbo = findChild<QComboBox*>("cboSerial", Qt::FindChildOption::FindChildrenRecursively);
- QLabel* serialState = findChild<QLabel*>("lblSerialState", Qt::FindChildOption::FindChildrenRecursively);
- if (m_serialPort->isOpen())
- {
- m_serialPort->close();
- serialState->setText(serialCbo->currentText() + "关闭成功!");
- btn->setText("打开串口");
- return;
- }
- serialState->setText(serialCbo->currentText() + "不能重复关闭!");
- }
- }
- float power;
- int i = 1;
- QByteArray buf;
- void MainWindow::receiveInfo()
- {
- m_timer->start(100);
- buf.append(m_serialPort->readAll());
- }
- void MainWindow::timeUpdate(){
- m_timer->stop();
- if(buf.length() > 0){
- qDebug() << "receive..." << buf.length();
- //上述方法不是每次都返回21,每次可能不能完全读完,分几次读取,或一次读完的都有
- if(buf.length() != 25){//只对正确的情况做处理,其余数据不全的忽略
- return;
- }
- //buf[17] 返回类型为 QByteRef 类型,并非char,不能用它
- //而应该用at()
- //取电压
- qDebug("volt %02x-%02x", buf.at(3), buf.at(4));
- float volt = ((unsigned char)buf.at(3) << 8) + (unsigned char)buf.at(4);
- qDebug() << volt;
- volt *= 0.1;
- QString data = QString("电压:%1 V").arg(volt);
- QLabel* lblVolt = findChild<QLabel*>("lblVolt", Qt::FindChildOption::FindChildrenRecursively);
- lblVolt->setText(data);
- //取电流
- float circuit = (buf.at(5) << 8) + buf.at(6);
- circuit += ((buf.at(7) << 8) + buf.at(8)) << 16;
- data = QString("电流:%1 mA").arg(circuit);
- QLabel* lblCircut = findChild<QLabel*>("lblCircut", Qt::FindChildOption::FindChildrenRecursively);
- lblCircut->setText(data);
- //取功率
- power = (buf.at(9) << 8) + buf.at(10);
- power += ((buf.at(11) << 8) + buf.at(12)) << 16;
- power *= 0.1;
- data = QString("功率:%1 W").arg(power);
- QLabel* lblPower = findChild<QLabel*>("lblPower", Qt::FindChildOption::FindChildrenRecursively);
- lblPower->setText(data);
- //取频率
- qDebug("%02x-%02x", buf.at(17), buf.at(18));
- float freq = ((unsigned char)buf.at(17) << 8) + (unsigned char)buf.at(18);
- freq *= 0.1;
- data = QString("频率:%1 Hz").arg(freq);
- QLabel* lblFreq = findChild<QLabel*>("lblFreq", Qt::FindChildOption::FindChildrenRecursively);
- lblFreq->setText(data);
- QLabel* serialState = findChild<QLabel*>("lblSerialState", Qt::FindChildOption::FindChildrenRecursively);
- QString statebuf = QString("正在采集 %1 次").arg(i);
- serialState->setText(statebuf);
- //update 图形
- //PaintFrame* frame = findChild<PaintFrame*>("frame", Qt::FindChildOption::FindChildrenRecursively);
- //frame->update(i, 140-(int)power, i, 140);
- }
- buf.clear();
- }
复制代码
部分代码下载(可能有错误,仅供参考):
electricty.rar
(8.6 KB, 下载次数: 0)
|