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(); }