IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> W5500 TCP客户端开发 | 02 - 使用W5500建立TCP客户端 -> 正文阅读

[网络协议]W5500 TCP客户端开发 | 02 - 使用W5500建立TCP客户端

一、W5500几个常用寄存器介绍

1. 本地网络信息配置寄存器

  • GAR (网关 IP 地址寄存器):该寄存器用来设置默认网关地址。如:“192.168.0.1”
  • SUBR (子网掩码寄存器):该寄存器用来设置子网掩码地址。如:“255.255.255.0”
  • SHAR (源 MAC 地址寄存器):该寄存器用来设置源 MAC 地址。如:“00.08.DC.01.02.03”
  • SIPR (源 IP 地址寄存器):该寄存器用来设置源 IP 地址。如:“192.168.0.2”
/**
 @brief Gateway IP Register address
 */
#define GAR0                        (0x000100)
#define GAR1                        (0x000200)
#define GAR2                        (0x000300)
#define GAR3                        (0x000400)
/**
 @brief Subnet mask Register address
 */
#define SUBR0                       (0x000500)
#define SUBR1                       (0x000600)
#define SUBR2                       (0x000700)
#define SUBR3                       (0x000800)

/**
 @brief Source MAC Register address
 */
#define SHAR0                       (0x000900)
#define SHAR1                       (0x000A00)
#define SHAR2                       (0x000B00)
#define SHAR3                       (0x000C00)
#define SHAR4                       (0x000D00)
#define SHAR5                       (0x000E00)
/**
 @brief Source IP Register address
 */
#define SIPR0                       (0x000F00)
#define SIPR1                       (0x001000)
#define SIPR2                       (0x001100)
#define SIPR3                       (0x001200)

2. Socket 端口寄存器

  • Sn_MR(Socket n 模式寄存器):该寄存器用于配置所有 SOCKET 的选项或协议类型。
/* Sn_MR values */
#define Sn_MR_CLOSE                  0x00     /**< unused socket */
#define Sn_MR_TCP                    0x01     /**< TCP */
#define Sn_MR_UDP                    0x02     /**< UDP */
#define Sn_MR_IPRAW                  0x03      /**< IP LAYER RAW SOCK */
#define Sn_MR_MACRAW                 0x04      /**< MAC LAYER RAW SOCK */
#define Sn_MR_PPPOE                  0x05     /**< PPPoE */
#define Sn_MR_UCASTB                 0x10     /**< Unicast Block in UDP Multicating*/
#define Sn_MR_ND                     0x20     /**< No Delayed Ack(TCP) flag */
#define Sn_MR_MC                     0x20     /**< Multicast IGMP (UDP) flag */
#define Sn_MR_BCASTB                 0x40     /**< Broadcast blcok in UDP Multicating */
#define Sn_MR_MULTI                  0x80     /**< support UDP Multicating */
  • Sn_CR (Socket n 配置寄存器):该寄存器用于设置 Socket n 的配置命令如 OPEN 、CLOSE、CONNECT、LISTEN、END 和 RECEIVE。
/* Sn_CR values */
#define Sn_CR_OPEN                   0x01     /**< initialize or open socket */
#define Sn_CR_LISTEN                 0x02     /**< wait connection request in tcp mode(Server mode) */
#define Sn_CR_CONNECT                0x04     /**< send connection request in tcp mode(Client mode) */
#define Sn_CR_DISCON                 0x08     /**< send closing reqeuset in tcp mode */
#define Sn_CR_CLOSE                  0x10     /**< close socket */
#define Sn_CR_SEND                   0x20     /**< update txbuf pointer, send data */
#define Sn_CR_SEND_MAC               0x21     /**< send data with MAC address, so without ARP process */
#define Sn_CR_SEND_KEEP              0x22     /**<  send keep alive message */
#define Sn_CR_RECV                   0x40     /**< update rxbuf pointer, recv data */
  • Sn_SR (Socket n 状态寄存器):Sn_SR 指示了 Socket n 的状态,并根据 Sn_CR 或者一些 TCP 模式下的特殊控制包,如 SYN,FIN 包而改变。
/* Sn_SR values */
#define SOCK_CLOSED                  0x00     /**< closed */
#define SOCK_INIT                    0x13     /**< init state */
#define SOCK_LISTEN                  0x14     /**< listen state */
#define SOCK_SYNSENT                 0x15     /**< connection state */
#define SOCK_SYNRECV                 0x16     /**< connection state */
#define SOCK_ESTABLISHED             0x17     /**< success to connect */
#define SOCK_FIN_WAIT                0x18     /**< closing state */
#define SOCK_CLOSING                 0x1A     /**< closing state */
#define SOCK_TIME_WAIT               0x1B     /**< closing state */
#define SOCK_CLOSE_WAIT              0x1C     /**< closing state */
#define SOCK_LAST_ACK                0x1D     /**< closing state */
#define SOCK_UDP                     0x22     /**< udp socket */
#define SOCK_IPRAW                   0x32     /**< ip raw mode socket */
#define SOCK_MACRAW                  0x42     /**< mac raw mode socket */
#define SOCK_PPPOE                   0x5F     /**< pppoe socket */
  • Sn_PORT (Socket n 源端口寄存器):该寄存器配置了 Socket n 的源端口号。当 Socket n 工作在 TCP 或 UDP 模式下,该寄存器生效。
/**
 @brief source port register
 */
#define Sn_PORT0(ch)                    (0x000408 + (ch<<5))
#define Sn_PORT1(ch)                    (0x000508 + (ch<<5))
  • Sn_DIPR (Socket 目标 IP 地址寄存器):Sn_DIPR 配置或指示的为 Socket n 的目标主机 IP 地址,在 TCP/UDP 模式下生效。
  • Sn_DPORT (Socket n 目标端口寄存器):Sn_DPORT 配置或指示了 Socket n 的目标主机端口号,在 TCP/UDP 模式下生效。

二、TCP客户端的实现

1.实现功能

  • 实现一个TCP客户端,发起跟服务器的TCP连接请求,连接成功后先向服务器发送数据,然后接收服务器回发的数据之后通过串口打印。

2.实现思路

  • 在编写TCP客户端应用程序时,可以通过查询socket状态寄存器(Sn_SR)的状态来实现TCP连接。

3.实现代码

  • 编写本地网络配置函数
void W5500_SetNetwork(void)
{
	uint8_t ip[4];
	
	//GPIO初始化
	W5500_GPIO_Configuration();
	W5500_NVIC_Configuration(); 
	Reset_W5500();
	W5500_SPI_Init();
	
	//配置本地网络参数
	setSHAR(MAC);
	setSUBR(Mask);
	setGAR(Gateway);
	setSIPR(Local_IP);
	
	sysinit(txsize, rxsize);
	setRTR(2000);
	setRCR(3);
	
	getSIPR (ip);
	printf("IP : %d.%d.%d.%d\r\n", ip[0],ip[1],ip[2],ip[3]);
	getSUBR(ip);
	printf("SN : %d.%d.%d.%d\r\n", ip[0],ip[1],ip[2],ip[3]);
	getGAR(ip);
	printf("GW : %d.%d.%d.%d\r\n", ip[0],ip[1],ip[2],ip[3]);
}
  • 编写TCP客户端实现代码TCP_Client
//定义变量
uint16_t local_port = 5000;
uint8_t recv_buf[2080];
uint8_t send_buf[2080];

void TCP_Client(uint8_t sn, uint8_t *server_ip, uint8_t server_port)
{
	uint8_t recv_len;
	
	switch(getSn_SR(sn))	
	{
		case SOCK_CLOSED:
			 printf("- TCP Client Start!\r\n");
			 //打开socket sn,并配置为TCP无延时模式,打开一个本地端口
			 socket(sn, Sn_MR_TCP, local_port, Sn_MR_ND);
			 printf("- Socket %d open success.", sn);
		break;
		case SOCK_INIT:
			 printf("- Try to connect %d.%d.%d.%d:%d...\r\n", 
					 server_ip[0], server_ip[1], server_ip[2], server_ip[3], server_port);
			 //向TCP服务器发出连接请求
			 connect(sn, server_ip, server_port);
		break;
		//socket处于连接建立状态
		case SOCK_ESTABLISHED:
			 if(getSn_IR(sn) & Sn_IR_CON)   					
			 {
			 	 printf("- Socket %d:Connected to - %d.%d.%d.%d : %d\r\n",
			 	 		sn, server_ip[0], server_ip[1], server_ip[2], server_ip[3], server_port);
			 	 //连接成功标志
				 setSn_IR(sn, Sn_IR_CON);
			 }
			 //接收来自服务器数据的大小
			 recv_len = getSn_RX_RSR(sn);
			 if(recv_len > 0)
			 {
			 	//接收来自服务器的数据
			 	recv(sn, recv_buf, recv_len);
			 	printf("- Socket[%d]: Recv data: [%s]\r\n", sn, recv_buf);
			 }
			 strcpy((char*)send_buf, "Hello, Server!");
			 //发送给服务器的数据
			 send(sn, send_buf, strlen((char*)send_buf));
			 printf("- Socket[%d]: Send data: [%s]\r\n", sn, send_buf);
		break;
		//socket处于等待关闭状态
		case SOCK_CLOSE_WAIT:
			 close(sn);
		break;
	}
}
  • 在main.c中定义服务器IP地址跟端口
//服务器IP地址
uint8_t server_ip[4] = {192, 168, 1, 121};
//服务器端口
uint16_t server_port = 8080;
  • 在main()函数while(1)循环中调用TCP_Client
int main()
{
	//本地网络配置初始化
	W5500_SetNetwork();
	...
	while(1)
	{
		//打开socket0(一共8路socket,0-7)
		TCP_Client(0, server_ip, server_port);
	}
	...
}

4.验证结果

  • 串口助手打印结果
    在这里插入图片描述
  • 在网络调试助手建立TCP服务器,端口8080

在这里插入图片描述

  • 重定向printf函数到串口输出(标准库)
#include <stdio.h>

#pragma import(__use_no_semihosting)

void _sys_exit(int x)
{
    x = x;
}

struct __FILE
{
    int handle;
};

FILE __stdout;

int fputc(int ch, FILE *stream)
{
    while((USART1->SR & 0X40) == 0);

    USART1->DR = (uint8_t) ch;

    return ch;
}

5.常见问题

  • 串口打印没有输出(print重定向问题)
  • 串口输出有数据,就是连接不上服务器(本地网络配置没有初始化)
  • 测试时需用网线交叉线(一端568A,一端568B)将开发板与电脑互连
  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-08-28 09:42:41  更:2021-08-28 09:44:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 21:31:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码