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

article/2025/5/18 15:13:34

目录

  • 说明
  • 一、网络通信
    • 1.1、准备工作
    • 1.2、UDP通信
    • 1.3、TCP通信
  • 二、硬件准备
  • 三、代码参考
  • 四、代码演示
    • 4.1、WIFI_AP模式UDP通信
    • 4.2、WIFI_STA模式TCP client通信
  • 五、UDP通信控制电机
    • 5.1、硬件准备
    • 5.2、代码演示
      • 5.2.1、串口通信更改为UDP通信
      • 5.2.2、笔记本连接AP
      • 5.2.3、UDP发送指令
      • 5.2.4、观察电机运动
  • 写后感


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 购买链接:某宝购买

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.1WiFiUDP 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,1234Serial.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);   //开始连接路由器wifiwhile(WiFi.status() != WL_CONNECTED) {delay(500);             //没有连接上,每隔0.5秒打印一个.Serial.print(".");}Serial.println("WIFI connected!");Serial.print("IP address: ");Serial.println(WiFi.localIP());   //查看路由器分配给ESP32的IPSerial.print("ESP Mac Address: ");Serial.println(WiFi.macAddress());if(client.connect(ServerAddress,ServerPort)){   //连接TCP serverSerial.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 购买链接:某宝购买
    带编码器电机 购买链接:某宝购买

5.2、代码演示

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

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

5.2.2、笔记本连接AP

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

5.2.3、UDP发送指令

在这里插入图片描述

5.2.4、观察电机运动

在这里插入图片描述

写后感

  • 就本文描述的UDP通信,搁十年前用有线的方式实现,硬件设计+软件调试,经验丰富的工程师怎么也得大半年捣腾,什么PHY,网口隔离变压器,还要移植LWIP,方方面面都要考虑。现在三天,最多一星期就可以实现。技术进步又方便又可怕,跟不上技术发展的老工程师就得被淘汰。
  • 无线通信是ESP的“看家”技术,博大精深,展开了半年也写不完,本文只讲几个最基本的应用,对物联网有兴趣的同学可以深入研究!


    (完)


    欢迎加入simpleFOC技术交流群:923734429 群已满根据提示添加新群 (入群申请写:CSDN)


    请继续阅读相关文章:
    SimpleFOC之ESP32(一)—— 搭建开发环境
    SimpleFOC之ESP32(二)—— 开环控制
    SimpleFOC之ESP32(三)—— 闭环控制
    SimpleFOC之ESP32(四)—— 电流闭环控制Inline
    SimpleFOC之ESP32(五)—— 电流闭环控制Lowside
    SimpleFOC之ESP32(六)—— 双电机控制
    SimpleFOC之ESP32(七)—— 霍尔电机
    SimpleFOC之ESP32(八)—— ABZ编码器电机
    SimpleFOC之ESP32(九)—— WIFI、UDP和TCP
    SimpleFOC之ESP32(十)—— ESP-NOW和力矩反馈

http://chatgpt.dhexx.cn/article/Zo3uPTfe.shtml

相关文章

如何进行网络编程(代码利用UDP socket实现)

目录 一、什么是网络编程&#xff1f; 二、那么在Java中能调用C语言的函数吗&#xff1f; 三、操作系统提供的socket API主要有两类&#xff08;实际上不止两类&#xff09; 1.流套接字&#xff08;底层使用TCP协议&#xff09; TCP协议的特点&#xff1a; 2.数据报套接字…

北斗系统学习—JT808协议用C语言解析

前言&#xff1a; 本人从事于Linux应用开发(音视频应用方向&#xff09;,现在主要是负者AI摄像头的开发&#xff0c;在学音视频的途中&#xff0c;虽然是个小白&#xff0c;但是更愿意把自己所学音视频的一些知识分享给大家&#xff0c;以后每周都会更新哦&#xff01; 本期介绍…

TCP/IP协议(一、自己动手实现udp)

对TCP/IP协议都只是听过&#xff0c;没有仔细研究过&#xff0c;一些知识体系也比较零散&#xff0c;什么三次握手&#xff0c;四次挥手&#xff0c;滑动窗口&#xff0c;零拷贝技术等等&#xff0c;都是知识有这么个东西&#xff0c;而不知道具体是啥&#xff0c;这几天还是根…

【Linux】传输层协议:UDP和TCP

但人不能永远浪漫下去&#xff0c;那会走向自我毁灭的。浪漫都是水字旁&#xff0c;会把人淹死的。人最终还是要进入一个规则体系&#xff0c;所谓&#xff0c;随心所欲不逾矩嘛 文章目录 一、UDP协议1.端口号2.理解UDP报头3.UDP的特点&#xff08;面向数据报&#xff0c;全双…

Linux网络:UDP协议 | TCP协议

文章目录 前言端口号netstat -- pidof UDP协议TCP协议三次握手 四次挥手确认应答(ACK)机制超时重传机制连接管理机制理解TIME_WAIT状态理解 CLOSE_WAIT 状态 滑动窗口流量控制拥塞控制延迟应答捎带应答面向字节流粘包问题TCP异常情况TCP小结 基于TCP 和 UDP 的应用层协议TCP/UD…

C语言SOCKET编程指南

转载自&#xff1a;http://blog.sina.com.cn/s/blog_79b01f66010163q3.html 这篇文章完全可以作为c语言socket编程指南&#xff0c;无论在任何系统下。感谢作者fenglovel&#xff01; C语言SOCKET编程指南 1、介绍 Socket 编程让你沮丧吗&#xff1f;从man pages中很难得到有…

【socket】从计算机网络基础到socket编程——Windows Linux C语言 + Python实现(TCP+UDP)

一、部分基础知识1.1 计算机网络的体系结构1.11 互联网简介1.12 计算机网络的分类1.13 协议与网络的分层体系结构▶ 协议▶ 网络的分层体系结构 1.14 OSI 七层模型&#xff08;重要&#xff09;▶ OSI 模型的结构▶ OSI 模型各层的功能 1.15 TCP/IP 的体系结构&#xff08;重要…

C语言 C语言基础

C语言 C语言基础 一、简述 对于C语言基础相关方面的表面理解&#xff0c;简单介绍。 二、二进制 生活中常用的是十进制&#xff0c;基数0,1,2,3,4,5,6,7,8,9,。满10进1。 时钟60进制。基数0,1,2...57,58,59。满60进1。60秒为1分钟&#xff0c;60分钟为1小时。 计算机二进制&a…

炼一项专业技能c语言,C语言程序设计_安徽新华电脑专修学院

C语言程序设计&#xff0c;安徽新华电脑专修学院&#xff0c;2013年3月&#xff0c;在安徽省315国际消费者权益日纪念大会暨省消协四届三次理事会会议上&#xff0c;安徽新华电脑专修学院被省消费者协会授予“诚信单位”。 C语言程序设计&#xff0c; 并用c语言进行测试。还有b…

C++中使用UDP Socket发送字节数据

文章目录 参考代码结果展示 参考 这篇文章给的代码也能用 https://blog.csdn.net/qq_36437446/article/details/106446172 CRC代码来自https://blog.csdn.net/huijunma2010/article/details/124151471 在线计算CRC http://www.ip33.com/crc.html 代码 这里的byte是unsigned…

本机UDP收发性能测试

测试内容 测试单机版的UPD客户端和服务端之间的性能&#xff0c;UDP客户端发送数据到UDP服务端&#xff0c;并等待服务端返回&#xff0c;计算出UDP的性能 测试方法 客户端和服务端部署在同一台虚拟机器上&#xff0c;客户端启动多个线程&#xff0c;同时向服务端发送指定数量…

2020复旦大学计算机夏令营机试题

2020复旦大学计算机夏令营机试题 这个是开卷编程&#xff0c;不计入成绩&#xff0c;但是面试会问你做的情况。

复旦大学机试题题解(2017~2021)

前言 尝试把复旦大学历年的机试题做一遍&#xff0c;能做多少是多少了&#xff0c;因为没有数据集所以也不好确认是不是对的~&#xff08;题目来自王道往届学长学姐回忆以及某位热心的同学整理&#xff0c;如果了解来源后&#xff0c;我一定备注来源&#xff09; &#xff08;…

复旦大学:专硕没住宿?我们帮你建!还给补助!

去年&#xff0c;小编发过一篇文章&#xff0c;里面爆出了复旦大学等学校的专硕可能不提供住宿了&#xff1a; 北京大学 上海交通大学 复旦大学 专硕可能不提供住宿&#xff01; 后来&#xff0c;在复旦大学2019年招收攻读硕士学位研究生简章中&#xff0c;学校官方公布了不为专…

复旦大学机试题(2017-2021)

计院2021 1.完全二叉树 给定一颗二叉树&#xff0c;树的每个节点的值为一个正整数。如果从根节点到节点 N 的路径上不存在比节点 N 的值大的节点&#xff0c;那么节点 N 被认为是树上的关键节点。求树上所有的关键节点的个数。请写出程序&#xff0c;并解释解题思路。 例子&a…

三战上岸复旦工研院考研回忆(无干货)

干货链接&#xff1a; 复旦085400电子信息专硕初试经验分享 复旦085400电子信息专硕复试经验分享 复旦软院电子信息初试961真题回忆 说说一下我的考研经历&#xff0c;都是流水账&#xff0c;不涉及干货&#xff08;干货参照其他博客&#xff09;&#xff0c;如果读者能有所借…

2020年复旦大学夏令营机试题及代码(VS2019 C++)

注:代码是本菜鸡自己个儿写的,没有找到参考答案,欢迎各位大佬批评指正. 题目如下图所示&#xff08;图片来源网上&#xff09;: 第1题 该题主要考察拓扑排序.其实该算法有通用模板,但我写的时候没有意识到使用,代码不是很规范. #define _CRT_SECURE_NO_WARNINGS#include &…

复旦大学研究生机试(2019)

1. 计算机学院 今年的题目可以说是挺难的&#xff0c;第一题虽然像是送分题&#xff0c;实际上也不是很简单。第二题第三题是动态规划问题&#xff0c;而且复旦据说会卡大数&#xff0c;今年150人考生据说只有一个AC&#xff0c;大部分人只做出第一题&#xff0c;个别零分。 …

【20保研】2019年复旦大学工程与应用技术研究院全国优秀大学生夏令营通知

点击文末的阅读原文或者公众号界面左下角的保研夏令营或者公众号回复“夏令营”是计算机/软件等专业的所有保研夏令营信息集合&#xff0c;会一直更新的。 为了促进我国高校优秀大学生之间的交流、加强学生对复旦大学工研院的了解、特别是吸引优秀学生继续深造&#xff0c;探索…

复旦大学计算机专业硕士平均工资,在复旦大学当教授“月薪”是多少?这个工资条,让网友非常羡慕!...

文章原创&#xff0c;版权归本作者所有&#xff0c;欢迎个人转发分享 随着中国的高等教育发展的重视&#xff0c;很多的高校也是不负众望&#xff0c;不仅在国内知名度很高&#xff0c;在国外也享有盛誉的。 在中国知名度最高的大学就是清华、北大、复旦等高校&#xff0c;是受…