SimpleFOC之ESP32(九)—— WIFI、UDP和TCP



SimpleFOC教程目录:请点击

说明

  • 你一般是怎么看教程的,是不是直接往下翻,找到接线图和代码比划一番结束,所以你也看不到这段话是不是!这让我想起了电影《卧虎藏龙》里碧眼狐狸偷了武功秘籍,但是不识字只能看图比划,而她的徒弟识字,不仅看图还读了心经所以武功超越了师父。文字往往才是核心技术,图片不过是外在的表现形式。
  • simpleFOC的官方代码到上一篇就结束了,网上相关的教程也很少提到无线通信这块。电机控制是个很硬件的技术,无论是电路设计还是嵌入式编程;而无线通信因为协议的复杂性,更适合厂家以接口函数的方式提供给用户,所以更像软件编程。两者结合非常有跨界感。
  • 一般有两年以上工作经验的嵌入式工程师,用惯了keil,习惯了直接操作寄存器或者底层函数的安全感,根本接受不了arduino这种软件化的编程方式。这就像是右手拿筷子吃饭的人很难再学会左手拿筷子,不是学不会而是觉得没必要,不愿学。
  • 本人18年开始接触arduino,这几年见证了这个平台的飞速发展,各芯片厂家通过提供底层驱动与arduino平台对接,arduino再以统一的函数提供给用户,这样无论用什么芯片,编程都是一样的,也不用考虑底层,所以非常方便。这一点很像当年C语言代替汇编编程,当然目前arduino还处于发展阶段。(用keil编程时,如果有些芯片的驱动你不想自己写,百度也没找到合适的,完全可以到arduino的网站搜下,找到芯片的Arduino Library,稍微修改下就可以成为你的了,省心靠谱,这个技术我一般不告诉别人!)

一、网络通信

  • 考虑到读这篇文章的同学比较偏硬件,所以从最基本的知识点切入,先通过网络调试助手演示通信过程。
  • 四个概念
    • 1、UDP(User Datagram Protocol),利用 IP 提供面向无连接的通信服务,不提供复杂的控制机制,所以速度很快。
    • 2、TCP(Transmission Control Protocol),提供面向有连接的通信传输,三次握手、四次挥手、确认应答、超时重发,数据传输可靠性高。
    • 3、AP(Access Point),提供无线接入服务,允许其它无线设备接入提供数据访问,路由器工作在该模式。
    • 4、Sta(Station), 类似于无线终端,Sta本身并不接受无线的接入,它可以连接到AP,无线网卡工作在该模式。

1.1、准备工作

1.1.1、网络调试助手
在这里插入图片描述

1.1.2、ipconfig查看本机地址,

  • 最好是两台电脑之间通信,一台电脑运行两个调试软件也可以。
    在这里插入图片描述
    在这里插入图片描述

1.2、UDP通信

  • UDP不需要事先建立连接,只要知道对方的IP和端口号就可以发送数据,
    在这里插入图片描述
    在这里插入图片描述

1.3、TCP通信

  • TCP通信分为server和client,先设置好server,client连接server建立连接,才能发送数据,
    在这里插入图片描述
    在这里插入图片描述

二、硬件准备

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

ESP32drive 购买链接:https://item.taobao.com/item.htm?ft=t&id=662591519566,图锐科技

USB转TTL,最好能提供较强的3.3V供电能力,比如板载AMS1117-3.3芯片,这样可以不用12V外部供电,
在这里插入图片描述

三、代码参考

  • ESP32的arduino库提供非常多的示例,可以参考,
    在这里插入图片描述
  • Arduino官方的wifi库可以详细了解函数的用法
    在这里插入图片描述

四、代码演示

4.1、WIFI_AP模式UDP通信

ESP32模块配置为AP模式,电脑连接ESP32,发送指令控制ESP32的板载LED亮灭。

  • 4.1.1、编译上传代码
//此代码演示,ESP32做为热点,电脑连接ESP32
//连接热点后,ESP32给电脑分配IP,电脑向指定的IP和端口发送数据,192.168.4.1 , 1234
//网络调试助手向ESP32发送 on ,LED指示灯亮;发送 off ,LED指示灯灭
//wifi库函数用法请参考:https://www.arduino.cc/en/Reference/WiFi
//请阅读教程《SimpleFOC之ESP32(九)—— WIFI、UDP和TCP通信》:https://blog.csdn.net/loop222/article/details/121201638

#include <WiFi.h>

#define LEDpin 2
#define LEDoff digitalWrite(LEDpin, LOW)
#define LEDon  digitalWrite(LEDpin, HIGH)

const char* ssid = "ESP32drive";   //AP名称
const char* pswd = "123456abcd";   //AP密码,至少8位

uint16_t udp_port = 1234;  //端口号,ESP32默认IP:192.168.4.1

WiFiUDP udp;

int recv_length;
char recvbuff[255];  //存储接收到的数据

//*******************************************************************************************
void setup() {
  pinMode(LEDpin, OUTPUT);
  LEDon;
  
  Serial.begin(115200);
  Serial.println("AP mode:");
  
  WiFi.mode(WIFI_AP);
  WiFi.softAP(ssid,pswd);          //建立热点
  
  Serial.print(WiFi.softAPIP());   //串口打印模块IP和端口号 192.168.4.1,1234
  Serial.print(",");
  Serial.println(udp_port);
  
  udp.begin(udp_port);             //启动UDP监听端口,等待电脑发送数据
  Serial.println("Ready!");
}
//*******************************************************************************************
void loop() {
  int recv_length=udp.parsePacket();    //获取接收的数据的长度
  if(recv_length)                       //如果有数据那么recv_length不为0
  {
    int len = udp.read(recvbuff, 255);  //读取数据到recvbuff中
    if (len > 0)
    {
      if( ( strcmp(recvbuff,"on") )==0 )LEDon;        //判断收到的数组为on,LED亮
      else if( ( strcmp(recvbuff,"off") )==0 )LEDoff; //off,LED灭
      
      Serial.println(recvbuff);  //串口打印网口收到的数据
    }
    
    //将接收到的数据发送回去
    udp.beginPacket(udp.remoteIP(),udp.remotePort());  //准备发送数据到目标IP和目标端口
    udp.print("Receive:");
    udp.println(recvbuff);  //数据放入发送的缓冲区
    udp.endPacket();              //发送
    
    for(int i=0;i<255;i++)     //清空接收数组
    {recvbuff[i] = 0;}
  }
}
//*******************************************************************************************
  • 4.1.2、ESP32上电运行,笔记本连接ESP32,ESP32给笔记本分配IP,
    在这里插入图片描述
  • 4.1.3、UDP发送指令,
    在这里插入图片描述

4.2、WIFI_STA模式TCP client通信

网络调试助手配置为TCP server模式,ESP32连接电脑,网络调试助手发送指令控制板载LED亮灭。

  • 4.2.1、编译上传代码,
//此代码演示,ESP32连接路由器,所以需要输入路由器的ID和密码
//连接路由器后,向指定的网址和端口发送数据,所以需要先设置好网络调试助手
//网络调试助手向ESP32发送 on ,LED指示灯亮;发送 off ,LED指示灯灭
//wifi库函数用法请参考:https://www.arduino.cc/en/Reference/WiFi
//请阅读教程《SimpleFOC之ESP32(九)—— WIFI、UDP和TCP通信》:https://blog.csdn.net/loop222/article/details/121201638

#include <WiFi.h>

#define LEDpin 2
#define LEDoff digitalWrite(LEDpin, LOW)
#define LEDon  digitalWrite(LEDpin, HIGH)

const char* ssid = "TP-LINK123";   //路由器的ID和密码
const char* pswd = "123456abcd";

const char * ServerAddress = "192.168.1.106";  //网络调试助手设置的IP和端口,通过ipconfig获取电脑IP
const int ServerPort = 1234;            //网络调试助手设置的端口号

WiFiClient client;

//*******************************************************************************************
void setup()
{
  pinMode(LEDpin, OUTPUT);
  LEDon;
  
  Serial.begin(115200);
  delay(10);
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, pswd);   //开始连接路由器wifi
  while(WiFi.status() != WL_CONNECTED) {
    delay(500);             //没有连接上,每隔0.5秒打印一个.
    Serial.print(".");
  }
  
  Serial.println("WIFI connected!");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());   //查看路由器分配给ESP32的IP
  Serial.print("ESP Mac Address: ");
  Serial.println(WiFi.macAddress());

  if(client.connect(ServerAddress,ServerPort)){   //连接TCP server
    Serial.println("server connected");   //连上服务器
  }
  LEDoff;
}
//*******************************************************************************************
void loop(){
  if(WiFi.status() != WL_CONNECTED) {
    Serial.println("wifi disconnect"); //关闭路由器后打印
    WiFi.disconnect();                 //断开连接
    delay(1000);
  }
  if(!client.connected()){
    Serial.println("server closed");   //关闭服务器后打印
    client.stop();
    delay(1000);
  }
  if(client.available() > 0)
  {
    //百度Arduino String,可以找到string的很多用法
    String line = client.readString();
    if(line.equalsIgnoreCase("on"))LEDon;        //LED亮,判断字符串是否相等,忽略大小写
    else if(line.equalsIgnoreCase("off"))LEDoff; //LED灭
    
    Serial.println(line);
    line = "";   //清空接收字符串
  }
}
//*******************************************************************************************
  • 4.2.1、电脑上建立TCP server,等待ESP32连接,连接后发送指令,控制LED亮灭,
    在这里插入图片描述

五、UDP通信控制电机

5.1、硬件准备

  • 用电池更能提现无线通信的简洁,
    在这里插入图片描述

ESP32drive 购买链接:https://item.taobao.com/item.htm?ft=t&id=662591519566,图锐科技
电机 购买链接:https://item.taobao.com/item.htm?ft=t&id=643573104607,图锐科技

5.2、代码演示

5.2.1、串口通信更改为UDP通信

  • 在 电流闭环控制Lowside 的代码基础上更改,
    在这里插入图片描述

5.2.2、笔记本连接AP

  • ESP32配置为AP模式,
    在这里插入图片描述

5.2.3、UDP发送指令

在这里插入图片描述

5.2.4、观察电机运动

在这里插入图片描述

写后感

  • 24
    点赞
  • 113
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
以下是Arduino ESP32自动重连WiFiTCP的代码示例: ```c++ #include <WiFi.h> #include <WiFiClient.h> #include <WiFiMulti.h> #include <WiFiClientSecure.h> #include <ESPmDNS.h> #include <WiFiUdp.h> #include <ArduinoJson.h> const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; const char* host = "your_host"; const int port = 8080; WiFiMulti wifiMulti; WiFiClient client; void setup() { Serial.begin(115200); wifiMulti.addAP(ssid, password); // 添加WiFi网络 } void loop() { if ((wifiMulti.run() == WL_CONNECTED) && (client.connected() == false)) { // 检查是否连接WiFiTCP Serial.println("WiFi connected"); Serial.println("Connecting to server..."); if (client.connect(host, port)) { // 连接TCP服务器 Serial.println("TCP connected"); } else { Serial.println("TCP connection failed"); } } if (client.connected() && client.available()) { // 检查TCP连接和数据 String response = client.readStringUntil('\n'); Serial.println(response); } if (!client.connected()) { // 若TCP连接断开,重连 client.stop(); delay(1000); if (wifiMulti.run() == WL_CONNECTED) { client.connect(host, port); } } } ``` 该代码使用WiFiMulti库添加WiFi网络并检查连接状态,使用WiFiClient库连接TCP服务器并检查连接状态和数据,如果连接中断,则使用client.stop()断开连接并等待1秒钟,然后尝试重新连接。注意,该代码仅适用于单个TCP连接。如果需要处理多个TCP连接,则需要使用WiFiClient类的数组。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值