基于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.建立界面如图:

绑定端口(.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通信下的接受信号与槽,连接信号与槽实现数据显示;
参考

注意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,端进行简单的数据处理及可实现无线控制。非常简单。下面为测试效果。

学习内容:
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); //D0pinMode(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);}}
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
