打印
[STM32F1]

【HAL库每天一例】第066例:以太网-基于W5500的11个应用例程

[复制链接]
1696|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
亼亽|  楼主 | 2016-7-10 13:46 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 亼亽 于 2016-7-11 08:43 编辑

【HAL库每天一例】系列例程从今天开始持续更新。。。。。
我们将**每天至少发布一个基于YS-F1Pro开发板的HAL库例程,
该系列例程将带领大家从零开始使用HAL库,后面会持续添加模块应用例程。
同样的,我们还程序发布基于HAL库的指导文档和视频教程,欢迎持续关注,并提出改进意见。
例程下载:
资料包括程序、相关说明资料以及软件使用截图
链接:http://pan.baidu.com/s/1i574oPv
密码:r3s3

(硬石YS-F1Pro开发板HAL库例程持续更新\1. 软件设计之基本裸机例程(HAL库版本)\YSF1_HAL-064. 以太网-W5500


基于W5500的11个应用例程
2. DHCP
3. TCP Server
4. TCP Client
5. UDP
6. DNS
7. SMTP
8. HTTP Server
9. HTTP Client
10. NetBios
11. NTP
12. ping


/**
  ******************************************************************************
  *                           硬石YS-F1Pro开发板例程功能说明
  *
  *  例程名称: 3. TCP Server
  *   
  ******************************************************************************
  * 说明:
  * 本例程配套硬石stm32开发板YS-F1Pro使用。
  *
  * 淘宝:
  * 论坛:http://www.ing10bbs.com
  * 版权归硬石嵌入式开发团队所有,请勿商用。
  ******************************************************************************
  */

【1】例程简介
  W5500 是一款全硬件 TCP/IP 嵌入式以太网控制器,为嵌入式系统提供了更加简易的互联网连接
方案.使用硬件逻辑门电路实现 TCP/IP 协议栈的传输层及网络层(如: TCP, UDP, ICMP, IPv4,
ARP, IGMP, PPPoE 等协议),并集成了数据链路层,物理层,以及 32K 字节片上 RAM 作为数据
收发缓存。使得上位机主控芯片,只需承担TCP/IP 应用层控制信息的处理任务。从而大大节省了上
位机对于数据复制、协议处理和中断处理等方面的工作量,提升了系统利用率及可靠性。
  YS-F1Pro开发板上集成了W5500芯片,可以实现网络通信。  
  本例程实现W5500网络环境搭建,实现TCP通信,W5500网络作为TCP 服务器,建立侦听,PC作为
TCP Client建立连接。
  
【2】跳线帽情况
******* 为保证例程正常运行,必须插入以下跳线帽 **********
丝印编号     IO端口      目标功能引脚        出厂默认设置
  JP1        PA10        TXD(CH340G)          已接入
  JP2        PA9         RXD(CH340G)          已接入
  JP8        PF9         INTn(W5500)          已接入
  JP9        PF11        SCSn(W5500)          已接入
  
【3】操作及现象
使用网线接入YS-F1Pro开发板右上方网口,连接至路由器;使用开发板配套的MINI USB线连接到开发
板标示“调试串口”字样的MIMI USB接口(需要安装驱动),在电脑端打开串口调试助手工具,设置
参数为115200 8-N-1。根据自己网络环境设置w5500_conf.c文件中相关参数,编译程序并下载,等下
载完程序之后,在串口调试助手窗口可接收到信息。打开网络调试助手,设置为TCP Client类型,服务
器IP地址和端口根据串口打印信息设置,然后连接开发板TCP Server,然后可以在发送窗口输入发送
数据;发送之后,在串口调试助手会打印接收到的数据并且会回传到网络通信助手。

/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/


tcp_demo.c文件内容
/**
************************************************************************************************
* [url=home.php?mod=space&uid=288409]@file[/url]                   tcp_demo.c
* [url=home.php?mod=space&uid=187600]@author[/url]                  WIZnet Software Team
* [url=home.php?mod=space&uid=895143]@version[/url]                 V1.0
* [url=home.php?mod=space&uid=212281]@date[/url]                    2015-02-14
* [url=home.php?mod=space&uid=247401]@brief[/url]                   TCP 演示函数
* [url=home.php?mod=space&uid=93590]@Attention[/url]  
************************************************************************************************
**/

#include <stdio.h>
#include <string.h>
#include "Ethernet/Internet/tcp_demo.h"
#include "Ethernet/W5500/W5500_conf.h"
#include "Ethernet/W5500/w5500.h"
#include "Ethernet/W5500/socket.h"

uint8 buff[2048];                                                                               /*定义一个2KB的缓存*/

/**
*[url=home.php?mod=space&uid=247401]@brief[/url]                TCP Server回环演示函数。
*@param                无
*[url=home.php?mod=space&uid=266161]@return[/url]        无
*/
void do_tcp_server(void)
{        
        uint16 len=0;  
        switch(getSn_SR(SOCK_TCPS))                                                                                                            /*获取socket的状态*/
        {
                case SOCK_CLOSED:                                                                                                                          /*socket处于关闭状态*/
                        socket(SOCK_TCPS ,Sn_MR_TCP,local_port,Sn_MR_ND);                /*打开socket*/
                  break;     
   
                case SOCK_INIT:                                                                                                                                  /*socket已初始化状态*/
                        listen(SOCK_TCPS);                                                                                                                /*socket建立监听*/
                  break;
               
                case SOCK_ESTABLISHED:                                                                                                              /*socket处于连接建立状态*/
               
                        if(getSn_IR(SOCK_TCPS) & Sn_IR_CON)
                        {
                                setSn_IR(SOCK_TCPS, Sn_IR_CON);                                                                          /*清除接收中断标志位*/
                        }
                        len=getSn_RX_RSR(SOCK_TCPS);                                                                                    /*定义len为已接收数据的长度*/
                        if(len>0)
                        {
                                recv(SOCK_TCPS,buff,len);                                                                                      /*接收来自Client的数据*/
                                buff[len]=0x00;                                                                                                           /*添加字符串结束符*/
                                printf("%s\r\n",buff);
                                send(SOCK_TCPS,buff,len);                                                                                      /*向Client发送数据*/
                  }
                  break;
               
                case SOCK_CLOSE_WAIT:                                                                                                                /*socket处于等待关闭状态*/
                        close(SOCK_TCPS);
                  break;
        }
}

/**
*@brief                TCP Client回环演示函数。
*@param                无
*@return        无
*/
void do_tcp_client(void)
{        
   uint16 len=0;        

        switch(getSn_SR(SOCK_TCPC))                                                                                                           /*获取socket的状态*/
        {
                case SOCK_CLOSED:                                                                                                                         /*socket处于关闭状态*/
                        socket(SOCK_TCPC,Sn_MR_TCP,local_port++,Sn_MR_ND);
                  break;
               
                case SOCK_INIT:                                                                                                                                 /*socket处于初始化状态*/
                        connect(SOCK_TCPC,remote_ip,remote_port);                /*socket连接服务器*/
                  break;
               
                case SOCK_ESTABLISHED:                                                                                                              /*socket处于连接建立状态*/
                        if(getSn_IR(SOCK_TCPC) & Sn_IR_CON)
                        {
                                setSn_IR(SOCK_TCPC, Sn_IR_CON);                                                                  /*清除接收中断标志位*/
                        }
               
                        len=getSn_RX_RSR(SOCK_TCPC);                                                                                    /*定义len为已接收数据的长度*/
                        if(len>0)
                        {
                                recv(SOCK_TCPC,buff,len);                                                                                     /*接收来自Server的数据*/
                                buff[len]=0x00;                                                                                                           /*添加字符串结束符*/
                                printf("%s\r\n",buff);
                                send(SOCK_TCPC,buff,len);                                                                                      /*向Server发送数据*/
                        }                  
                  break;
                        
                case SOCK_CLOSE_WAIT:                                                                                                              /*socket处于等待关闭状态*/
                        close(SOCK_TCPC);
                  break;

        }
}






沙发
mintspring| | 2016-7-10 17:57 | 只看该作者
每天都可以跟楼主一起进步,话说这个网络的必须学,以后这个都要物联网的,必须的。

使用特权

评论回复
板凳
dontium| | 2019-7-9 00:21 | 只看该作者
我用楼主的程序,出现以下情况,不知道怎么回事?

使用特权

评论回复
地板
caoenq| | 2019-7-19 09:33 | 只看该作者
你好,楼主,网盘已经打不开了,请重新分享一份。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

122

主题

216

帖子

48

粉丝