2.9 rt-thread实操 stm32l496 w5500

1.W5500内置MAC和PHY,内置硬件协议栈。

2、名词解释。MAC是将上层的数据进行封包,PHY是物理层。

image

 

 

image

 3、W5500想要使用,依赖的东西

image

 

使能SAL组件和网络接口image

 

image

 

使能WIZNET软件包

image

 

image

image

 

 

image

 退出配置,更新软件包,生成更新工程,修改硬件spi2引脚

image

 找到挂载spi驱动总线的文件,发现没有打开宏定义,kconfig处理下

image

 这几个宏都应该可配

BSP_USING_SPI2,BSP_SPI2_RX_USING_DMA,BSP_SPI2_TX_USING_DMA

image

 编译运行后提示让我注册spi设备到总线上,定位在wiz.c文件中,原来wiz初始化时,有注释提示我们要注册设备到总线上,因为我的内核是rt-thread5.1.0的,所以用它注释的注册总线方法是不好使的,我用我当前版本的方式进行设备注册到总线上

image

 烧录运行后正常。

ifconfig可以看到信息,待结合网线实际测试下

image

 结合网线实际测试正常

#include "thread_webserver.h"

#include <rtthread.h>

#define DBG_TAG "net_thread"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>


#include <arpa/inet.h>         /* 包含 ip_addr_t 等地址相关的头文件 */
#include <netdev.h>            /* 包含全部的 netdev 相关操作接口函数 */
#include <sal_socket.h>
#include <sys/socket.h>

#include <rtdef.h>
#include <sal_netdb.h>


ip_addr_t ip_addr;

void set_static_ip_all()
{
    struct netdev *netdev;
    netdev = netdev_get_by_name("W5500");
    //netdev = netdev_get_by_family(AF_WIZ);
    netdev_dhcp_enabled(netdev, 0);//disable shcp
    ip_addr.addr = inet_addr("192.168.0.252");
    netdev_set_ipaddr(netdev, &ip_addr);

    ip_addr.addr = inet_addr("192.168.0.1");
    netdev_set_gw(netdev, &ip_addr);

    ip_addr.addr = inet_addr("255.255.255.0");
    netdev_set_netmask(netdev, &ip_addr);
}

//MSH_CMD_EXPORT(set_static_ip,set_static_ip);

#define SERVER_HOST   "192.168.0.55"
#define SERVER_PORT   6800



//void tcpclient(int argc, char **argv)
int tcpclient(void)
{
    struct sockaddr_in client_addr;
    struct sockaddr_in server_addr;
    struct netdev *netdev = RT_NULL;
    int ret = 0;
    char *recv_data;
    struct hostent *host;
    int sockfd = -1, bytes_received = 0;
    char *send_data = "send net test";

//    /* 接收到的参数小于 3 个 */
//    if (argc < 3)
//    {
//        rt_kprintf("Usage: tcpclient URL PORT\n");
//        rt_kprintf("Like: tcpclient 192.168.12.44 5000\n");
//        return ;
//    }
//
//    url = argv[1];
//    port = strtoul(argv[2], 0, 10);
    //*((struct in_addr *)host->h_addr)

    /* 通过名称获取 netdev 网卡对象 */
    netdev = netdev_get_by_name("W5500");
    if (netdev == RT_NULL)
    {
        LOG_E("get network interface device W5500 failed.\n");
        return -RT_ERROR;
    }

    LOG_D("11111");

    /* 分配用于存放接收数据的缓冲 */
    recv_data = rt_malloc(1024);
    if (recv_data == RT_NULL)
    {
        LOG_E("No memory\n");
        return -RT_ERROR;
    }

    LOG_D("22222");
    if ((sockfd = socket(AF_WIZ, SOCK_STREAM, 0)) < 0)
    {
        LOG_E("Socket create failed.\n");
        return -RT_ERROR;
    }

    LOG_D("33333");
    /* 初始化预连接的服务端地址 */
    server_addr.sin_family = AF_WIZ;
    server_addr.sin_port = htons(SERVER_PORT);
    LOG_D("77777");
    server_addr.sin_addr.s_addr = (inet_addr(SERVER_HOST));
    
    LOG_D("56666");
    rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero));

    LOG_D("44444");
    /* 连接到服务端 */
    if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) < 0)
    {
        /* 连接失败 */
        LOG_E("Connect fail!\n");
        closesocket(sockfd);

        /* 释放接收缓冲 */
        rt_free(recv_data);
        return -RT_ERROR;
    }
    else
    {
        LOG_D("connect success");
    }

    while (1)
    {
        /* 从 sock 连接中接收最大 BUFSZ - 1 字节数据 */
        bytes_received = recv(sockfd, recv_data, 1024 - 1, 0);
        if (bytes_received < 0)
        {
            /* 接收失败,关闭这个连接 */
            closesocket(sockfd);
            LOG_E("\nreceived error,close the socket.\r\n");

            /* 释放接收缓冲 */
            rt_free(recv_data);
            break;
        }
        else if (bytes_received == 0)
        {
            /* 打印 recv 函数返回值为 0 的警告信息 */
            LOG_D("\nReceived warning,recv function return 0.\r\n");

            continue;
        }

        /* 有接收到数据,把末端清零 */
        recv_data[bytes_received] = '\0';

        if (strncmp(recv_data, "q", 1) == 0 || strncmp(recv_data, "Q", 1) == 0)
        {
            /* 如果是首字母是 q 或 Q,关闭这个连接 */
            closesocket(sockfd);
            LOG_D("\n got a'q'or'Q',close the socket.\r\n");

            /* 释放接收缓冲 */
            rt_free(recv_data);
            break;
        }
        else
        {
            /* 在控制终端显示收到的数据 */
            rt_kprintf("\nReceived data = %s", recv_data);
        }

        /* 发送数据到 sock 连接 */
        ret = send(sockfd, send_data, strlen(send_data), 0);
        if (ret < 0)
        {
            /* 接收失败,关闭这个连接 */
            closesocket(sockfd);
            LOG_E("\nsend error,close the socket.\r\n");

            rt_free(recv_data);
            break;
        }
        else if (ret == 0)
        {
            /* 打印 send 函数返回值为 0 的警告信息 */
            LOG_D("\n Send warning,send function return 0.\r\n");
        }
    }
    return -RT_ERROR;
}



void net_test_thread(void *parameter)
{
    LOG_D("net_test_thread...");

    set_static_ip_all();

    tcpclient();
        
    while (1)
    {
        LOG_D("net_test_thread...");
        rt_thread_mdelay(500);
    }
}

image

 

posted @ 2025-08-03 22:18  _小溢  阅读(63)  评论(0)    收藏  举报