基于Qt的简单arduino上位机

day02

使用Qt上位机获取esp8266nodemcu的相关数据并插入数据库中,旨在实现相关控制与插入功能,后续的数据可视化可以参考大佬们的demo

文章目录

  • day02
  • 一、准备工作
  • 二、QT上位机
    • 代码如下
    • 2.建立界面如图:
    • 3.接受信息:
    • 4.发送信息:
  • 总结
  • 学习内容:


一、准备工作

一块esp8266,安装arduinoIDE、Qt、navecate、mysql/**若没有mysql可直接采用sqllist。

二、QT上位机

通信协议采用UDP(TCP同理),通过ip地址与端口实现数据获取与显示,主要用到socket。

代码如下

por文件添加network、与sql。

QT       += core gui network
QT       += sql

cpp文件。


2.建立界面如图:

基于Qt的简单arduino上位机_第1张图片
绑定端口(.cpp程序)

void Widget::on_pushButton_2_clicked()
{

    My_Port = ui->MyPort_Edit->text();
    //My_Port为string类型,bind为int型
    //绑定端口号,监听发送到端口的所有信息
    m_udpSocket->bind(My_Port.toUInt());
}

这里的m_udpSocket为自定义的QUdpSocket指针


3.接受信息:

f1 udpsocket了解udp通信下的接受信号与槽,连接信号与槽实现数据显示;
参考
基于Qt的简单arduino上位机_第2张图片
注意socket套接字触发的信号

// 接受信息代码:
//接受信息
void Widget::recevMsg()
{
    QHostAddress clientIP;
    quint16 clientPort;

    char buf[1024]={0};
    while (m_udpSocket->hasPendingDatagrams()) {
        m_udpSocket->readDatagram(buf,sizeof(buf),&clientIP,&clientPort);
        //定义数据格式
        QString str = QString("[%1,%2] %3").arg(clientIP.toString()).arg(clientPort).arg(buf);
        ui->textEdit->setPlainText(str);
    }

//    ui->textEdit->clear();
    //参考csdn大佬方式
//    QByteArray ba;
//       while(m_udpSocket->hasPendingDatagrams())
//       {
//           ba.resize(m_udpSocket->pendingDatagramSize());
//           m_udpSocket->readDatagram(ba.data(), ba.size());
//       }
}

4.发送信息:

下面展示一些 内联代码片注意:socket通信下port为int型,所以要用qint!!!.

void Widget::on_pushButton_clicked()
{
    //获取发送内容
    QString Data = ui->lineEdit->text();
    //获取IP号
    qDebug()<<Data;
    QString Any_IP = ui->AnyIP_Edit->text();
    //获取目标端口
    qint16 Any_Port = ui->AnyPort_Edit->text().toUInt();
    if(ui->MyPort_Edit->text()=="")
    {
       QMessageBox::warning(this,"erro","pesale open your listen port");
    }
    else{
        m_udpSocket->writeDatagram(Data.toUtf8(),QHostAddress(Any_IP),Any_Port);
    }
}

总结

使用到简单的udp通信,并无扩展,在arduino,端进行简单的数据处理及可实现无线控制。非常简单。下面为测试效果。
基于Qt的简单arduino上位机_第3张图片

学习内容:

1、QT界面设计
2、 Udpsocket通信
3、 信号和槽的复习


后期目标实习对视频流数据的接受,实现无线视频传输。

下面展示一些 内联代码片

// A code block
以下是简单的arduino程序
// An highlighted block
#include <ESP8266WiFi.h>
#include <string.h>
//#include 

int a = 0;
const char *ssid = "yunyida_2020"; //wifi名称
const char *password = "yunyidakeji2020";//WiFi密码

const IPAddress serverIP(192, 168, 0, 125); //与访问的地址
uint16_t serverPort = 8080; //服务器端口

WiFiClient client; //声明一个客户端对象,用于与服务器进行连接

void setup() {
  Serial.begin(115200);
  // put your setup code here, to run once:

  //引脚设置
  //控制
  pinMode(16, OUTPUT); //D0
  pinMode(5, OUTPUT); //D1

  //指示灯
  pinMode(2, OUTPUT); //D5
  //初始化
  digitalWrite(16, LOW);
  digitalWrite(5, LOW);
  digitalWrite(2, LOW);

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println("Connected");
  Serial.print("IP Adress:");
  Serial.println(WiFi.localIP());
  Serial.println(serverIP);


}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.println("尝试访问服务器");
  Serial.println(serverIP);
  Serial.println(serverPort);
  LEDsate();
  connectserver();
  sendserialdata();

}

//检测连接状态
void LEDsate()
{
  if (client.connected())
  {
    a = 1;
  }
  if (a == 0) {
    digitalWrite(2, HIGH);
    delay(500);
    digitalWrite(2, LOW);
    delay(500);
    //    Serial.println("no");
  } else {
    digitalWrite(2, LOW);
  }
}

void connectserver()
{
  if (client.connect(serverIP, serverPort)) //尝试访问目标地址
  {
    digitalWrite(2, HIGH);
    Serial.println("访问成功");

    //        client.print("Hello world!");

    //向服务器发送数据
    client.print("2077.11");
    while (client.connected() || client.available()) //如果已连接或有收到的未读取的数据
    {
      if (client.available()) //如果有数据可读取
      {
        String line = client.readStringUntil('\n'); //读取数据到换行符
        //                String id(line.substr(2,2));

        Serial.print("读取到数据:");
        Serial.println(line);

        /*把string数组转变为char[]以便对数组拆分
        */
        //转换
        char str[20];
        int i;
        for (i = 0; i < line.length(); ++i)
        {
          str[i] = line[i];
        }
        str[i] = '\0';
        //                Serial.println(str);

        //拆分
        char *Id_str, *Action_str;
        Id_str = strtok(str, ".");
        Action_str = strtok(NULL, ".");
        String ID = Id_str;
        String ACTION = Action_str;
        Serial.print("ID号:");
        Serial.println(ID);
        Serial.print("动作:");
        Serial.println(ACTION);

        if (ID == "2077")
        {
          if (ACTION == "00")
          {
            digitalWrite(16, LOW);
            digitalWrite(5, LOW);
            client.write("all close!!");
          }
          else if (ACTION == "01")
          {
            digitalWrite(16, LOW);
            digitalWrite(5, HIGH);
            client.write("Only right open!!");
          }
          else if (ACTION == "10")
          {
            digitalWrite(16, HIGH);
            digitalWrite(5, LOW);
            client.write("Only left open!!");
          }
          else if (ACTION == "11")
          {
            digitalWrite(16, HIGH);
            digitalWrite(5, HIGH);
            client.write("all open!!");
          }
          else
          { 
            client.write("input erro!!,please Check the input instructions(^_^)");
          }
        }
        else
        {
          Serial.println("关我屁事!!");
        }
      }
    }
    Serial.println("关闭当前连接");
    client.stop(); //关闭客户端
  }
  else
  {
    Serial.println("访问失败");
    client.stop(); //关闭客户端

  }
}

//串口数据发送到服务器
void sendserialdata()
{
  if(Serial.available()){ //串口读取到的转发wifi,因为串口是一位一位的发送,所以先缓存再发送
    size_t counti = Serial.available();
    uint8_t sbuf[counti];
    Serial.readBytes(sbuf,counti);
    if(client.connected())
    {
      client.write(sbuf,counti);
      delay(200);
    }
  }
}

你可能感兴趣的:(qt)