在这个智能硬件和物联网时代,MicroPython和树莓派PICO正以其独特的优势引领着嵌入式开发的新潮流。MicroPython作为一种精简优化的Python 3语言,为微控制器和嵌入式设备提供了高效开发和简易调试的
当我们结合WIZnet W5100S/W5500网络模块,MicroPython和树莓派PICO的开发潜力被进一步放大。这两款模块都内置了TCP/IP协议栈,使得在嵌入式设备上实现网络连接变得更加容易。无论是进行数据传输、远程控制,还是构建物联网应用,它们都提供了强大的支持。
本章我们将以WIZnet W5100S为例,以MicroPython的开发方式进行TCP_Client解析示例
TCP_Client是一种网络协议的客户端,通常用于在设备或应用程序之间建立可靠的数据连接。它通过TCP/IP协议与远程服务器建立连接,并发送请求信息。服务器接收到请求信息后,在相应的端口上提供服务并返回响应。TCP_Client将响应信息解析后,可以进行相应的处理。
TCP_Client通常用于设备与服务器之间的数据交互,是最常用的联网通信方式之一。它具有连接和断开的概念,从而保证数据的可靠交换。
在三次握手过程中:
在四次挥手过程中:
TCP Client的优点主要包括:
TCP Client的应用场景非常广泛,以下是一些主要的场景:
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的硬件协议栈以太网芯片有以下优点:
程序的运行框图如下所示:
在这里插入图片描述
软件
硬件
通过数据线连接PC的USB口(主要用于烧录程序,也可以虚拟出串口使用)
通过TTL串口转USB,连接UART0 的默认引脚:
使用模块连接RP2040 进行接线时
通过PC和设备都通过网线连接路由器LAN口
我们直接打开TCP_Client.py文件。
第一步:可以看到在w5x00_init()函数中,进行了SPI和串口的初始化。以及将SPI相关引脚和复位引脚注册到库中,后续则是激活网络,并使用DHCP配置网络地址信息,当DHCP失败时,则配置静态网络地址信息。当未配置成功时,会打印出网络地址相关寄存器的信息,可以帮助我们更好的排查问题。
第二步:然后是进行连接远程服务器的操作,连接上服务器时,可进行数据的收发测试。
from usocket import socket
from machine import Pin,SPI,UART
import time, network
''' static netinfo
'''
ip = '192.168.1.11'
sn = '255.255.255.0'
gw = '192.168.1.1'
dns= '8.8.8.8'
netinfo=(ip, sn, gw, dns)
destip = '192.168.1.18'
destport = 8000
conn_info = (destip, destport)
''' uart0 init
baudrate: 115200
tx pin : gpio0
rx pin : gpio1
'''
uart = UART(0, 115200, tx=Pin(0), rx=Pin(1))
uart.init(115200, bits=8, parity=None, stop=1)
uart.write('WIZnet chip tcp client example.\r\n')
def w5x00_init():
''' spi0 init
baudrate: 2000000
mosi pin: gpio19
miso pin: gpio16
sck pin: gpio18
cs pin: gpio17
rst pin: gpio20
'''
spi=SPI(0,2_000_000, mosi=Pin(19),miso=Pin(16),sck=Pin(18))
nic = network.WIZNET5K(spi,Pin(17),Pin(20))
nic.active(True)
# use dhcp, if fail use static netinfo
try:
nic.ifconfig('dhcp')
except:
nic.ifconfig(netinfo)
print('ip :', nic.ifconfig()[0])
print('sn :', nic.ifconfig()[1])
print('gw :', nic.ifconfig()[2])
print('dns:', nic.ifconfig()[3])
uart.write('ip :{0}\r\n'.format(nic.ifconfig()[0]))
uart.write('sn :{0}\r\n'.format(nic.ifconfig()[1]))
uart.write('gw :{0}\r\n'.format(nic.ifconfig()[2]))
uart.write('dns:{0}\r\n'.format(nic.ifconfig()[3]))
while not nic.isconnected():
time.sleep(1)
print(nic.regs())
print('no link')
uart.write('no link\r\n')
conn_flag = False
def client_loop():
global conn_flag
s = socket()
while(True):
if(conn_flag== False):
try:
s.connect(conn_info) # Destination IP Address
conn_flag=True
print("Loopback client Connect!")
uart.write('Loopback client connect!\r\n')
except:
uart.write('connect error\r\n')
conn_flag=False
if(conn_flag):
try:
data = s.recv(2048)
data = data.decode('utf-8')
if data != 'NULL' :
uart.write('recv from {0}:[{1}]: {2}\r\n'.format(conn_info[0],conn_info[1],data))
s.send(data)
except:
uart.write('disconnect')
conn_flag=False
def main():
w5x00_init()
client_loop()
if __name__ == "__main__":
main()
要测试以太网示例,必须将开发环境配置为使用Raspberry Pi Pico。
将代码复制到Thonny之后,选择运行环境为Raspberry Pi Pico,然后点击运行即可。打开SocketTester选择服务器开启监听等待客户端连接,有客户端连接之后发送消息可以获取到回传,打开WIZnet UartTool 打开串口,可以看到客户端发送的消息,则表示可以测试成功。
WIZnet官网
本章例程链接
想了解更多,评论留言哦!