1 工程创建
1.新建工程

2.打开LwIP与SAL

3.进入Borad设置,点击上方的3处,使能ETH

4.返回组件部分,在LWIP上点击右键,然后在弹出部分点击配置项。为了简单起见,我们先失效DHCP,使用静态IP与PC直连做测试。后续有需要,将ARI-PI通过路由器连接PC,可以随时再打开DHCP。

5.保存Set
ting,编译,成功。

2 基本测试
1.将ART-PI通电并连接网线
2.通过设备管理器确认ART-PI与PC接口。设备管理器显示,ARI-PI的ST-LINK和串口是COM9。

3.下载程序

4.下载说明
在applicationsmain.c中,将中断向量表映射到了QSPI部分。
#include "
STM32h7xx.h"
static int vtor_config(void)
{
/* Vector Table Relocation in Internal QSPI_FLASH */
SCB->VTOR = QSPI_BASE;
return 0;
}
INIT_BOARD_EXPORT(vtor_config);
如下图所示,Download选项部分表示,将生成的文件下载至外部QSPI Flash中。

5.通过XShell Serial COM9连接ART-PI

6.输入ifconfig确认网卡状态

7.确认PC的IP,并进行互ping操作。
PC上打开cmd,输入ipconfig,确认PC网卡的IP地址。若它和ART-PI不在同一网段,则自行配置即可。

8.互ping操作
ART-PI ping PC

PC ping ART-PI

9.其他基本命令,如在ART-PI的msh中输入list_device,会列出已经驱动的设备

3 其他测试
1.官方的tcpclient代码,自行通过github下载,或者将下方的代码另存为tcpclient_sample.c,放入工程的applications文件夹中。
/*
* Copyright (c) 2006-2022, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
*
*/
/*
* 程序清单:tcp 客户端
*
* 这是一个 tcp 客户端的例程
* 导出 tcpclient 命令到控制终端
* 命令调用格式:tcpclient URL PORT
* URL:服务器地址 PORT::端口号
* 程序功能:接收并显示从服务端发送过来的信息,接收到开头是 'q' 或 'Q' 的信息退出程序
*/
#include
#include /* 使用BSD socket,需要包含socket.h头文件 */
#include
#include
#include
#define BUFSZ 1024
static const char send_data[] = "This is TCP Client from RT-Thread."; /* 发送用到的数据 */
void tcpclient(int argc, char **argv)
{
int ret;
char *recv_data;
struct hostent *host;
int sock, bytes_received;
struct sockaddr_in server_addr;
const char *url;
int port;
if (argc < 3)
{
rt_kprintf("Usage: tcpclient URL PORT
");
rt_kprintf("Like: tcpclient 192.168.12.44 5000
");
return ;
}
url = argv[1];
port = strtoul(argv[2], 0, 10);
/* 通过函数入口参数url获得host地址(如果是域名,会做域名解析) */
host = gethostbyname(url);
/* 分配用于存放接收数据的缓冲 */
recv_data = rt_malloc(BUFSZ);
if (recv_data == RT_NULL)
{
rt_kprintf("No memory
");
return;
}
/* 创建一个socket,类型是SOCKET_STREAM,TCP类型 */
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
/* 创建socket失败 */
rt_kprintf("Socket error
");
/* 释放接收缓冲 */
rt_free(recv_data);
return;
}
/* 初始化预连接的服务端地址 */
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(port);
server_addr.sin_addr = *((struct in_addr *)host->h_addr);
rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero));
/* 连接到服务端 */
if (connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1)
{
/* 连接失败 */
rt_kprintf("Connect fail!
");
closesocket(sock);
/*释放接收缓冲 */
rt_free(recv_data);
return;
}
else
{
/* 连接成功 */
rt_kprintf("Connect successful
");
}
while (1)
{
/* 从sock连接中接收最大BUFSZ - 1字节数据 */
bytes_received = recv(sock, recv_data, BUFSZ - 1, 0);
if (bytes_received < 0)
{
/* 接收失败,关闭这个连接 */
closesocket(sock);
rt_kprintf("
received error,close the socket.
");
/* 释放接收缓冲 */
rt_free(recv_data);
break;
}
else if (bytes_received == 0)
{
/* 默认 recv 为阻塞模式,此时收到0认为连接出错,关闭这个连接 */
closesocket(sock);
rt_kprintf("
received error,close the socket.
");
/* 释放接收缓冲 */
rt_free(recv_data);
break;
}
/* 有接收到数据,把末端清零 */
recv_data[bytes_received] = '