RT -Thread Studio开发环境下使用W5500做TCP客户端

首先是具备W5500芯片的驱动,参考上一篇文章

RT -Thread Studio开发环境下驱动W5500网络芯片

https://blog.csdn.net/qq_25186745/article/details/112647919

在这篇文章的基础上来继续写TCP客户端的程序

在applications文件下新建my_tcp.c文件

粘贴以下代码

#include <rtthread.h>
#include <sys/socket.h> /* 使用BSD socket,需要包含socket.h头文件 */
#include <netdb.h>
#include <string.h>
#include <finsh.h>
#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\n");
        rt_kprintf("Like: tcpclient 192.168.12.44 5000\n");
        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\n");
        return;
    }
    /* 创建一个socket,类型是SOCKET_STREAM,TCP类型 */
    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
        /* 创建socket失败 */
        rt_kprintf("Socket error\n");
        /* 释放接收缓冲 */
        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!\n");
        closesocket(sock);
        /*释放接收缓冲 */
        rt_free(recv_data);
        return;
    }
    while (1)
    {
        /* 从sock连接中接收最大BUFSZ - 1字节数据 */
        bytes_received = recv(sock, recv_data, BUFSZ - 1, 0);
        if (bytes_received < 0)
        {
            /* 接收失败,关闭这个连接 */
            closesocket(sock);
            rt_kprintf("\nreceived error,close the socket.\r\n");
            /* 释放接收缓冲 */
            rt_free(recv_data);
            break;
        }
        else if (bytes_received == 0)
        {
            /* 默认 recv 为阻塞模式,此时收到0认为连接出错,关闭这个连接 */
            closesocket(sock);
            rt_kprintf("\nreceived error,close the socket.\r\n");
            /* 释放接收缓冲 */
            rt_free(recv_data);
            break;
        }
        /* 有接收到数据,把末端清零 */
        recv_data[bytes_received] = '\0';
        if (strncmp(recv_data, "q", 1) == 0 || strncmp(recv_data, "Q", 1) == 0)
        {
            /* 如果是首字母是q或Q,关闭这个连接 */
            closesocket(sock);
            rt_kprintf("\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(sock, send_data, strlen(send_data), 0);
        if (ret < 0)
        {
            /* 接收失败,关闭这个连接 */
            closesocket(sock);
            rt_kprintf("\nsend error,close the socket.\r\n");
            rt_free(recv_data);
            break;
        }
        else if (ret == 0)
        {
            /* 打印send函数返回值为0的警告信息 */
            rt_kprintf("\n Send warning,send function return 0.\r\n");
        }
    }
    return;
}
MSH_CMD_EXPORT(tcpclient, a tcp client sample);

此代码是RT -Thread官方TCP客户端例程,参考地址

https://www.rt-thread.org/document/api/group__tcpclient__sample.html

我也是直接复制过来的

然后在电脑上建立一个TCP服务器,电脑需要和W5500的网络在同一个局域网内

我的电脑IP地址是192.168.1.80服务器端口号是8000

my_tcp.c文件添加完后编译下载

在出现W5500 netdev link status becomes link up后输入tcpclient 192.168.1.80 8000去连接服务器

服务器端显示有客户端连接上了,然后双向收发数据都可以了。

使用RT -Thread Studio开发环境相当简单,甚至都不用看数据手册。

W5500做TCP就这么简单。

 

 

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: STM32F407和W5500是两个独立的硬件模块,分别用于微控制器和以太网通信。在这种情况下,STM32F407是主控制器,而W5500是通信模块。 在STM32F407的TCP客户使用W5500,您需要进行以下步骤: 1. 初始化硬件:将W5500连接到STM32F407的SPI总线,并通过GPIO引脚连接进行硬件初始化。 2. 配置网络参数:使用STM32F407的固件库或其他编程方式,设置W5500的网络参数,例如IP地址、子网掩码、网关等。 3. 初始化W5500:通过SPI总线将W5500的寄存器配置为TCP客户模式,并设置正确的口号。 4. 连接服务器:使用W5500的API函数,在STM32F407上建立TCP连接,指定服务器的IP地址和口号。 5. 发送和接收数据:一旦TCP连接建立,您可以使用STM32F407的SPI总线通过W5500发送和接收数据。您可以使用发送函数发送数据包到服务器,使用接收函数接收来自服务器的响应。 6. 断开连接:在完成数据传输后,使用断开函数关闭TCP连接,释放网络资源。 值得注意的是,您需要正确配置STM32F407和W5500之间的SPI通信,并在您的代码中实现适当的错误处理和计时器,以确保稳定的数据传输和适时的响应。 总而言之,使用STM32F407和W5500,您可以实现一个TCP客户,在该客户上建立连接,发送和接收数据,并且可以通过适当的编程和配置进行自定义和扩展。希望这个简要的回答能帮助您了解如何使用STM32F407和W5500实现TCP客户。 ### 回答2: STM32F407是一款高性能微控制器,而W5500是一种用于建立TCP连接的以太网控制器。将这两种技术结合使用可以实现STM32F407作为TCP客户的功能。 首先,需要在STM32F407上配置和初始化W5500以太网控制器。这可以通过将W5500与STM32F407的SPI总线连接,并使用相应的驱动程序进行配置和初始化来实现。配置的过程中,需要设置W5500的IP地址、子网掩码、网关地址以及目标服务器的IP地址和口号等。 一旦W5500和STM32F407成功地建立了连接,STM32F407就可以使用TCP协议与其他设备进行通信。作为TCP客户,STM32F407可以通过发送SYN请求来与服务器建立连接。这可以通过编写相应的代码来实现,其中需要设置目标服务器的IP地址和口号,并使用W5500发送数据包。 在连接建立之后,STM32F407可以使用TCP协议进行双向通信。它可以发送数据给服务器,并等待服务器的响应。发送数据可以通过将数据写入W5500的发送缓冲区,然后使用W5500发送数据包的方式来实现。接收数据可以通过检测W5500的接收缓冲区并读取其内容来实现。 最后,当STM32F407不再需要与服务器通信时,可以关闭与服务器的连接。这可以通过发送TCP FIN请求给服务器来实现,同时还需要关闭W5500的连接功能。 总而言之,STM32F407与W5500的结合可以实现TCP客户的功能。这需要配置和初始化W5500以太网控制器,并使用TCP协议与服务器进行通信。发送数据和接收数据的过程都可以通过与W5500进行交互来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值