概述
文章目录
- 前言
- 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上位机的编写总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复