STM32第十九天 ESP8266-01S和电脑实现串口通信(2)

1:UDP 传输
UDP 传输不不区分 server 或者 client ,由指令 AT+CIPSTART 建⽴立传输。

  1. 配置 WiFi 模式
    AT+CWMODE=3 // softAP+station mode
    响应 :
    OK
  2. 连接路路由器器
    AT+CWJAP="SSID","password" // SSID and password of router
    响应 :
    OK
  3. 查询 ESP8266 设备的 IP 地址
    AT+CIFSR
    响应 :
    +CIFSR:APIP,"192.168.4.1"
    +CIFSR:APMAC,"1a:fe:34:a5:8d:c6"
    +CIFSR:STAIP,"192.168.101.133"
    +CIFSR:STAMAC,"18:fe:34:a5:8d:c6"
    OK
  4. PC 与 ESP8266 设备连接同⼀一路路由器器,在 PC 端使⽤用⽹网络调试⼯工具,建⽴立⼀一个 UDP 传
    输。
  • 假设,PC 创建的 UDP ⾃自身 IP 地址为 192.168.101.116,端⼝口为 8080。
  1. 后⽂文将基于前述步骤,介绍两种 UDP 通信的示例例。


3.1. 固定远端的 UDP 通信
UDP 通信的远端固定,由 AT+CIPSTART 指令的最后⼀一个参数设置为 0 决定。系统将分配
⼀一个连接号给这个固定连接,UDP 通信双⽅方不不会被其他设备替代。

  1. 使能多连接
    AT+CIPMUX=1
    响应 :

OK

  1. 创建 UDP 传输。例例如,分配连接号为 4,指令如下:
    AT+CIPSTART=4,"UDP","192.168.101.110",8080,1112,0
    响应 :
    4,CONNNECT
    OK
    📖 说明:
    示例例指令中的参数说明如下:
    •**"192.168.101.110", 8080UDP传输的远端IP和端⼝口,即前⽂文步骤4PC建⽴立的UDP端⼝口;
    •**1112ESP8266本地的UDP端⼝口,⽤用户可⾃自⾏行行设置,如不不设置则为随机值;
    0表示当前UDP传输建⽴立后,UDP远端不不会被其他设备更更改;即使有其他设备通过UDP协议发数据到**
    ESP8266 UDP端⼝口1112ESP8266的第4UDP传输的远端也不不会被替换,使⽤用指令**
    "AT+CIPSEND=4, X"发送数据,仍然是当前固定的PC端收到。
  2. 发送数据
    AT+CIPSEND=4,7 // Send 7 bytes to transmission NO.4
    >UDPtest
    // enter the data, no CR
    • <link ID>:⽹网络连接 ID 号 (0 ~ 4),⽤用于多
    连接的情况
    • <length>:数字参数,表明发送数据的⻓长
    度,最⼤大⻓长度为 2048
    响应 :
    Recv 7 bytes
    SEND OK
    注意:
    发送数据时,如果输⼊入的字节数超过了了设置⻓长度(n):
    -系统将提示busy,并发送数据的前
    n
    个字节,发送完成后响应SEND OK
    *-*超出⻓长度的部分数据被认为是⽆无效数据,不不被接受。
  3. 接收数据。 当 ESP8266 设备接收到服务器器发来的数据,将提示如下信息:
    +IPD,4,n:xxxxxxxxxx // received n bytes, data=xxxxxxxxxxx
  4. 断开 UDP 传输
    AT+CIPCLOSE=4
    响应 :
    4,CLOSED
    OK

二:远端可变的 UDP 通信
当使⽤用 AT+CIPSTART 指令创建 UDP 通信,将最后⼀一个参数设置为 2 时,UDP 通信的远
端可改变。

  1. 创建 UDP 传输。
    AT+CIPSTART="UDP","192.168.101.110",8080,1112,2
    响应 :
    CONNNECT
    OK
    (AT+CIPMUX---设置多连接)
    📖 说明:
    示例例指令中的参数说明如下:
    • "192.168.101.110", 8080UDP 传输的远端IP 和端⼝口,即前⽂文PC 建⽴立的UDP端⼝口;
    • 1112ESP8266 本地的UDP端⼝口,⽤用户可⾃自⾏行行设置,如不不设置则为随机值;
    2 表示当前UDP 传输建⽴立后,UDP 传输远端仍然会更更改;UDP传输远端会⾃自动更更改为最近⼀一个与
    ESP8266 UDP通信的远端。

  2. 发送数据
    AT+CIPSEND=7 // Send 7 bytes
    >UDPtest
    // enter the data, no CR
    响应 :
    Recv 7 bytes
    SEND OK
    注意:
    发送数据时,如果输⼊入的字节数超过了了设置⻓长度(n):
    - 系统将提示busy ,并发送数据的前n 个字节,发送完成后响应SEND OK
    *-*超出⻓长度的部分数据被认为是⽆无效数据,不不被接受。

  3. 发送数据到其他指定远端。例例如,发数据到 192.168.101.111, 端⼝口 1000。
    AT+CIPSEND=7,"192.168.101.111",1000 // Send 7 bytes
    >UDPtest
    // enter the data, no CR
    响应 :
    Recv 7 bytes
    SEND OK

  4. 接收数据。 当 ESP8266 设备接收到服务器器发来的数据,将提示如下信息:
    +IPD,n:xxxxxxxxxx // received n bytes, data=xxxxxxxxxxx

  5. 断开 UDP 传输
    AT+CIPCLOSE
    响应 :
    CLOSED
    OK

今日心得:

1:单连接 TCP Client和UDP 传输的区别

1. 连接性质
特性 TCP Client UDP 传输
连接类型 面向连接(需三次握手) 无连接
可靠性 可靠传输(自动重传、数据校验) 不可靠传输(可能丢包/乱序)
数据边界 字节流(无明确边界) 数据报文(保留边界)
传输顺序 保证数据顺序 不保证顺序
AT指令实现差异(以ESP8266为例)

TCP Client 示例

复制代码
AT+CIPSTART="TCP","192.168.1.100",80  # 连接固定服务器
AT+CIPSEND=10                         # 发送10字节数据
> HelloWorld                          # 输入数据
  • 特点:始终发往同一目标,断开需显式AT+CIPCLOSE

UDP 传输示例

复制代码
AT+CIPSTART="UDP","192.168.1.101",9000,0,2  # 可变远端模式
AT+CIPSEND=5,"192.168.1.102",8000   # 临时切换目标
> Hi123                              # 发送数据
  • 特点:无需断开即可切换目标,支持广播

何时选择?

  • TCP Client 当:

    • 需要可靠传输(如固件升级)

    • 与固定服务器通信(如MQTT服务器)

    • 传输大文件/重要数据

  • UDP 传输 当:

    • 需要低延迟(如实时控制)

    • 需广播或动态切换目标

    • 容忍少量丢包(如传感器数据上报)

    • 资源受限环境(内存/CPU有限)

2:

详细解释:UDP通信中的远端IP与近端IP

1. 远端IP vs 近端IP
概念 远端IP 近端IP
定义 通信目标设备的IP地址(数据接收方) 本地设备自身的IP地址(数据发送方)
作用 指定数据要发送到哪个设备 指定从哪个设备端口发出数据
AT指令示例 AT+CIPSTART="UDP","192.168.101.110",8080 本地端口在指令中作为第4个参数(如1112
何时使用 当需要发送数据到特定设备时 当需要绑定本地固定端口接收数据时

关键区别

  • 远端IP是目标:你发给谁(如服务器/另一设备)。

  • 近端IP是源:你是谁(本地设备身份),通常由路由器分配,无需手动设置。

2. 固定远端 vs 可变远端UDP通信
固定远端(参数=0)
  • 特点

    一旦建立连接,所有数据只能发往初始设定的远端IP

  • 指令示例
    AT+CIPSTART="UDP","192.168.101.110",8080,1112,0

    (末尾参数0表示固定远端)

  • 适用场景

    与单一固定设备通信(如固定服务器)。

可变远端(参数=2)
  • 特点

    • 可动态切换目标设备。

    • 自动更新机制 :当其他设备向你的本地端口发送数据时,ESP8266会自动将该设备设为新远端

    • 手动覆盖:可通过指令临时指定新目标。

  • 指令示例
    AT+CIPSTART="UDP","192.168.101.110",8080,1112,2

    (末尾参数2表示可变远端)

  • 适用场景

    需与多个设备通信(如物联网设备群)

3. 为什么后续发送又回到原远端?

在可变远端模式下,远端切换是临时的

  1. 首次发送到新目标

    bash

    复制代码
    AT+CIPSEND=7,"192.168.101.111",1000  # 临时指定新目标
    > UDPtest
    • 此时数据发往 192.168.101.111:1000

    • 但ESP8266的"当前远端"仍为初始值192.168.101.110:8080)。

  2. 后续发送时未指定目标

    bash

    复制代码
    AT+CIPSEND=7          # 未指定目标,使用"当前远端"
    > NextData
    • 数据会自动发回初始远端192.168.101.110:8080),因为未覆盖目标。

3.远端自动更新的条件

只有当其他设备主动发送数据到你的本地端口 时,ESP8266才会更新"当前远端"。

(例如:若192.168.101.111向你的端口1112发送数据,后续AT+CIPSEND=7会发往该设备)

核心总结

场景 远端选择逻辑
固定远端模式 永远发往初始设定的IP
可变远端模式 + 指定目标 临时覆盖目标(仅本次生效)
可变远端模式 + 未指定目标 发往"当前远端"(初始值 或 最后一次主动与你通信的设备)
更新"当前远端"的方法 其他设备需主动发送数据到你的本地端口

操作建议

若需持续与某新设备通信,每次发送时显式指定目标IP,或确保该设备先向你的端口发送数据以触发自动更新。

相关推荐
国科安芯6 小时前
ASP4644芯片低功耗设计思路解析
网络·单片机·嵌入式硬件·安全
充哥单片机设计6 小时前
【STM32项目开源】基于STM32的智能厨房火灾燃气监控
stm32·单片机·嵌入式硬件
CiLerLinux13 小时前
第四十九章 ESP32S3 WiFi 路由实验
网络·人工智能·单片机·嵌入式硬件
时光の尘13 小时前
【PCB电路设计】常见元器件简介(电阻、电容、电感、二极管、三极管以及场效应管)
单片机·嵌入式硬件·pcb·二极管·电感·三极管·场效应管
Lu Zelin13 小时前
单片机为什么不能跑Linux
linux·单片机·嵌入式硬件
宁静致远202114 小时前
stm32 freertos下基于hal库的模拟I2C驱动实现
stm32·嵌入式硬件·freertos
Wave84519 小时前
STM32--智能小车
stm32·单片机·嵌入式硬件
wdfk_prog21 小时前
[Linux]学习笔记系列 -- lib/timerqueue.c Timer Queue Management 高精度定时器的有序数据结构
linux·c语言·数据结构·笔记·单片机·学习·安全
helesheng1 天前
用低成本FPGA实现FSMC接口的多串口(UART)控制器
stm32·fsmc·fpga·uart控制器
充哥单片机设计1 天前
【STM32项目开源】基于STM32的智能家居环境(空气质量)检测系统
stm32·单片机·嵌入式硬件