风筝
发表于: 2022-9-1 11:58:35 | 显示全部楼层

本篇文章将主要介绍如何创建一个基本的Raspberry Pi Pico W项目,该项目将连接到指定的Wi-Fi网络并接受TCP连接。我们将说明如何配置树莓派Pico W开发板以连接到特定网络并使用lwIP API处理传入的连接。在开始之前,请安装VisualGDB 5.6R8或更高版本。


1.  首先确保您有一个Pico W开发板可以连接的Wi-Fi网络。在本文中,我们将使用Windows手机热点(Mobile Hotspot)创建一个新的测试网络,但任何其他Wi-Fi网络也可以工作:

05a-share.png

2.  启动Visual Studio并找到Raspberry Pi Pico项目向导:

01-newprj.png

3.  选择项目的名称和位置,然后按下“Create”:

02-picow.png

4.  选择基于示例创建一个新项目:

03-new.png

5.  确保您使用的是最新的ARM工具链和Pico SDK 1.4.0或更高版本,因为早期版本不支持Pico W。您可以通过单击SDK中的“安装 Raspberry Pi Pico SDK”链接安装最新的Pico SDK选择器:

04-sdk.png

6.  选择SDK 1.4.0+后,将板卡类型设置为PICO_W并在下面输 Wi-Fi SSID和密码:

05-net.png

如果您使用的是具有不同名称的自定义板卡并且VisualGDB不显示 SSID/密码提示,尝试编辑 <VisualGDB Directory>\Rules\PicoSDK.xml 文件中的BoardWithWiFi元素。该元素包含一个正则表达式,可以涵盖多个板名。

7.  在向导的下一页选择tcp_server示例:

06-server.png

8.  最后,将Pico W的SWD引脚连接到调试探针并在“调试方法”页面上选择匹配的配置:

07-debug.png

您可以使用“测试”按钮立即验证OpenOCD是否可以通过以下方式连接到目标社署。

9.  按“Finish”创建项目。在构建它之前,我们建议通过解决方案资源管理器中的上下文菜单打开VisualGDB项目属性并引用Fast Semihosting和Embedded Profiler框架:

08-profiler.png

这会将输出从printf()重定向到VisualGDB输出窗口,因此您不需要设置UART连接。如果您不需要 printf() 输出,则可以跳过此步骤。

10.  打开主源文件 (picow_tcp_server.c) 并使用 View->VisualGDB Code Explorer 快速了解其内容。您可以在代码资源管理器中右键单击任何顶级节点并选择“Collapse->Nodes at this Level”以快速查看文件内的所有函数:

struct.png

11.  tcp_server示例的工作方式如下所示:

      a.  首先它通过调用cyw43_arch_enable_sta_mode()和cyw43_arch_wifi_connect_timeout_ms()连接到Wi-Fi网络。

      b.  然后它调用tcp_server_open()函数:

          ◾    通过调用tcp_new_ip_type()创建一个新的TCP连接对象。

          ◾    通过调用tcp_bind()将其绑定到端口4242,然后通过调用tcp_listen_with_backlog()开始监听传入连接。

          ◾    配置lwIP以在任何人连接到TCP端口时调用tcp_server_accept()回调。

      c.  当客户端连接到TCP端口4242时,tcp_server_accept()回调会在新创建的连接上设置4个额外的回调:

          ◾    tcp_server_sent() 将在 lwIP 完成向客户端发送数据块后调用。

          ◾    tcp_server_recv() 一旦从客户端接收到数据。

          ◾    tcp_server_poll() 一旦10秒内套接字上没有任何活动 (POLL_TIME_S * 2)

          ◾    tcp_server_err() 一旦套接字遇到内部错误。

      d.  一旦设置了回调, tcp_server_accept()就会向客户端发送一个随机负载,期望它回显它。

      e.  tcp_server_recv()回调将传入数据缓冲在TCP_SERVER_T::buffer_recv 缓冲区中,一旦接收到的数据量与发送的数据量匹配,它将与发送的块进行比较。

12.  通常,TCP服务器示例需要一个可以接收和回显大量随机数据的小型测试程序,但是我们将对其进行修改,以便可以使用telnet工具对其进行测试。首先,找到BUF_SIZE的定义,将其减为8。然后,找到tcp_server_send_data()函数,将buffer_sent的初始化逻辑替换为:

  1. memcpy(state->buffer_sent, "test123\r", BUF_SIZE);
复制代码

13.  现在在tcp_write()调用处设置断点并按F5构建项目并开始调试:

09-bkpt.png

14.  等待开发板连接到Wi-Fi网络(它将报告通过 printf() 输出获得的 IP 地址)并在Windows机器上运行“telnet <Board IP> 4242”。 Telnet将连接到开发板,并触发tcp_server_send_data()中的断点:

10-connected.png

15.  请注意,出于安全考虑,Windows默认没有安装telnet客户端。您可以通过控制面板 -> 添加/删除程序 -> 打开和关闭 Windows 功能 -> Telnet 客户端安装它:

telnet.png

16.  按F5继续调试。 转到telnet客户端,键入“test123”并按 <ENTER>。 该开发板将在半主机控制台中显示一系列“tcp_server_recv X/Y err 0”消息(每个接收到的数据包一个),最后将调用 tcp_server_send_data() 进行另一轮测试:

11-pass2.png

请注意,本文中显示的TCP服务器示例不使用FreeRTOS,因此它必须在唯一的线程中处理所有连接,从而强制使用回调而不是经典的套接字API。 出于所有实际目的,我们建议改用基于FreeRTOS的项目。


您可以在我们的GitHub找到文的项目源代码。

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 23 | 回复: 33



手机版|

GMT+8, 2024-12-31 01:51 , Processed in 0.055434 second(s), 9 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表