AsyncUDP_STM32 库
目录
- v1.3.0 的重要变化
- 为什么我们需要这个 AsyncUDP_STM32 库
- 变更日志
- 先决条件
- 安装
- 使用 Arduino 库管理器
- 手动安装
- VS Code 和 PlatformIO
- 包的补丁
- 1. STM32板使用LAN8720
- 2. STM32板使用Serial1
- 如何修复
Multiple Definitions
链接器错误 - 如何设置异步 UDP 客户端
- 如何使用 STM32F4 和 LAN8720
- 1. 接线
- 2. 使用 STLink V-2 或 V-3 的 HOWTO 程序
- 3. 如何使用串口进行调试
- 示例
- 1. 异步UDP客户端
- 2.AsyncUdpNTPClient
- 3. 异步UdpSendReceive
- 4. 异步UDP服务器
- 5.AsyncUDP多播服务器
- 6.AsyncUDPClient_LAN8720
- 7.AsyncUdpNTPClient_LAN8720
- 8.AsyncUdpSendReceive_LAN8720
- 9. 异步UDP服务器_LAN8720
- 10.AsyncUDP多播服务器_LAN8720
- 11.多文件项目新建
- 12.multiFileProject_LAN8720新建
- AsyncUdpNTPClient 示例
- 1. 文件AsyncUdpNTPClient.ino
- 2. 文件define.h
- 调试终端输出示例
- 1. STM32F7 NUCLEO_F767ZI 上的 AsyncUdpNTPClient 以及使用 STM32Ethernet 库的 LAN8742A 以太网
- 2. STM32F4 BLACK_F407VE 上的 AsyncUdpNTPClient_LAN8720 以及使用 STM32Ethernet 库的 LAN8720 以太网
- 调试
- 故障排除
- 问题
- 待办事项
- 完毕
- 贡献和致谢
- 贡献
- 执照
- 版权
v1.3.0 的重要变化
请查看如何修复Multiple Definitions
链接器错误
对于使用 LAN8720 的Generic STM32F4 series
板卡,例如 STM32F407VE,请使用 STM32 core v2.2.0
,因为破坏 core v2.3.0
会导致编译错误。将在不久的将来修复。
为什么我们需要这个 AsyncUDP_STM32 库
特征
此 AsyncUDP_STM32 库是一个完全异步的 UDP 库,专为无故障、多连接网络环境而设计,适用于使用 LAN8720 或内置 LAN8742A 以太网的 STM32 板。该库易于使用,并且支持单播、广播和多播环境。
该库基于并修改自:
- 赫里斯托·戈奇科夫 (Hristo Gochkov) 的 ESPAsyncUDP
使用 LAN8720 或内置 LAN8742A 以太网将强大的ESPAsyncUDP 库的更好更快的异步功能应用到 STM32 板中。
为什么异步更好
- 使用异步网络意味着您可以同时处理多个连接
- 一旦请求准备好并被解析,您就会被呼叫
- 当您发送响应时,您可以立即准备好处理其他连接,同时服务器正在后台发送响应
- 速度真是天哪
- 作为异步客户端连接到 UDP 服务器后,您可以立即准备好处理其他连接,同时客户端在后台负责接收 UDP 响应数据包。
- 您不需要在紧密循环()中检查 UDP 响应数据包的到达来处理它们。
目前支持的主板
- 内置以太网 LAN8742A 的 STM32 板,例如:
- Nucleo-144(F429ZI、F767ZI)
- 发现(STM32F746G-DISCOVERY)
- 所有具有 32K+ 闪存、内置以太网的 STM32 板 (STM32F/L/H/G/WB/MP1)
- 查看EthernetWebServer_STM32支持和测试结果
- 使用以太网LAN8720的STM32板例如:
- Nucleo-144(F429ZI、NUCLEO_F746NG、NUCLEO_F746ZG、NUCLEO_F756ZG)
- 发现 (DISCO_F746NG)
- STM32F4 板(BLACK_F407VE、BLACK_F407VG、BLACK_F407ZE、BLACK_F407ZG、BLACK_F407VE_Mini、DIYMORE_F407VGT、FK407M1)
先决条件
- 适用于 Arduino 的
Arduino IDE 1.8.19+
。 - 适用于 STM32 板
Arduino Core for STM32 v2.3.0+
。 -
STM32Ethernet library v1.3.0+
适用于内置 LAN8742A 以太网(Nucleo-144、Discovery)。 -
LwIP library v2.1.2+
适用于内置 LAN8742A 以太网(Nucleo-144、Discovery)。
安装
建议的安装方法是:
使用 Arduino 库管理器
最好的方法是使用Arduino Library Manager
。搜索AsyncUDP_STM32
,然后选择/安装最新版本。您还可以使用此链接获取更详细的说明。
手动安装
- 导航到 AsyncUDP_STM32 页面。
- 下载最新版本
AsyncUDP_STM32-master.zip
。 - 将 zip 文件解压到
AsyncUDP_STM32-master
目录 - 将整个
AsyncUDP_STM32-master
文件夹复制到 Arduino 库目录,例如~/Arduino/libraries/
。
VS 代码和平台IO:
- 安装 VS 代码
- 安装平台IO
- 使用库管理器安装AsyncUDP_STM32库。在 Platform.io 作者的库中搜索 AsyncUDP_STM32
- 使用示例中包含的 platformio.ini 文件来确保自动安装所有依赖库。请访问项目配置文件中的其他选项和示例文档
包的补丁
1. STM32板使用LAN8720
对于使用LAN8720
的Generic STM32F4 series
板卡,例如STM32F407VE
,请使用 STM32 core v2.2.0
,因为破坏 core v2.3.0
会导致编译错误。
在某些STM32板上使用LAN8720
- Nucleo-144(F429ZI、NUCLEO_F746NG、NUCLEO_F746ZG、NUCLEO_F756ZG)
- 发现 (DISCO_F746NG)
- STM32F4 板(BLACK_F407VE、BLACK_F407VG、BLACK_F407ZE、BLACK_F407ZG、BLACK_F407VE_Mini、DIYMORE_F407VGT、FK407M1)
您必须将文件 stm32f4xx_hal_conf_default.h 和 stm32f7xx_hal_conf_default.h 复制到 STM32 stm32 目录(~/.arduino15/packages/STM32/hardware/stm32/2.2.0/system)以覆盖旧文件。
假设STM32 stm32核心版本是2.2.0。必须将这些文件复制到目录中:
- STM32F4 的
~/.arduino15/packages/STM32/hardware/stm32/2.2.0/system/STM32F4xx/stm32f4xx_hal_conf_default.h
。 - Nucleo-144 STM32F7 的
~/.arduino15/packages/STM32/hardware/stm32/2.2.0/system/STM32F7xx/stm32f7xx_hal_conf_default.h
。
每当安装新版本时,请记住将此文件复制到新版本目录中。例如,新版本是x.yy.zz,则必须将这些文件复制到相应的目录中:
-
~/.arduino15/packages/STM32/hardware/stm32/x.yy.zz/system/STM32F4xx/stm32f4xx_hal_conf_default.h
- `~/.arduino15/packages/STM32/hardware/stm32/x.yy.zz/system/STM32F7xx/stm32f7xx_hal_conf_default.h
2. STM32板使用Serial1
要在某些没有 Serial1 定义的 STM32 板上使用 Serial1(Nucleo-144 NUCLEO_F767ZI、Nucleo-64 NUCLEO_L053R8 等)板,您必须将文件 STM32variant.h 复制到 STM32 stm32 目录(~/.arduino15/packages/STM32/硬件/stm32/2.3.0)。您必须修改与您的板相对应的文件,这只是一个示例。
假设STM32 stm32核心版本是2.3.0。必须将这些文件复制到目录中:
-
~/.arduino15/packages/STM32/hardware/stm32/2.3.0/variants/NUCLEO_F767ZI/variant.h
适用于 Nucleo-144 NUCLEO_F767ZI。 -
~/.arduino15/packages/STM32/hardware/stm32/2.3.0/variants/NUCLEO_L053R8/variant.h
适用于 Nucleo-64 NUCLEO_L053R8。
每当安装新版本时,请记住将此文件复制到新版本目录中。例如,新版本是x.yy.zz,则必须将这些文件复制到相应的目录中:
-
~/.arduino15/packages/STM32/hardware/stm32/x.yy.zz/variants/NUCLEO_F767ZI/variant.h
-
~/.arduino15/packages/STM32/hardware/stm32/x.yy.zz/variants/NUCLEO_L053R8/variant.h
如何修复Multiple Definitions
链接器错误
当前的库实现使用xyz-Impl.h
而不是标准xyz.cpp
,在某些用例中可能会产生某些Multiple Definitions
链接器错误。
您可以包含此.hpp
文件
// Can be included as many times as necessary, without `Multiple Definitions` Linker Error
# include " AsyncUDP_STM32.hpp " // https://github.com/khoih-prog/AsyncUDP_STM32
在许多文件中。但请务必在 1 个.h
、 .cpp
或.ino
文件中使用以下.h
文件,不得将其包含在任何其他文件中,以避免Multiple Definitions
链接器错误
// To be included only in main(), .ino with setup() to avoid `Multiple Definitions` Linker Error
# include " AsyncUDP_STM32.h " // https://github.com/khoih-prog/AsyncUDP_STM32
检查新的multiFileProject示例以获取HOWTO
演示。
如何设置异步 UDP 客户端
# include < LwIP.h >
# include < STM32Ethernet.h >
# include < AsyncUDP_STM32.h >
byte mac[] = { 0xDE , 0xAD , 0xBE , 0xEF , 0x32 , 0x01 };
IPAddress timeWindowsCom = IPAddress( 13 , 86 , 101 , 172 );
# define NTP_REQUEST_PORT 123
const int NTP_PACKET_SIZE = 48 ; // NTP timestamp is in the first 48 bytes of the message
byte packetBuffer[NTP_PACKET_SIZE]; // buffer to hold incoming and outgoing packets
// A UDP instance to let us send and receive packets over UDP
AsyncUDP Udp;
// send an NTP request to the time server at the given address
void createNTPpacket ( void )
{
...
}
void sendNTPPacket ( void )
{
createNTPpacket ();
// Send unicast
Udp. write (packetBuffer, sizeof (packetBuffer));
}
void parsePacket (AsyncUDPPacket packet)
{
...
}
void setup ()
{
...
// NTP requests are to port NTP_REQUEST_PORT = 123
if (Udp. connect (timeWindowsCom, NTP_REQUEST_PORT))
{
// Setting up Async packet Handler
Udp. onPacket ([](AsyncUDPPacket packet)
{
parsePacket (packet);
});
}
}
void loop ()
{
sendNTPPacket ();
// wait 60 seconds before asking for the time again
delay ( 60000 );
}
如何使用 STM32F4 和 LAN8720
1. 接线
这是使用LAN8720的STM32F4(BLACK_F407VE等)的接线
LAN8720 物理层 | <---> | STM32F4 |
---|
TX1 | <---> | PB_13 |
TX_EN | <---> | PB_11 |
TX0 | <---> | PB_12 |
接收0 | <---> | 电脑_4 |
接收1 | <---> | 电脑_5 |
nINT/RETCLK | <---> | PA_1 |
慢性RS | <---> | PA_7 |
MDIO | <---> | PA_2 |
多维数据中心 | <---> | 电脑_1 |
接地 | <---> | 接地 |
电压控制电路 | <---> | +3.3V |
2. 使用 STLink V-2 或 V-3 的 HOWTO 程序
连接如下。要进行编程,请使用STM32CubeProgrammer或 Arduino IDE
- U(S)ART 支持:“已启用(通用串行)”
- 上传方式:“STM32CubeProgrammer (SWD)”
意法通 | <---> | STM32F4 |
---|
时钟信号 | <---> | 时钟信号 |
SWDIO | <---> | SWDIO |
RST | <---> | 国家科学技术研究院 |
接地 | <---> | 接地 |
5V | <---> | 5V |
3. 如何使用串口进行调试
按如下方式连接 FDTI(USB 转串口):
FDTI | <---> | STM32F4 |
---|
接收 | <---> | 发送=PA_9 |
TX | <---> | 接收=PA_10 |
接地 | <---> | 接地 |
示例
- 异步UDP客户端
- 异步UDPNTP客户端
- 异步UDP发送接收
- 异步UDP服务器
- 异步UDP组播服务器
- AsyncUDPClient_LAN8720
- AsyncUdpNTPClient_LAN8720
- AsyncUdpSendReceive_LAN8720
- 异步UDP服务器_LAN8720
- AsyncUDP多播服务器_LAN8720
- 多文件项目新建
- multiFileProject_LAN8720新
AsyncUdpNTPClient 示例
1. 文件AsyncUdpNTPClient.ino
| #包含“ define.h ” |
| #包含<时间.h > |
| |
| // 0.ca.pool.ntp.org |
| IP 地址 timeServerIP = IP 地址( 208 , 81 , 1 , 244 ); |
| // time.nist.gov |
| // IP 地址 timeServerIP = IP 地址(132, 163, 96, 1); |
| |
| #定义NTP_REQUEST_PORT 123 |
| |
| // char timeServer[] = "time.nist.gov"; // NTP服务器 |
| char timeServer[] = " 0.ca.pool.ntp.org " ; |
| |
| 常量int NTP_PACKET_SIZE = 48 ; // NTP时间戳位于消息的前48字节中 |
| |
| 字节 packetBuffer[NTP_PACKET_SIZE]; //用于保存传入和传出数据包的缓冲区 |
| |
| //一个 UDP 实例,让我们通过 UDP 发送和接收数据包 |
| 异步UDP UDP; |
| |
| //向给定地址的时间服务器发送 NTP 请求 |
| 无效创建NTP包(无效) |
| { |
| 连续剧。 println ( " =============createNTPpacket ============= " ); |
| |
| //将缓冲区中的所有字节设置为 0 |
| memset (packetBuffer, 0 , NTP_PACKET_SIZE); |
| //初始化形成 NTP 请求所需的值 |
| // (有关数据包的详细信息,请参阅上面的 URL) |
| |
| packetBuffer[ 0 ]= 0b11100011 ; // LI、版本、模式 |
| 数据包缓冲区[ 1 ]= 0 ; //层数,或时钟类型 |
| packetBuffer[ 2 ]= 6 ; //轮询间隔 |
| packetBuffer[ 3 ]= 0xEC ; //对等时钟精度 |
| |
| // 8 个字节的零用于根延迟和根分散 |
| 数据包缓冲区[ 12 ]= 49 ; |
| packetBuffer[ 13 ]= 0x4E ; |
| 数据包缓冲区[ 14 ]= 49 ; |
| 数据包缓冲区[ 15 ]= 52 ; |
| } |
| |
| void parsePacket (AsyncUDPPacket数据包) |
| { |
| 结构tm ts; |
| 字符缓冲区[ 80 ]; |
| |
| memcpy (packetBuffer, packet.data (), sizeof (packetBuffer)); |
| |
| 连续剧。 print ( "收到的UDP数据包类型: " ); |
| 连续剧。 println ( packet.isBroadcast () ? "广播" : packet.isMulticast () ? "多播" : "单播" ); |
| 连续剧。打印( “来自: ” ); |
| 连续剧。 print ( packet.remoteIP ()); |
| 连续剧。打印( ” : ” ); |
| 连续剧。 print ( packet.remotePort ()); |
| 连续剧。打印( “ ,收件人: ” ); |
| 连续剧。 print ( packet.localIP ()); |
| 连续剧。打印( ” : ” ); |
| 连续剧。 print ( packet.localPort ()); |
| 连续剧。打印( “ ,长度: ” ); |
| 连续剧。 print ( packet.length ()); |
| 连续剧。打印(); |
| |
| unsigned long highWord = word (packetBuffer[ 40 ], packetBuffer[ 41 ]); |
| unsigned long lowWord = word (packetBuffer[ 42 ], packetBuffer[ 43 ]); |
| |
| //将四个字节(两个字)组合成一个长整数 |
| //这是 NTP 时间(自 1900 年 1 月 1 日以来的秒数): |
| 无符号长secsSince1900 = highWord << 16 |低字; |
| |
| 连续剧。 print ( F ( "自 1900 年 1 月 1 日起的秒数 = " )); |
| 连续剧。 println (secsSince1900); |
| |
| //现在将 NTP 时间转换为)日常时间: |
| 连续剧。 print ( F ( " Epoch/Unix 时间 = " )); |
| |
| // Unix 时间从 1970 年 1 月 1 日开始。以秒为单位,即 2208988800: |
| const无符号长70Years = 2208988800UL ; |
| |
| //减去七十年: |
| 无符号长纪元 = secsSince1900 - SeventyYears; |
| time_t epoch_t = 纪元; // secsSince1900 - SeventyYears; |
| |
| //打印 Unix 时间: |
| 连续剧。 println (纪元); |
| |
| //打印小时、分钟和秒: |
| 连续剧。 print ( F ( " UTC/GMT 时间为" )); // UTC 是格林威治子午线 (GMT) 时间 |
| |
| ts = *本地时间(& epoch_t ); |
| strftime (buf, sizeof (buf), " %a %Y-%m-%d %H:%M:%S %Z " , &ts); |
| 连续剧。打印(缓冲区); |
| } |
| |
| 无效发送NTP数据包(无效) |
| { |
| 创建NTP包(); |
| //发送单播 |
| 乌德普。 write (packetBuffer, sizeof (packetBuffer)); |
| } |
| |
| 无效设置() |
| { |
| 连续剧。开始( 115200 ); |
| 而(!串行); |
| |
| 连续剧。 print ( " n在"上启动 AsyncUdpNTPClient );连续剧。 println (BOARD_NAME); |
| 连续剧。 println (ASYNC_UDP_STM32_VERSION); |
| |
| #如果(_ASYNC_UDP_STM32_LOGLEVEL_ > 2) |
| 连续剧。 print ( " STM32 Core版本v " );连续剧。打印(STM32_CORE_VERSION_MAJOR); |
| 连续剧。打印( ” 。 ” );连续剧。打印(STM32_CORE_VERSION_MINOR); |
| 连续剧。打印( ” 。 ” );连续剧。 println (STM32_CORE_VERSION_PATCH); |
| #结束符 |
| |
| //启动以太网连接和服务器 |
| //使用随机mac |
| uint16_t索引= millis () % NUMBER_OF_MAC; |
| |
| //使用静态IP |
| //以太网.begin(mac[index], ip); |
| //使用 DHCP 动态 IP 和随机 mac |
| 以太网。开始(mac[索引]); |
| |
| //你现在已经连接了,所以打印出数据 |
| 连续剧。 print ( F ( "您已连接到网络,IP = " )); |
| 连续剧。 println ( Ethernet.localIP ()); |
| |
| // NTP 请求将发送到端口 NTP_REQUEST_PORT = 123 |
| if ( Udp.connect (timeServerIP, NTP_REQUEST_PORT)) |
| // if (Udp.connect(timeServer, NTP_REQUEST_PORT)) |
| { |
| 连续剧。 println ( " UDP已连接" ); |
| |
| 乌德普。 onPacket ([](AsyncUDPPacket数据包) |
| { |
| 解析数据包(数据包); |
| }); |
| } |
| } |
| |
| 无效循环() |
| { |
| 发送NTP数据包(); |
| |
| //等待 60 秒,然后再次询问时间 |
| 延迟( 60000 ); |
| } |
2. 文件define.h
| /* |
| 目前支持 |
| 1)具有内置以太网的STM32板(使用USE_BUILTIN_ETHERNET = true)例如: |
| - Nucleo-144(F429ZI、F767ZI) |
| - 发现(STM32F746G-DISCOVERY) |
| - STM32板(STM32F/L/H/G/WB/MP1),带32K+闪存,内置以太网, |
| - 请参阅如何使用内置以太网 (https://github.com/khoih-prog/EthernetWebServer_STM32/issues/1) |
| 2) 运行 ENC28J60 扩展板的 STM32F/L/H/G/WB/MP1 板(带 32+K 闪存)(使用 USE_BUILTIN_ETHERNET = false) |
| 3)运行W5x00扩展板的STM32F/L/H/G/WB/MP1板(带32+K Flash) |
| */ |
| |
| #ifndef定义_h |
| #define定义_h |
| |
| #if !( 已定义( STM32F0 ) ||已定义( STM32F1 ) ||已定义( STM32F2 ) ||已定义( STM32F3 ) ||已定义( STM32F4 ) ||已定义( STM32F7 ) || |
| 定义( STM32L0 ) ||定义( STM32L1 ) ||定义( STM32L4 ) ||定义( STM32H7 ) ||定义( STM32G0 ) ||定义( STM32G4 ) || |
| 定义( STM32WB ) ||定义( STM32MP1 )) |
| #error此代码设计为在 STM32F/L/H/G/WB/MP1 平台上运行!请检查您的工具->面板设置。 |
| #endif |
| |
| #define ASYNC_UDP_STM32_DEBUG_PORT串口 |
| |
| // 使用 0 到 4。数字越大,调试消息和内存使用量越多。 |
| #定义_ASYNC_UDP_STM32_LOGLEVEL_1 |
| |
| |
| #如果定义( STM32F0 ) |
| #warning选择 STM32F0 板 |
| #define BOARD_TYPE “STM32F0” |
| #elif定义( STM32F1 ) |
| #warning选择 STM32F1 板 |
| #define BOARD_TYPE “STM32F1” |
| #elif定义( STM32F2 ) |
| #warning选择 STM32F2 板 |
| #define BOARD_TYPE “STM32F2” |
| #elif定义( STM32F3 ) |
| #warning选择 STM32F3 板 |
| #define BOARD_TYPE “STM32F3” |
| #elif定义( STM32F4 ) |
| #warning选择 STM32F4 板 |
| #define BOARD_TYPE “STM32F4” |
| #elif定义( STM32F7 ) |
| #warning选择 STM32F7 板 |
| #define BOARD_TYPE “STM32F7” |
| #elif定义( STM32L0 ) |
| #warning选择 STM32L0 板 |
| #define BOARD_TYPE “STM32L0” |
| #elif定义( STM32L1 ) |
| #warning选择 STM32L1 板 |
| #define BOARD_TYPE “STM32L1” |
| #elif定义( STM32L4 ) |
| #warning选择 STM32L4 板 |
| #define BOARD_TYPE “STM32L4” |
| #elif定义( STM32H7 ) |
| #warning选择 STM32H7 板 |
| #define BOARD_TYPE “STM32H7” |
| #elif定义( STM32G0 ) |
| #warning选择 STM32G0 板 |
| #define BOARD_TYPE “STM32G0” |
| #elif定义( STM32G4 ) |
| #warning选择 STM32G4 板 |
| #define BOARD_TYPE “STM32G4” |
| #elif定义( STM32WB ) |
| #warning选择 STM32WB 板 |
| #define BOARD_TYPE “STM32WB” |
| #elif定义( STM32MP1 ) |
| #warning选择 STM32MP1 板 |
| #define BOARD_TYPE “STM32MP1” |
| #别的 |
| #warning选择了 STM32 未知板 |
| #define BOARD_TYPE “STM32 未知” |
| #endif |
| |
| #ifndef BOARD_NAME |
| #define BOARD_NAME BOARD_TYPE |
| #endif |
| |
| #include <LwIP.h> |
| #include <STM32Ethernet.h> |
| |
| #include <AsyncUDP_STM32.h> |
| |
| // 在下面输入控制器的 MAC 地址和 IP 地址。 |
| #define NUMBER_OF_MAC 20 |
| |
| 字节mac [][ NUMBER_OF_MAC ] = |
| { |
| { 0xDE , 0xAD , 0xBE , 0xEF , 0x32 , 0x01 }, |
| { 0xDE , 0xAD , 0xBE , 0xEF , 0x32 , 0x02 }, |
| { 0xDE , 0xAD , 0xBE , 0xEF , 0x32 , 0x03 }, |
| { 0xDE , 0xAD , 0xBE , 0xEF , 0x32 , 0x04 }, |
| { 0xDE , 0xAD , 0xBE , 0xEF , 0x32 , 0x05 }, |
| { 0xDE , 0xAD , 0xBE , 0xEF , 0x32 , 0x06 }, |
| { 0xDE , 0xAD , 0xBE , 0xEF , 0x32 , 0x07 }, |
| { 0xDE , 0xAD , 0xBE , 0xEF , 0x32 , 0x08 }, |
| { 0xDE , 0xAD , 0xBE , 0xEF , 0x32 , 0x09 }, |
| { 0xDE , 0xAD , 0xBE , 0xEF , 0x32 , 0x0A }, |
| { 0xDE , 0xAD , 0xBE , 0xEF , 0x32 , 0x0B }, |
| { 0xDE , 0xAD , 0xBE , 0xEF , 0x32 , 0x0C }, |
| { 0xDE , 0xAD , 0xBE , 0xEF , 0x32 , 0x0D }, |
| { 0xDE , 0xAD , 0xBE , 0xEF , 0x32 , 0x0E }, |
| { 0xDE , 0xAD , 0xBE , 0xEF , 0x32 , 0x0F }, |
| { 0xDE , 0xAD , 0xBE , 0xEF , 0x32 , 0x10 }, |
| { 0xDE , 0xAD , 0xBE , 0xEF , 0x32 , 0x11 }, |
| { 0xDE , 0xAD , 0xBE , 0xEF , 0x32 , 0x12 }, |
| { 0xDE , 0xAD , 0xBE , 0xEF , 0x32 , 0x13 }, |
| { 0xDE , 0xAD , 0xBE , 0xEF , 0x32 , 0x14 }, |
| }; |
| |
| // 根据本地网络选择静态IP地址 |
| IP 地址ip ( 192 , 168 , 2 , 232 ); |
| |
| #endif //define_h |
调试终端输出示例
1. STM32F7 NUCLEO_F767ZI 上的 AsyncUdpNTPClient 和 LAN8742A 以太网使用 STM32Ethernet 库
这是在STM32F7 Nucleo-144 NUCLEO_F767ZI 上运行 AsyncUdpNTPClient 时的终端调试输出。 。它使用 AsyncUDP_STM32 库连接到 NTP 服务器 time.windows.com (IP=13.86.101.172),并每 60 秒请求 NTP 时间。然后异步接收和处理数据包以打印当前 UTC/GMT 时间。
Start AsyncUdpNTPClient on NUCLEO_F767ZI
AsyncUdp_STM32 v1 .3.0
STM32 Core version v2 .3.0
You ' re connected to the network, IP = 192.168.2.157
UDP connected
============= createNTPpacket =============
Received UDP Packet Type: Unicast
From: 208.81.1.244:123, To: 192.168.2.157:62510, Length: 48
Seconds since Jan 1 1900 = 3864858437
Epoch/Unix time = 1655869637
The UTC/GMT time is Wed 2022-06-22 03:47:17 GMT
============= createNTPpacket =============
Received UDP Packet Type: Unicast
From: 208.81.1.244:123, To: 192.168.2.157:62510, Length: 48
Seconds since Jan 1 1900 = 3864858497
Epoch/Unix time = 1655869697
The UTC/GMT time is Wed 2022-06-22 03:48:17 GMT
============= createNTPpacket =============
Received UDP Packet Type: Unicast
From: 208.81.1.244:123, To: 192.168.2.157:62510, Length: 48
Seconds since Jan 1 1900 = 3864858557
Epoch/Unix time = 1655869757
The UTC/GMT time is Wed 2022-06-22 03:49:17 GMT
2. STM32F4 BLACK_F407VE 上的 AsyncUdpNTPClient_LAN8720 以及使用 STM32Ethernet 库的 LAN8720 以太网
这是使用 STM32Ethernet 库在带有 LAN8720 以太网的 STM32F4 BLACK_F407VE上运行 AsyncUdpNTPClient_LAN8720 时的终端调试输出。它使用 AsyncUDP_STM32 库连接到 NTP 服务器 time.windows.com (IP=13.86.101.172),并每 60 秒请求 NTP 时间。然后异步接收和处理数据包以打印当前 UTC/GMT 时间。
Start AsyncUdpNTPClient_LAN8720 on BLACK_F407VE
AsyncUdp_STM32 v1 .3.0
STM32 Core version v2 .3.0
You ' re connected to the network, IP = 192.168.2.151
UDP connected
============= createNTPpacket =============
Received UDP Packet Type: Unicast
From: 208.81.1.244:123, To: 192.168.2.157:62510, Length: 48
Seconds since Jan 1 1900 = 3864858616
Epoch/Unix time = 1655869816
The UTC/GMT time is Wed 2022-06-22 03:50:16 GMT
============= createNTPpacket =============
Received UDP Packet Type: Unicast
From: 208.81.1.244:123, To: 192.168.2.157:62510, Length: 48
Seconds since Jan 1 1900 = 3864858676
Epoch/Unix time = 1655869876
The UTC/GMT time is Wed 2022-06-22 03:51:16 GMT
============= createNTPpacket =============
Received UDP Packet Type: Unicast
From: 208.81.1.244:123, To: 192.168.2.157:62510, Length: 48
Seconds since Jan 1 1900 = 3864858735
Epoch/Unix time = 1655869935
The UTC/GMT time is Wed 2022-06-22 03:52:15 GMT
调试
默认情况下,串行上启用调试。要禁用,请使用级别 0
# define ASYNC_UDP_STM32_DEBUG_PORT Serial
// Use from 0 to 4. Higher number, more debugging messages and memory usage.
# define _ASYNC_UDP_STM32_LOGLEVEL_ 0
您还可以将调试级别从 0 更改为 4
# define ASYNC_UDP_STM32_DEBUG_PORT Serial
// Use from 0 to 4. Higher number, more debugging messages and memory usage.
# define _ASYNC_UDP_STM32_LOGLEVEL_ 4
故障排除
如果出现编译错误,通常情况下,您可能需要安装更新版本的 Arduino IDE、Arduino STM32
核心或依赖库。
有时,只有将STM32
核心更新到最新版本,该库才会工作,因为我总是使用最新的核心/库。
问题
将问题提交至:AsyncUDP_STM32 问题
待办事项
- 修复错误。添加增强功能
- 添加对更多以太网/WiFi扩展板的支持
- 添加对更多 STM32 板的支持。
完毕
- 使用内置 LAN8742A 以太网连接 STM32 的初始端口。在STM32F7 Nucleo-144 F767ZI上进行测试。
- 添加更多示例。
- 添加调试功能。
- 使用 STM32Ethernet 库添加对以太网 LAN8720的支持,适用于Nucleo-144(F429ZI、NUCLEO_F746NG、NUCLEO_F746ZG、NUCLEO_F756ZG)、Discovery(DISCO_F746NG)和STM32F4 板(BLACK_F407VE、BLACK_F407VG、 BLACK_F407ZE、BLACK_F407ZG、BLACK_F407VE_Mini、DIYMORE_F407VGT、FK407M1)
- 修复多重定义链接器错误
- 新STM32核心v2.3.0的更新示例
- 将示例 multiFileProject 和 multiFileProject_LAN8720 添加到多文件项目的演示中,以避免
multiple-definitions
链接器错误
贡献和致谢
- 基于 Hristo Gochkov 的 ESPAsyncUDP 并对其进行修改。非常感谢 Hristo Gochkov 提供的出色的 ESPAsyncUDP 库
- 依赖 Frederic Pillon 的 STM32duino LwIP 库。
- 感谢 Miguel Wisintainer 的出色工作、开发、调试和测试。
️️ 赫里斯托·戈奇科夫
| ️ 弗雷德里克·皮隆
| TCPIP芯片
|
贡献
如果您想为这个项目做出贡献:
- 报告错误和错误
- 请求改进
- 创建问题并拉取请求
- 向其他人介绍这个图书馆
执照
版权
版权所有 (c) 2020 - Khoi Hoang