Qt监控Arduino开关状态(读取串口数据)

Posted 酷熊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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();
}

 

以上是关于Qt监控Arduino开关状态(读取串口数据)的主要内容,如果未能解决你的问题,请参考以下文章

arduino读取一个block值

QT如何将串口读取的temp中的数据赋值给一个字符数组distance[]

请教一个问题,arduino怎么读取一个字节里的某两位数据

读取 Arduino 的串口

arduino接收串口屏指令?

arduino入门-用arduino uno制作基于蓝牙的数据监控系统