嵌入式技术论坛
直播中

陈勇

8年用户 1341经验值
私信 关注
[经验]

关于ART-PI的基本使用例程简单描述

1 工程创建
1.新建工程

2.打开LwIP与SAL

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

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

5.保存Setting,编译,成功。

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] = '';
        if (strncmp(recv_data, "q", 1) == 0 || strncmp(recv_data, "Q", 1) == 0)
        {
            /* 如果是首字母是q或Q,关闭这个连接 */
            closesocket(sock);
            rt_kprintf("
got a 'q' or 'Q',close the socket.
");
            /* 释放接收缓冲 */
            rt_free(recv_data);
            break;
        }
        else
        {
            /* 在控制终端显示收到的数据 */
            rt_kprintf("
Received data = %s ", recv_data);
        }
        /* 发送数据到sock连接 */
        ret = send(sock, send_data, strlen(send_data), 0);
        if (ret < 0)
        {
            /* 接收失败,关闭这个连接 */
            closesocket(sock);
            rt_kprintf("
send error,close the socket.
");
            rt_free(recv_data);
            break;
        }
        else if (ret == 0)
        {
            /* 打印send函数返回值为0的警告信息 */
            rt_kprintf("
Send warning,send function return 0.
");
        }
    }
    return;
}
MSH_CMD_EXPORT(tcpclient, a tcp client sample);
2.重新编译,下载。打开网络调试助手,将PC设置为TCP Server,并启动服务。

3.在Finsh中输入tcpclient 192.168.1.107 8080,回车,启动ART-PI中的TCP Client

4.通过网络调试助手向ART-PI发送消息。ART-PI在收到消息后,也会向PC回复一帧消息。

小结
RT-Thread官方已经将ART-PI的BSP做得很完善了,尤其是配合RT-Studio工具,给广大嵌入式开发者提供了极高的便利。
至于RT-Studio的编译过程,ART-PI的启动过程,ART-PI中将程序下载到外部QSPI的原因等,可以在最基础的LED例程中进行深入研究,后续再谈。

原作者:lchnu

更多回帖

发帖
×
20
完善资料,
赚取积分