|
本篇文章将主要介绍如何创建一个基本的Raspberry Pi Pico W项目,该项目将连接到指定的Wi-Fi网络并接受TCP连接。我们将说明如何配置树莓派Pico W开发板以连接到特定网络并使用lwIP API处理传入的连接。在开始之前,请安装VisualGDB 5.6R8或更高版本。
1. 首先确保您有一个Pico W开发板可以连接的Wi-Fi网络。在本文中,我们将使用Windows手机热点(Mobile Hotspot)创建一个新的测试网络,但任何其他Wi-Fi网络也可以工作:
2. 启动Visual Studio并找到Raspberry Pi Pico项目向导:
3. 选择项目的名称和位置,然后按下“Create”:
4. 选择基于示例创建一个新项目:
5. 确保您使用的是最新的ARM工具链和Pico SDK 1.4.0或更高版本,因为早期版本不支持Pico W。您可以通过单击SDK中的“安装 Raspberry Pi Pico SDK”链接安装最新的Pico SDK选择器:
6. 选择SDK 1.4.0+后,将板卡类型设置为PICO_W并在下面输 Wi-Fi SSID和密码:
如果您使用的是具有不同名称的自定义板卡并且VisualGDB不显示 SSID/密码提示,尝试编辑 <VisualGDB Directory>\Rules\PicoSDK.xml 文件中的BoardWithWiFi元素。该元素包含一个正则表达式,可以涵盖多个板名。 7. 在向导的下一页选择tcp_server示例:
8. 最后,将Pico W的SWD引脚连接到调试探针并在“调试方法”页面上选择匹配的配置:
您可以使用“测试”按钮立即验证OpenOCD是否可以通过以下方式连接到目标社署。 9. 按“Finish”创建项目。在构建它之前,我们建议通过解决方案资源管理器中的上下文菜单打开VisualGDB项目属性并引用Fast Semihosting和Embedded Profiler框架:
这会将输出从printf()重定向到VisualGDB输出窗口,因此您不需要设置UART连接。如果您不需要 printf() 输出,则可以跳过此步骤。 10. 打开主源文件 (picow_tcp_server.c) 并使用 View->VisualGDB Code Explorer 快速了解其内容。您可以在代码资源管理器中右键单击任何顶级节点并选择“Collapse->Nodes at this Level”以快速查看文件内的所有函数:
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的初始化逻辑替换为: - memcpy(state->buffer_sent, "test123\r", BUF_SIZE);
复制代码13. 现在在tcp_write()调用处设置断点并按F5构建项目并开始调试:
14. 等待开发板连接到Wi-Fi网络(它将报告通过 printf() 输出获得的 IP 地址)并在Windows机器上运行“telnet <Board IP> 4242”。 Telnet将连接到开发板,并触发tcp_server_send_data()中的断点:
15. 请注意,出于安全考虑,Windows默认没有安装telnet客户端。您可以通过控制面板 -> 添加/删除程序 -> 打开和关闭 Windows 功能 -> Telnet 客户端安装它:
16. 按F5继续调试。 转到telnet客户端,键入“test123”并按 <ENTER>。 该开发板将在半主机控制台中显示一系列“tcp_server_recv X/Y err 0”消息(每个接收到的数据包一个),最后将调用 tcp_server_send_data() 进行另一轮测试:
请注意,本文中显示的TCP服务器示例不使用FreeRTOS,因此它必须在唯一的线程中处理所有连接,从而强制使用回调而不是经典的套接字API。 出于所有实际目的,我们建议改用基于FreeRTOS的项目。
您可以在我们的GitHub找到文的项目源代码。 |