---
title: "W5300 + STM32F407ZGT6 project development"
url: "https://maker.wiznet.io/chen/projects/w5300-stm32f407zgt6-project-development/"
markdown_url: "https://maker.wiznet.io/chen/projects/w5300-stm32f407zgt6-project-development/md"
type: "UCC: User Created Content"
author: "夜歌坤拓"
author_url: "https://blog.csdn.net/LuoQianQiu/article/details/119422650?ops_request_misc=&request_id=&biz_id=102&utm_term=w5300%E4%BB%A5%E5%A4%AA%E7%BD%91%E9%80%9A%E4%BF%A1&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~sobaiduweb~default-8-119422650.185"
editor: "WIZnet"
editor_url: "https://maker.wiznet.io/"
original_author: "夜歌坤拓"
original_url: "https://blog.csdn.net/LuoQianQiu/article/details/119422650?ops_request_misc=&request_id=&biz_id=102&utm_term=w5300%E4%BB%A5%E5%A4%AA%E7%BD%91%E9%80%9A%E4%BF%A1&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~sobaiduweb~default-8-119422650.185"
published: "2022-09-30"
language: "en"
hardware: ["WIZnet W5300"]
likes: 5
views: 1362
comments: 0
source: "WIZnet Makers (https://maker.wiznet.io/)"
---

# W5300 + STM32F407ZGT6 project development

> W5300 + STM32F407ZGT6 TCP modbus development blog article in CSDN

Original author: 夜歌坤拓 (source: https://blog.csdn.net/LuoQianQiu/article/details/119422650?ops_request_misc=&request_id=&biz_id=102&utm_term=w5300%E4%BB%A5%E5%A4%AA%E7%BD%91%E9%80%9A%E4%BF%A1&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~sobaiduweb~default-8-119422650.185)

## Components

- **WIZnet W5300** x 1 ([docs](https://docs.wiznet.io/Product/Chip/Ethernet/W5300))

## Article

一 项目背景

项目名称是模拟盘，其中主控使用的是STM32F407ZGT6，使用W5300网卡，两种通信方式：tcp_modbus(ip协议) 和 CAN通信。

从机，就是主控的下属设备。使用的芯片相同，主要就是引脚的输入输出，和CAN实现与主控之间的通信。

二 问题分析

第一次负责一个项目的，有紧张，更多的还是欣喜。来公司半年，终于要单独负责一个项目的开发了，这应该是我成长的一个体现。之前干的是某个系统中的某一块功能。从接手这个项目到今天，已经快一个月了，主控的各个模块的功能已经实现，整个项目哦，包括驱动开发，应用开发还差最后的联通调试。

昨天下午，坐在电脑前冷静分析近段时间所遇到的问题，发现了许多不足之处。

1.在给整个系统做框架时，我虽然分析好了整体流程的大概框架，我以为框架的设计，只要主体流程的正确，就可以了，但是在后续的开发过程中发现，错了。

反思：我应该分析的更详细一些，把系统中具体的每一个功能模块的流程图也分析出来。

2.程序开发过程，没有顺序性，只是想到了哪一个模块，就完善哪一个模块的功能。没有系统性，会造成程序的重复开发，对开发进度不明确，浪费时间。

反思：程序开发之前，把整个系统的逻辑框图滤清，明确的分割出不同的功能模块，进行模块化开发，当某一模块的功能完成时，进行检验，测试后，完成闭环，就是模块功能，编程实现完毕。

三 系统开发

1.主控的逻辑框图。类似于流程图，相当于流程图的上位：

2.下面是tcp/ip协议实现的逻辑框图，使用网卡W5300.

服务器端和客户端的区别

四 程序概要

1.服务器端的程序实现，它是实现与CAN和与上位机的通信

/* ----------------------- System includes ----------------------------------*/
#include &lt;stdio.h>
#include &lt;string.h>

#include "port.h"
#include "wizsocket.h"
/* ----------------------- lwIP includes ------------------------------------*/
#include "lwip/api.h"
#include "lwip/tcp.h"

/* ----------------------- Modbus includes ----------------------------------*/
#include "mb.h"
#include "mbport.h"

/* ----------------------- MBAP Header --------------------------------------*/
#define MB_TCP_UID 6
#define MB_TCP_LEN 4
#define MB_TCP_FUNC 7

/* ----------------------- Defines -----------------------------------------*/
#define MB_TCP_DEFAULT_PORT 502 /* TCP listening port. */
#define MB_TCP_BUF_SIZE ( 256 + 7 ) /* Must hold a complete Modbus TCP frame. */

/* ----------------------- Prototypes ---------------------------------------*/
int W5300_TCPServer_Recv(void);
BOOL XMB_W5300_TCPServer_Send( const UCHAR * pucMBTCPFrame, USHORT usTCPLength );
volatile int sock;
/* ----------------------- Static variables ---------------------------------*/
static UCHAR aucTCPBuf[MB_TCP_BUF_SIZE];
static USHORT usTCPBufPos;

/* ----------------------- Static functions ---------------------------------*/

/* ----------------------- Begin implementation -----------------------------*/
/***
* @brief 函数名:W5300s_TCPServer_Init
*功能： W5300网卡通信流程初始化
*
*param 参数：无
*
*return 初始化是否成功
***/
BOOL W5300s_TCPServer_Init(USHORT usTCPPort) // TCP Server
{
int ret;

/*创建套接字*/
int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

/*绑定本地IP*/
struct sockaddr_in LocalAddr;
memset(&LocalAddr, 0, sizeof(LocalAddr)); //每个字节都用0填充
LocalAddr.sin_family = PF_INET;
LocalAddr.sin_addr = inet_addr("192.168.1.6");
LocalAddr.sin_port = usTCPPort;

ret = bind(sock,(struct sockaddr *)&LocalAddr, sizeof(LocalAddr)); //绑定

if(ret &lt; 0)
return FALSE;

/*进入监听状态*/
ret = listen(sock, 20);
if(ret &lt; 0)
return FALSE;

return TRUE;
}
//
/*
* @brief tcp_sendto_can 接收tcp数据中的modbus
*
* @param None
*
* @return int型数据
*/
//
int W5300_TCPServer_Recv(void)
{
int ret = 0; //数据长度
int reflag = FALSE;
/*接收客户端请求*/
int clntSock;
struct sockaddr_in clntAddr;
int nSize = sizeof(clntAddr);

/*等待客户端链接，阻塞 */
//vDebug("Waiting for client connection...\n");
while(1)
{
clntSock = accept(sock, (struct sockaddr*)&clntAddr, &nSize);
if(clntSock != -1)
break;
}
/*接收客户端数据*/
//vDebug("Waiting for client to send data...\n");
while(1)
{
ret = recv(clntSock,aucTCPBuf,sizeof(aucTCPBuf), NULL);
if(ret != -1)
{
reflag = TRUE;
break;
}
}

usTCPBufPos = (USHORT)ret; //供modbus使用

return reflag;
}
BOOL
xMBTCPPortGetRequest( UCHAR ** ppucMBTCPFrame, USHORT * usTCPLength )
{
*ppucMBTCPFrame = &aucTCPBuf[0];
*usTCPLength = usTCPBufPos;
/* Reset the buffer. */
usTCPBufPos = 0;

return TRUE;
}
/***
* XMBTCP_Can_Sendto_Tcp
* 接收虚拟寄存器中的数据，然后使用W5300发送出去
*
***/
BOOL XMB_W5300_TCPServer_Send( const UCHAR * pucMBTCPFrame, USHORT usTCPLength )
{
/*接收客户端请求*/
int clntSock;
struct sockaddr_in clntAddr;
int nSize = sizeof(clntAddr);
/*等待客户端链接*/
//vDebug("Waiting for client connection...\n");
while(1)
{
//应该增加连接超时处理机制
clntSock = accept(sock, (struct sockaddr*)&clntAddr, &nSize);
if(clntSock != -1)
break;
}
/*向客户端发送数据*/;
send(clntSock, pucMBTCPFrame, usTCPLength, 0);
return TRUE;
}

————————————————
版权声明：本文为CSDN博主「夜歌坤拓」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。
原文链接：https://blog.csdn.net/LuoQianQiu/article/details/119422650

---

Source: https://maker.wiznet.io/chen/projects/w5300-stm32f407zgt6-project-development/
