使用MSP432+ESP8266+QT制作上位机进行WIFI通信


前言

在进行电子设计的过程中,常常会有需要进行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上位机无法正常工作等等问题,最终大部分都找到了可行的解决办法。

  • 6
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
要实现MSP430与ESP8266之间的通信,您可以使用UART(串口)通信。以下是一个简单的步骤和示例代码来帮助您开始: 步骤1:确保UART引脚连接 首先,您需要将MSP430的UART发送引脚(TX)连接到ESP8266的UART接收引脚(RX),并将MSP430的UART接收引脚(RX)连接到ESP8266的UART发送引脚(TX)。 步骤2:初始化UART 在MSP430上初始化UART配置,以便与ESP8266进行通信。这包括设置波特率、数据位、停止位、校验位等。 步骤3:发送数据到ESP8266 使用UART发送函数将数据从MSP430发送到ESP8266。 步骤4:接收来自ESP8266的数据 使用UART接收函数从ESP8266接收数据。 以下是一个简单的示例代码,用于MSP430与ESP8266之间的UART通信: ```c #include <msp430.h> void UART_Init() { // 设置UART引脚 P1SEL |= BIT1 + BIT2; P1SEL2 |= BIT1 + BIT2; // 设置波特率为115200 UCA0CTL1 |= UCSSEL_2; UCA0BR0 = 9; UCA0BR1 = 0; UCA0MCTL = UCBRS_1; // 使能UART接收和发送 UCA0CTL1 &= ~UCSWRST; IE2 |= UCA0RXIE; } void UART_SendChar(unsigned char data) { while (!(IFG2 & UCA0TXIFG)); // 等待发送缓冲区为空 UCA0TXBUF = data; // 发送数据 } unsigned char UART_ReceiveChar() { while (!(IFG2 & UCA0RXIFG)); // 等待接收缓冲区有数据 return UCA0RXBUF; // 返回接收到的数据 } void main(void) { WDTCTL = WDTPW + WDTHOLD; // 停用看门狗定时器 UART_Init(); // 初始化UART while (1) { // 向ESP8266发送数据 UART_SendChar('H'); UART_SendChar('e'); UART_SendChar('l'); UART_SendChar('l'); UART_SendChar('o'); // 接收ESP8266发送的数据 unsigned char receivedData = UART_ReceiveChar(); // 处理接收到的数据 // ... } } ``` 这个示例代码展示了MSP430与ESP8266之间的基本UART通信。您可以根据自己的需求进行修改和扩展。 请注意,此示例代码仅供参考,您需要根据您的具体硬件和通信需求进行适当的修改。 希望这可以帮助您开始MSP430与ESP8266之间的通信。如果您有任何进一步的问题,请随时提问!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值