zoukankan      html  css  js  c++  java
  • Qt监控Arduino开关状态(读取串口数据)

    setup.ini配置文件内容

    [General]
    
    #游戏所在主机IP
    GameIp1=192.168.1.151
    GameIp2=192.168.1.152
    GameIp3=192.168.1.153
    GameIp4=192.168.1.154
    GameIp5=192.168.1.155
    GameIp6=192.168.1.156
    GameIp7=192.168.1.157
    GameIp8=192.168.1.158
    
    #游戏中监听的UDP端口
    GamePort=3000
    
    #延迟发送指令时间(单位毫秒)
    DelayTime1=0
    DelayTime2=0
    DelayTime3=1000
    DelayTime4=1000
    DelayTime5=2000
    DelayTime6=2000
    DelayTime7=3000
    DelayTime8=3000
    
    #4D系统的IP
    4DSystemIp=192.168.1.152
    
    #4D系统监听的UDP端口
    4DSystemPort=21392
    
    #向游戏发送的指令
    UdpDataToGame=%Play%
    
    #向4D系统发送的指令
    UdpDataTo4DSystem=AS%NPlayDirect%1%

    工程文件.pro中QT+=serialport

    mainwindow.h

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    
    #include <QSerialPort>
    #include <QSerialPortInfo>
    #include <QTimer>
    
    #include <QUdpSocket>
    
    namespace Ui {
    class MainWindow;
    }
    
    struct GamePCInfo
    {
        GamePCInfo(){}
        GamePCInfo(QString s,quint16 p, int i){ GameIp=s;GamePort=p;DelayTime=i;}
        QString GameIp;//游戏主机IP
        quint16 GamePort;//游戏UDP绑定的端口
        int DelayTime;//指令延迟发送时间
    };
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
    
        void sendUdpData();
    
    public slots:
        void readyReadSlot();
    
        void sendToGame1();
        void sendToGame2();
        void sendToGame3();
        void sendToGame4();
        void sendToGame5();
        void sendToGame6();
        void sendToGame7();
        void sendToGame8();
    private slots:
        void on_pushButton_clicked();
    
    private:
        Ui::MainWindow *ui;
        QSerialPort* m_reader;//COM串口
        QTimer* queryTimer;
    
        QUdpSocket* udpSocket;
    
        GamePCInfo gamePC1,gamePC2,gamePC3,gamePC4,gamePC5,gamePC6,gamePC7,gamePC8;//8台电脑
        QString FourDSystemIp;//4D系统IP
        quint16 FourDSystemPort;//4D系统UDP绑定的端口
        QString UdpDataToGame;//向游戏发送的UDP数据
        QString UdpDataTo4DSystem;//向4D系统发送的UDP数据
    };
    
    #endif // MAINWINDOW_H

    mainwindow.cpp

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QDebug>
    #include <QSettings>
    #include <QTextCodec>
    
    #pragma execution_character_set("utf-8")
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        QString appDirPath = QCoreApplication::applicationDirPath();
        QSettings* configIniRead = new QSettings(appDirPath+"/setup.ini", QSettings::IniFormat);
        configIniRead->setIniCodec(QTextCodec::codecForName("GB2312"));
        if( configIniRead->allKeys().size() > 0 )
        {
            quint16 GamePort = configIniRead->value("GamePort").toUInt();
            GamePCInfo game1(configIniRead->value("GameIp1").toString(),GamePort,configIniRead->value("DelayTime1").toInt());
            GamePCInfo game2(configIniRead->value("GameIp2").toString(),GamePort,configIniRead->value("DelayTime2").toInt());
            GamePCInfo game3(configIniRead->value("GameIp3").toString(),GamePort,configIniRead->value("DelayTime3").toInt());
            GamePCInfo game4(configIniRead->value("GameIp4").toString(),GamePort,configIniRead->value("DelayTime4").toInt());
            GamePCInfo game5(configIniRead->value("GameIp5").toString(),GamePort,configIniRead->value("DelayTime5").toInt());
            GamePCInfo game6(configIniRead->value("GameIp6").toString(),GamePort,configIniRead->value("DelayTime6").toInt());
            GamePCInfo game7(configIniRead->value("GameIp7").toString(),GamePort,configIniRead->value("DelayTime7").toInt());
            GamePCInfo game8(configIniRead->value("GameIp8").toString(),GamePort,configIniRead->value("DelayTime8").toInt());
            gamePC1=game1;
            gamePC2=game2;
            gamePC3=game3;
            gamePC4=game4;
            gamePC5=game5;
            gamePC6=game6;
            gamePC7=game7;
            gamePC8=game8;
    
            qDebug()<<game3.DelayTime;
            FourDSystemIp = configIniRead->value("4DSystemIp").toString();
            FourDSystemPort = configIniRead->value("4DSystemPort").toUInt();
            UdpDataToGame = configIniRead->value("UdpDataToGame").toString();
            UdpDataTo4DSystem = configIniRead->value("UdpDataTo4DSystem").toString();
        }
        else
        {
            qDebug() << "have no setup.ini , use default setting ." ;
        }
    
        udpSocket = new QUdpSocket(this);
        //我们这里只需要发送数据,并不用接收数据
        //connect( udpSocket, SIGNAL(readyRead()), SLOT(readUdpData()) );
    
        //绑定Arduino端口
        QSerialPortInfo com_info;
        foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
        {
            qDebug() << "Name : " << info.portName();
            qDebug() << "Description : " << info.description();
            qDebug() << "Manufacturer: " << info.manufacturer();
            qDebug() << "Serial Number: " << info.serialNumber();
            qDebug() << "System Location: " << info.systemLocation();
    
            if( info.description().contains("Arduino") )//找到Arduino端口
            {
                com_info = info;
                break;
            }
        }
        if(com_info.description().contains("Arduino"))
        {
            ui->textEdit->append("已找到Arduino端口"+com_info.systemLocation());
            m_reader = new QSerialPort(this);
            m_reader->setPort(com_info);
            if(m_reader->open(QIODevice::ReadOnly))
            {
                m_reader->setBaudRate(QSerialPort::Baud9600);
                m_reader->setParity(QSerialPort::NoParity);
                m_reader->setDataBits(QSerialPort::Data8);
                m_reader->setStopBits(QSerialPort::OneStop);
                m_reader->setFlowControl(QSerialPort::NoFlowControl);
                m_reader->setDataTerminalReady(true);//这个很重要,否则的话拔插串口之后,刚开始的几个数据会读取不到!!!!!!!!!!!!!!!!!!!
    
                m_reader->clearError();
                m_reader->clear();
                connect(m_reader, SIGNAL(readyRead()), this, SLOT(readyReadSlot()));
                ui->textEdit->append("Arduino端口"+com_info.systemLocation()+"++++++打开成功!+++++");
            }
            else
            {
                ui->textEdit->append("Arduino端口"+com_info.systemLocation()+"-----打开失败!------");
            }
        }
        else
        {
            ui->textEdit->append("未找到Arduino端口");
        }
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
        m_reader->clear();
        m_reader->close();
    }
    
    //读取端口数据
    void MainWindow::readyReadSlot()
    {
        QByteArray arr = m_reader->readAll();
        std::string data=arr.toStdString();
        qDebug()<<QString::fromStdString(data);
        if(data=="H")//高电平,开关接通
        {
            sendUdpData();
            ui->textEdit->append("开关接通");
        }
        else if(data=="L")//低电平,开关断开
        {
            ui->textEdit->append("开关断开");
        }
        m_reader->clear();
    }
    
    void MainWindow::sendToGame1()
    {
        udpSocket->writeDatagram(UdpDataToGame.toStdString().data(), QHostAddress(gamePC1.GameIp), gamePC1.GamePort);
        qDebug()<<gamePC1.GameIp;
    }
    void MainWindow::sendToGame2()
    {
        udpSocket->writeDatagram(UdpDataToGame.toStdString().data(), QHostAddress(gamePC2.GameIp), gamePC2.GamePort);
        qDebug()<<gamePC2.GameIp;
    }
    void MainWindow::sendToGame3()
    {
        udpSocket->writeDatagram(UdpDataToGame.toStdString().data(), QHostAddress(gamePC3.GameIp), gamePC3.GamePort);
        qDebug()<<gamePC3.GameIp;
    }
    void MainWindow::sendToGame4()
    {
        udpSocket->writeDatagram(UdpDataToGame.toStdString().data(), QHostAddress(gamePC4.GameIp), gamePC4.GamePort);
        qDebug()<<gamePC4.GameIp;
    }
    void MainWindow::sendToGame5()
    {
        udpSocket->writeDatagram(UdpDataToGame.toStdString().data(), QHostAddress(gamePC5.GameIp), gamePC5.GamePort);
        qDebug()<<gamePC5.GameIp;
    }
    void MainWindow::sendToGame6()
    {
        udpSocket->writeDatagram(UdpDataToGame.toStdString().data(), QHostAddress(gamePC6.GameIp), gamePC6.GamePort);
        qDebug()<<gamePC6.GameIp;
    }
    void MainWindow::sendToGame7()
    {
        udpSocket->writeDatagram(UdpDataToGame.toStdString().data(), QHostAddress(gamePC7.GameIp), gamePC7.GamePort);
        qDebug()<<gamePC7.GameIp;
    }
    void MainWindow::sendToGame8()
    {
        udpSocket->writeDatagram(UdpDataToGame.toStdString().data(), QHostAddress(gamePC8.GameIp), gamePC8.GamePort);
        qDebug()<<gamePC8.GameIp;
    }
    
    void MainWindow::sendUdpData()
    {
        //向游戏发送Play指令
        QTimer::singleShot( gamePC1.DelayTime, this, SLOT(sendToGame1()) );
        QTimer::singleShot( gamePC2.DelayTime, this, SLOT(sendToGame2()) );
        QTimer::singleShot( gamePC3.DelayTime, this, SLOT(sendToGame3()) );
        QTimer::singleShot( gamePC4.DelayTime, this, SLOT(sendToGame4()) );
        QTimer::singleShot( gamePC5.DelayTime, this, SLOT(sendToGame5()) );
        QTimer::singleShot( gamePC6.DelayTime, this, SLOT(sendToGame6()) );
        QTimer::singleShot( gamePC7.DelayTime, this, SLOT(sendToGame7()) );
        QTimer::singleShot( gamePC8.DelayTime, this, SLOT(sendToGame8()) );
    
        //向4D系统发送启动指令
        udpSocket->writeDatagram(UdpDataTo4DSystem.toStdString().data(), QHostAddress(FourDSystemIp), FourDSystemPort);
    }
    
    void MainWindow::on_pushButton_clicked()
    {
        sendUdpData();
    }
  • 相关阅读:
    RTP 协议
    RTSP 协议分析 (一)
    RTSP协议分析(二)
    CreateRemoteThread简单应用
    函数开始处的MOV EDI, EDI的作用
    eax,ebx,ecx,edx,esi,edi,ebp,esp寄存器的作用
    C++函数调用原理理解
    WinDBG常用断点命令
    利用bu命令下延迟断点
    Windbg 查看SSDT表
  • 原文地址:https://www.cnblogs.com/coolbear/p/7144960.html
Copyright © 2011-2022 走看看