我是靠谱客的博主 笨笨发带,最近开发中收集的这篇文章主要介绍使用MSP432+ESP8266+QT制作上位机进行WIFI通信前言1.MSP432P401R数据的串口传输2.ESP8266读取串口数据并发送3.QT上位机的编写总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

  • 前言
  • 1.MSP432P401R数据的串口传输
  • 2.ESP8266读取串口数据并发送
  • 3.QT上位机的编写
  • 总结


前言

在进行电子设计的过程中,常常会有需要进行WIFI传输的要求,我们使用ESP8266接收MSP432的串口数据,通过TCP/IP协议进行数据传输,利用QT编写上位机在手机端进行数据的显示可以完成项目的要求。


1.MSP432P401R数据的串口传输

MSP432P401R具有四个串口,我们使用串口3进行与ESP8266的数据传输,我们在主程序中编写串口的发送,注意MSP432串口的RX应与ESP8266的TX相连,MSP432串口的TX应与ESP8266的RX相连,同时两个模块需要共地连接,同时收发两端的波特率需要相同。
串口发送代码如下:

                USARTA3_SendString(SEND_APP);
                for(i=0; i<flag_period; i++)
                {
                    if(i == 0)
                    {
                        sprintf((char *)SEND_APP, "s%d ", ADC_INT_Value[i]*2);
                        USARTA3_SendString(SEND_APP);
                    }
                    else if(i < flag_period - 1)
                    {
                        sprintf((char *)SEND_APP, "%d ", ADC_INT_Value[i]*2);
                        USARTA3_SendString(SEND_APP);
                    }
                    else
                    {
                        sprintf((char *)SEND_APP, "%de", ADC_INT_Value[i]*2);
                        USARTA3_SendString(SEND_APP);
                    }
                }




在这里插入图片描述
在这里插入图片描述

2.ESP8266读取串口数据并发送

在这一步中我们需要用ESP8266读取串口数据并存储在数组中,连接WIFI网络和WIFI服务器通过TCP/IP协议进行数据传输,其中我们的手机将充当服务器端,ESP8266作为客户端,对于ESP8266的控制,我们不使用AT指令集,而是通过ARDUINO IDE单独为其烧录代码以增强程序的初始化速度。当然通过MCU向ESP8266发送AT指令集也是一种很好的控制方法。ARDUINO中的代码如下:

#include <ESP8266WiFi.h>
#define led 2 
const char *ssid     = "";//这里写入网络的ssid
const char *password = "";//wifi密码
const char *host = "";//修改为Server服务端的IP,即你电脑的IP,确保在同一网络之下。
WiFiClient client;//声明一个客户端对象,用于与服务器进行连接
const int tcpPort = ;//修改为你建立的Server服务端的端口号,此端口号是创建服务器时指定的。
static String comdata = "";
static String val = "";
void setup()
{
    Serial.begin(115200);    
    pinMode(led,OUTPUT);
    delay(10);
    Serial.println();
    Serial.print("Connecting to ");
    Serial.println(ssid);
    WiFi.begin(ssid, password);//启动
     //在这里检测是否成功连接到目标网络,未连接则阻塞。
    while (WiFi.status() != WL_CONNECTED)
    {
        delay(500);
    }
 //几句提示
    Serial.println("");
    Serial.println("WiFi connected");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
}
void loop()
{
/******************串口接受数据************************/
  while (Serial.available() > 0) // 串口收到字符数大于零。
  {   
  comdata += char(Serial.read());
  }
 /******************串口打印数据************************/ 
  if(comdata!="")//如果接受到数据
  {
    client.print(comdata);//向服务器发送数据 
   }
   comdata="";//清空数据
  if (client.connected()) //尝试访问目标地址,如果没连接上LED灯灭
    digitalWrite(led, LOW);
  else
    digitalWrite(led, HIGH);

  while (!client.connected())
  {
    if (!client.connect(host, tcpPort))
    {
       Serial.println("连接中....");
       delay(500);
    }    
  }
  while (client.available())//available()表示是否可以获取到数据
  {
//    char val = client.read();//read()表示从网络中读取数据。
     while (client.available() > 0) // 串口收到字符数大于零。
    {   
    val += char(client.read());
    }
    client.print("text:"+val); 
    val="";//清空数据
   }
  delay(1);
}

3.QT上位机的编写

Qt 是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。
是用QT for andoroid 可将windows程序通过OTG模式下载到安卓手机上,从而实现跨平台的应用程序开发。在QT中我们主要进行UI框架的定义和服务器接收数据的解析和显示,主要的程序代码如下:

#include "widget.h"
#include <QtCharts>         // 导入QtCharts所有的头文件,也可以单独导入某一个

// 引入qchart命名空间(注意:如果是在ui中提升为QChartView,
// 则QT_CHARTS_USE_NAMESPACE一定要放在#include "ui_widget.h"前面,否则编译会失败)
QT_CHARTS_USE_NAMESPACE

#include "ui_widget.h"
QString front="";
int p1=0,p2=0,i=0;
QSplineSeries* series = new QSplineSeries();   // 创建一个样条曲线对象


Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    tcpServer = new QTcpServer(this);
    tcpSocket = new QTcpSocket(this);
    connect(tcpServer,SIGNAL(newConnection()),this,SLOT(newConnection_Slot()))
}
Widget::~Widget()
{
    delete ui;
}
void Widget::newConnection_Slot()
{
     tcpSocket = tcpServer->nextPendingConnection();
     connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readyRead_Slot()));
}
void Widget:: readyRead_Slot()
{
    QString buf;


    buf = tcpSocket->readAll();
    front+=buf;
    int t,a,b,c,d,s,e;
    t=front.indexOf("t");
    a=front.indexOf("a");
    b=front.indexOf("b");
    c=front.indexOf("c");
    d=front.indexOf("d");
    s=front.indexOf("s");
    e=front.indexOf("e");
    if(t!=-1&&a!=-1&&t<=a)//THD
    {

        ui->label_15->setText(front.mid(t+1,a-t-1));
        //qDebug()<<"THD"<<front.mid(t+1,a-t-1)<<'n';
    }
    if(a!=-1&&b!=-1&&a<=b)//二次
    {

        ui->label_6->setText(front.mid(a+1,b-a-1));
     
    }
    if(b!=-1&&c!=-1&&b<=c)//三次
    {

        ui->label_19->setText(front.mid(b+1,c-b-1));
       
    }
    if(c!=-1&&d!=-1&&c<=d)//4次
    {

        ui->label_4->setText(front.mid(c+1,d-c-1));
      
    }
    if(d!=-1&&s!=-1&&d<=s)//5次
    {

        ui->label_5->setText(front.mid(d+1,s-d-1));
    
    }
    if(s!=-1)
    {
        front.remove(0,s);
        if(front.size()!=1)
        {
            while(1)
            {
                if(p1+1<front.size()&&front.at(++p1)==' ')
                {
                  
                    series->append( i++,front.mid(++p2,p1-p2).toInt());
                    p2=p1;
                }
                if(p1+1>=front.size())break;
             }



        }
        if(e!=-1&&p1==e)
        {
            series->setName("曲线");
            QChart* chart = ui->chartview->chart();    // 获取一个chart用于管理不同类型的series和其他图表相关对象
            chart->legend()->hide();                   // 隐藏图例
            chart->addSeries(series);                  // 添加创建好的曲线图对象
            chart->setTitle("信号波形显示");           // 设置标题
            chart->createDefaultAxes();                // 基于已添加到图表中的

            ui->chartview->setRenderHint(QPainter::Antialiasing);  // 设置抗锯齿
            p1=p2=0;i=0;
            front.remove(0,p1+1);
            //series->clear();
        }
    }
}
void Widget::on_pushButton_clicked()
{
    quint16 a=8266;
    tcpServer->listen(QHostAddress::Any,a);
    ui->pushButton_2->setDisabled(false);
    QString j="1";
    ui->label_18->setText(j);
}

void Widget::on_pushButton_2_clicked()
{
    tcpServer->close();
   tcpServer->disconnect( SIGNAL(newConnection()))  ;
    //tcpSocket->deleteLater();///>不立即销毁对象,向主消息循环发送了一个event,下一次主消息循环收到这个event之后才会销毁对象
     ui->pushButton_2->setDisabled(true);
     QString jj="0";
     ui->label_18->setText(jj);
       ui->label_15->setText(jj);
        ui->label_6->setText(jj);
        ui->label_19->setText(jj);
        ui->label_4->setText(jj);
        ui->label_5->setText(jj);
        series->clear();
}

显示效果如下
在这里插入图片描述

在这里插入图片描述

总结

在WIFI上位机实现的过程中遇到了很多的BUG,例如AT指令集无法识别,服务器连接不稳定,数据解析,供电不足,QT上位机无法正常工作等等问题,最终大部分都找到了可行的解决办法。

最后

以上就是笨笨发带为你收集整理的使用MSP432+ESP8266+QT制作上位机进行WIFI通信前言1.MSP432P401R数据的串口传输2.ESP8266读取串口数据并发送3.QT上位机的编写总结的全部内容,希望文章能够帮你解决使用MSP432+ESP8266+QT制作上位机进行WIFI通信前言1.MSP432P401R数据的串口传输2.ESP8266读取串口数据并发送3.QT上位机的编写总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部