在这个智能硬件和物联网时代,MicroPython和树莓派PICO正以其独特的优势引领着嵌入式开发的新潮流。MicroPython作为一种精简优化的Python 3语言,为微控制器和嵌入式设备提供了高效开发和简易调试的
当我们结合WIZnet W5100S/W5500网络模块,MicroPython和树莓派PICO的开发潜力被进一步放大。这两款模块都内置了TCP/IP协议栈,使得在嵌入式设备上实现网络连接变得更加容易。无论是进行数据传输、远程控制,还是构建物联网应用,它们都提供了强大的支持。
本章我们将以WIZnet W5100S为例,以MicroPython的开发方式进行UDP通信示例
UDP是User Datagram Protocol的简称,中文名是用户数据报协议,是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。
第一步:创建UDP套接字 每个设备(我们称之为主机)首先需要创建一个UDP套接字。套接字是网络通信的端点,可以看作是发送或接收数据的门。
第二步:绑定到端口 每个UDP套接字都会绑定到一个特定的端口号。这个端口号就像是主机上的一个特定的门牌号,使得外部的数据包能够找到正确的应用程序。
第三步:发送数据 当主机需要发送数据时,它会将数据传递给UDP协议。UDP协议会在数据前面添加一个UDP头,然后将数据(现在称为“数据报”)发送到网络。
第四步:接收数据 在接收端,数据报被路由到正确的主机和端口,然后传递给相应的应用程序。
值得注意的是,UDP是无连接的,这意味着它不需要预先建立连接就可以发送数据。此外,UDP也不保证数据报的到达,也不对数据报进行排序。
WIZnet 主流硬件协议栈以太网芯片参数对比
Model | Embedded Core | Host I/F | TX/RX Buffer | HW Socket | Network Performance |
---|---|---|---|---|---|
W5100S | TCP/IPv4, MAC & PHY | 8bit BUS, SPI | 16KB | 4 | Max 25Mbps |
W6100 | TCP/IPv4/IPv6, MAC & PHY | 8bit BUS, Fast SPI | 32KB | 8 | Max 25Mbps |
W5500 | TCP/IPv4, MAC & PHY | Fast SPI | 32KB | 8 | Max 15Mbps |
相较于软件协议栈,WIZnet的硬件协议栈以太网芯片有以下优点:
软件:
硬件:
我们直接打开udp.py文件。
第一步:可以看到在w5x00_init()函数中,进行了SPI的初始化。以及将spi相关引脚和复位引脚注册到库中,后续则是激活网络,并使用DHCP配置网络地址信息,当DHCP失败时,则配置静态网络地址信息。当未配置成功时,会打印出网络地址相关寄存器的信息,可以帮助我们更好的排查问题。
第二步:然后是打开UDP的SOCKET,并绑定到端口。最后在循环中监听有没有数据,如果有数据则回传数据。
import usocket
from machine import Pin,SPI
import network
import time
local_port = 5000
nic = None
"""
W5x00 chip initialization.
param: None
returns: None
"""
def w5x00_init():
global nic
spi=SPI(0,2_000_000, mosi=Pin(19),miso=Pin(16),sck=Pin(18))
nic = network.WIZNET5K(spi,Pin(17),Pin(20)) #spi,cs,reset pin
nic.active(True)
try:
#DHCP
print("\r\nConfiguring DHCP")
nic.ifconfig('dhcp')
except:
#None DHCP
print("\r\nDHCP fails, use static configuration")
nic.ifconfig(('192.168.1.20','255.255.255.0','192.168.1.1','8.8.8.8'))#Set static network address information
#Print network address information
print("IP :",nic.ifconfig()[0])
print("Subnet Mask:",nic.ifconfig()[1])
print("Gateway :",nic.ifconfig()[2])
print("DNS :",nic.ifconfig()[3],"\r\n")
#If there is no network connection, the register address information is printed
while not nic.isconnected():
time.sleep(1)
print(nic.regs())
"""
UDP loop testing.
param: None
returns: None
"""
def udp_loop():
global nic
s = usocket.socket(usocket.AF_INET, usocket.SOCK_DGRAM)
s.bind((nic.ifconfig()[0], local_port)) #Source IP Address
print(f"Opened UDP loopback\r\nip:{nic.ifconfig()[0]},port:{local_port}")
time.sleep(1)
while True:
data,addr = s.recvfrom(2048)
print(f'Received:{data} from:{addr}')
s.sendto(b'%s' % data, addr)
def main():
print("WIZnet chip UDP example")
w5x00_init()
udp_loop()
if __name__ == "__main__":
main()
要测试以太网示例,必须将开发环境配置为使用Raspberry Pi Pico。
第一步:将程序复制到Thonny中,然后选择环境为Raspberry Pi Pico,最后点击运行。
第二步:在网络调试助手中打开一个UDP,并连接到开发板上。
第三步:进行通信回环测试。
注意:因为MicroPython的print函数是启用了stdout缓冲的,所以有时候并不会第一时间打印出内容。
WIZnet官网
本章例程链接
想了解更多,评论留言哦!