51单片机 ENC28J60 TCP/IP通信

article/2025/11/5 14:49:58

转载地址
https://blog.csdn.net/a_a666/article/details/78277628

51单片机 ENC28J60 TCP/IP通信

  • 单片机:STC90C516RD+
  • ENC28J60模块:mini(3.3V供电)
  • 设备:PC、开发板、两个网线、路由器

首先先介绍一下本文的移植针对于单片机做TCP Server,PC端为TCP Client,实现单片机和PC(网络太调试助手)之间的相互通信,并没有涉及到http和远程端口服务。

一、ENC28J60的配置
1.ENC28J60模块的介绍
VCC、GND 我用的VCC是3.3V,接5V发烫 管脚主要有4根 SPI协议 控制4根线
2.ENC28J60的函数详细说明可以在CSDN上的博客找到,写的十分详细,买到的模块所带的例程包含ENC28J60.c以及ENC28J60.h文件,这两个文件基本上不需要做出更改。不需要用的部分可以进行删减,以实现代码容量减小。
3.在主函数中调用即可。
在这里我的调用函数是dev_init();这是因为在ENC28J60.c文件中对初始化函数进行了封装。

//主函数
dev_init();//通过该函数调用网卡初始化
//ENC28J60.c
void dev_init(void)
{enc28j60_init();
}

二、UIP的移植
这是因为TCP协议是分层,uip的协议栈是在底层的,也就相当于底层程序,是不需要自己写的,一般的例程里面都有,这里根据我项目的需要,我将uip.c、uipopt.h以及uip_arp.c和uip_arch.c移植到工程当中。需要修改的地方主要在uipopt.h当中,该文件主要用于配置IP地址(单片机的),网关以及网络掩码的,这些可以进入命令窗口,输入configip,按Enter键,IP的参数就有了。注意:板子的IP和电脑的IP是不相同的。
在这里主要介绍比较重要的uip使用

//使用是注意将uip_popt.h中的UIP_FIXEDADDR更改为0,不然会报错这是主动配置IPuip_ipaddr(ipaddr,192,168,1,113);  //配置板子ipuip_sethostaddr(ipaddr);//  uip_sethostaddr(ipaddr);uip_ipaddr(ipaddr,192,168,1,1);    //配置网关uip_setdraddr(ipaddr);uip_ipaddr(ipaddr,255,255,255,0);   //配置子网掩码uip_setnetmask(ipaddr);
uip_send(neirong,len);首先这个函数比较特别,一开始使用的时候,以为和普通的发送函数没有什么区别,调用完之后就能发送了,可是没有想到这个函数并不能主动发送数据,在TCP事件的处理函数appcall()中,可以使用发送数据,然而这个函数只能将最后一次发送的内容发送出去。网上百度了一下,发现没有什么好的方法让单片机主动发送,最后,找到一个可以主动发送内容TCP协议框架,等具体到后面介绍TCP服务时再详细说。
uip_listen(HTONS(8000)); //监听本地端口8000,在TCP网络调试助手上TCP Client的那个端口设置先说些必须要使用的三、TCP Sever程序这部分内容可以说是IP往上一层的配置最主要的就是Allcall函数
//这是一个TCP 服务器应用回调函数。
//该函数通过UIP_APPCALL(tcp_demo_appcall)调用,实现Web Server的功能.
//当uip事件发生时,UIP_APPCALL函数会被调用,根据所属端口(1200),确定是否执行该函数。
//例如 : 当一个TCP连接被创建时、有新的数据到达、数据已经被应答、数据需要重发等事件
void tcp_server_demo_appcall(void)
{struct tcp_demo_appstate *s = (struct tcp_demo_appstate *)&uip_conn->appstate;if(uip_aborted())tcp_server_aborted();      //连接终止if(uip_timedout())tcp_server_timedout();    //连接超时   if(uip_closed())tcp_server_closed();        //连接关闭     if(uip_connected())tcp_server_connected();  //连接成功      if(uip_acked())tcp_server_acked();          //发送的数据成功送达 //接收到一个新的TCP数据包 if (uip_newdata())//收到客户端发过来的数据{if((tcp_server_sta&(1<<6))==0)//还未收到数据{if(uip_len>199){          ((unsigned char*)uip_appdata)[199]=0;}   strcpy((char*)tcp_server_databuf,uip_appdata);                        tcp_server_sta|=1<<6;//表示收到客户端数据}}else if(tcp_server_sta&(1<<5))//有数据需要发送{s->textptr=tcp_server_databuf;s->textlen=strlen((const char*)tcp_server_databuf);tcp_server_sta&=~(1<<5);//清除标记}   //当需要重发、新数据到达、数据包送达、连接建立时,通知uip发送数据 if(uip_rexmit()||uip_newdata()||uip_acked()||uip_connected()||uip_poll()){tcp_server_senddata();}
}

最后、放上主函数的程序

#include "uip.h" 
#include "uip_arp.h"
#include "enc28j60.h"
#include "tcp_demo.h"
#include "USART.h"
#include "stdio.h"
#include <string.h>
#define BUF ((struct uip_eth_hdr *)&uip_buf[0])#ifndef NULL
#define NULL (void *)0
#endif /* NULL */
/*-----------------------------------------------------------------------------------*/
int
main(void)
{unsigned char tcnt=0;unsigned char tcp_server_tsta=0XFF;idata u8_t i, arptimer;idata u16_t j;idata u16_t ipaddr[2];USART_Init();SendString("ENC28J60 Test Start...\r\n");/* Initialize the device driver. */ dev_init();uip_arp_init();/* Initialize the uIP TCP/IP stack. */uip_init();SendString("http://ag-embeded.taobao.com\r\n");/* Initialize the HTTP server. */uip_ipaddr(ipaddr,192,168,1,113);  //配置ipuip_sethostaddr(ipaddr);//  uip_sethostaddr(ipaddr);uip_ipaddr(ipaddr,192,168,1,1);    //配置网关uip_setdraddr(ipaddr);uip_ipaddr(ipaddr,255,255,255,0);   //配置子网掩码uip_setnetmask(ipaddr);uip_listen(HTONS(8000));//tcp_server_init();arptimer = 0;SendString("http://shop64454242.taobao.com\r\n");
thanks"));while(1) {/* Let the tapdev network device driver read an entire IP packetinto the uip_buf. If it must wait for more than 0.5 seconds, itwill return with the return value 0. If so, we know that it istime to call upon the uip_periodic(). Otherwise, the tapdev hasreceived an IP packet that is to be processed by uIP. */uip_len = dev_poll();for(j=0;j<500;j++);if(uip_len == 0) {for(i = 0; i < UIP_CONNS; i++) {uip_periodic(i);/* If the above function invocation resulted in data thatshould be sent out on the network, the global variableuip_len is set to a value > 0. */if(uip_len > 0) {uip_arp_out();dev_send();}}#if UIP_UDPfor(i = 0; i < UIP_UDP_CONNS; i++) {uip_udp_periodic(i);/* If the above function invocation resulted in data thatshould be sent out on the network, the global variableuip_len is set to a value > 0. */if(uip_len > 0) {uip_arp_out();dev_send();}}
#endif /* UIP_UDP *//* Call the ARP timer function every 10 seconds. */if(++arptimer == 20) { uip_arp_timer();arptimer = 0;}} else {if(BUF->type == htons(UIP_ETHTYPE_IP)) {uip_arp_ipin();uip_input();/* If the above function invocation resulted in data thatshould be sent out on the network, the global variableuip_len is set to a value > 0. */if(uip_len > 0) {uip_arp_out();dev_send();}} else if(BUF->type == htons(UIP_ETHTYPE_ARP)) {uip_arp_arpin();/* If the above function invocation resulted in data thatshould be sent out on the network, the global variableuip_len is set to a value > 0. */    if(uip_len > 0) {   dev_send();}}}if(tcp_server_tsta!=tcp_server_sta)//TCP Server状态改变{                                                            if(tcp_server_sta&(1<<7))   SendString("TCP Server Connected   ");else    SendString("TCP Server Disconnected");if(tcp_server_sta&(1<<6))   //收到新数据{SendString("in up");//打印数据tcp_server_sta&=~(1<<6);       //标记数据已经被处理 }tcp_server_tsta=tcp_server_sta;}   }if(Button == 0)//TCP Server 请求发送数据Button按下发送数据{if(tcp_server_sta&(1<<7))   //连接还存在{sprintf((char*)tcp_server_databuf,"TCP Server OK \r\n");     tcp_server_sta|=1<<5;//标记有数据需要发送tcnt++;}}return 0;
}

转载一些资料
http://blog.csdn.net/kjlrzzyffmx/article/details/47292135
http://www.360doc.com/content/14/1127/15/20642619_428506515.shtml
http://m.eeworld.com.cn/ic_article/267/33638.html


http://chatgpt.dhexx.cn/article/BZbAg6UZ.shtml

相关文章

STM32+ENC28J60+UIP协议栈实现WEB服务器示例

一、环境介绍 MCU: STM32F103ZET6 网卡: ENC28J60 协议栈: UIP 开发软件: Keil5 二、功能介绍 完整项目源码下载链接&#xff1a;https://download.csdn.net/download/xiaolong1126626497/18617694 STM32控制ENC28J60UIP协议栈创建TCP服务器(WEB服务器)&#xff0c;支持…

ENC28J60+STM32F103在STM32CubeIDE上移植lwIP2.1.2

ENC28J60STM32F103在STM32CubeIDE上移植lwIP2.1.2 为了学习lwIP&#xff0c;网购了一块正点原子的Mini STM32开发板和一个ENC28J60以太网模块&#xff0c;发现正点原子所给的示例代码是基于lwIP1.4.1的&#xff0c;有点偏老&#xff0c;最新版本的lwIP是2.1.2&#xff0c;使用的…

RT-Thread—STM32—enc28j60

!!! 本文已同步到码云 - 点击此链接获取最新 - 可进入码云提交修改 !!! 概述 本教程主要是讲解如何使用ENC28J60模块介入以太网 本例程的模板使用通用模板环境搭建里面的模板RT-Thread—STM32—环境搭建 文末也有我移植好的例程&#xff0c;不过建议大家从头开始移植&#xf…

GD32F4xx 以太网芯片(enc28j60)驱动移植

1、enc28j60 简介 ENC28J60 是带有行业标准串行外设接口(SPI)的独立以太网控制器。 主要特性: (1)SPI最高通信速率:10Mb/s。只支持SPI的模式0,0,且SPI端口要求SCK在空闲状态时为低电平。 (2)支持全双工和半双工模式。 (3)8KB 发送/接收数据包双端口RAM.,可配置发送…

enc28j60 linux 驱动_linux enc28j60网卡驱动移植(硬件spi和模拟spi)

本来想移植DM9000网卡的驱动&#xff0c;无奈硬件出了点问题&#xff0c;通过杜邦线链接开发板和DM9000网卡模块&#xff0c;系统上电&#xff0c;还没加载网卡驱动就直接崩溃了&#xff0c;找不到原因。。。刚好手上有一个enc28j60的网卡模块&#xff0c;于是就着手移植enc28j…

lwip-2.1.3在STM32F103ZE+ENC28J60有线网卡上无操作系统移植(使用STM32 HAL库)

程序下载链接&#xff1a;百度网盘 请输入提取码&#xff08;提取码&#xff1a;k6tz&#xff09; 【重要说明】 连接方式一&#xff08;推荐&#xff09;&#xff1a; 电脑有线网卡断开&#xff0c;无线网卡连无线路由器&#xff0c;无线网卡配置成自动获取IP地址。 板子的E…

enc28j60是带SPI接口的独立以太网控制器(即网卡),兼容IEEE 802.3,集成MAC和10 BASE-T PHY.而KSZ8081只是PHY芯片和网口扫盲三:以太网芯片MAC和PHY的关系

百度百科中介绍以太网控制器也称以太网适配器&#xff0c;就是我们通常称的“网卡”。电脑中网卡通过PCI和CPU相连&#xff0c;网卡上RJ45插网线水晶头。教程中的ENC28J60通过SPI和单片机相连&#xff0c;ENC28J60模块的RJ45插网线的水晶头 以太网控制器_百度百科 1.概述 enc2…

基于enc28j60的学习心得

1.概述 enc28j60是带SPI接口的独立以太网控制器&#xff0c;兼容IEEE 802.3&#xff0c;集成MAC和10 BASE-T PHY&#xff0c;最高速度可达10Mb/s。基于enc28j60控制器的理解可阅读文章&#xff1a; ENC28J60学习笔记&#xff0c;在该文章内详细介绍控制器的使用方法&#xff0c…

单片机学习:手把手教你移植LWIP(ENC28J60)

这里只是移植&#xff0c;所以LWIP那么多的协议都不需要管&#xff0c;只要知道哪里需要我们修改&#xff0c;为什么修改就可以了。 上图就是整个移植的基本思路&#xff0c;非常清晰的三个层次。其实想想&#xff0c;本质上就是收发数据&#xff0c;只是LWIP协议通过对数据的…

单片机 STM32 HAL 网络模块 ENC28J60

文章目录 一、 简介二、特性三、示例代码 一、 简介 ENC28J60 是带有行业标准串行外设接口&#xff08;Serial Peripheral Interface&#xff0c;SPI&#xff09;的独立以太网控制器。它可作为任何配备有 SPI 的控制器的以太网接口。ENC28J60 符合IEEE 802.3的全部规范&#x…

ENC28J60 简介

单片机以太网方案 单片机想要使用以太网的话&#xff0c;通常有以下几种方案&#xff1a; 如果 MCU 内部集成 MAC 控制器&#xff0c;则只需外接一个 PHY 芯片就可以了如果 MCU 内部没有 MAC 控制器&#xff0c;需要外接 MAC 芯片和 PHY 芯片&#xff0c;这两颗芯片可以分立也…

c语言程序设计 国外教材,标准C程序设计(第7版国外计算机科学经典教材)

导语 内容提要 E.巴拉古路萨米著李周芳译的《标准C程序设计(第7版国外计算机科学经典教材)》专门用于满足渴望成为程序员的学生&#xff0c;最新版按照Bloom分类法所定的学习目标来呈现主题&#xff0c;支持基于学习的成果。本书解释了基本概念和高级内容&#xff0c;且主要关注…

学习C语言的教材

作者&#xff1a; 阮一峰 日期&#xff1a; 2011年9月18日 我的C语言是自学的&#xff0c;这些年看过不少教材。 下面&#xff0c;我对其中一些教材做个点评。 1. How to Think Like a Computer Scientist: C version 这是我读过最易懂的C语言教材。 虽然它只讲解最基本的语法&…

新概念c语言周二强07答案,新概念C语言能力教程(普通高等教育十二五规划教材)...

导语 内容提要 周二强编写的《新概念C语言能力教程(普通高等教育十二五规划教材)》以先进的教学理念为指导&#xff0c;以培养编程能力与学习能力为目标&#xff0c;从全新的角度解析了C语言&#xff0c;高屋建瓴地阐释了C语言学习中的诸多难点&#xff0c;对序列点、指针等概念…

计算机程序c语言教材,全国计算机等级考试二级C语言程序设计教材(2018年版)...

2018年计算机二级教材&#xff1a;C语言程序设计 简介 书名&#xff1a;全国计算机等级考试二级教程——C语言程序设计(2018年版) 作者&#xff1a;教育部考试中心 出版社&#xff1a;高等教育出版社 出版时间&#xff1a;2017年11月 ISBN&#xff1a;9787040488524 定价&#…

树莓派(0)C语言教材学习

学习日记的功能主要是记录学习C语言的知识还有难上手的地方&#xff0c;之后会记录配置树莓派环境还有设计linux环境下C语言的实验题目 目前在K&R的《C语言程序设计》教材学习&#xff0c;前面的内容没有难度&#xff0c;基本上和高级程序设计语言的学习思路一样&#xff0…

国内C语言教材中几种值得商榷的说法

作者&#xff1a;巨同升 “C语言程序设计”这门课程在国内高校普遍开设已有近三十年&#xff0c;课程的建设和研究取得了长足的进步&#xff0c;涌现出了数量众多、各具特色的C语言教材。尽管如此&#xff0c;在许多C语言教材中还或多或少地存在着一些不准确甚至是值得商榷的说…

既然谭浩强的C语言教材不好,那应该选什么书作C语言教材?

易道云学院C语言/C语法学习不在于你看了多少书&#xff0c;而在于你实实在在写了多少有效代码。易道云学院 回到这个问题&#xff0c;其实我个人认为&#xff0c;看什么样的书&#xff0c;也是需要应对不一样的场景易道云学院去有目的地涉猎。我暂时想到了几种情况&#xff0c;…

c语言课本答案解析宋士银,c语言教材

22.40定价&#xff1a;28.00(8折) /2007-02-01 根据教育部高等学校计算机科学与技术教学指导委员会提出的《关于进一步加强高等学校计算机基础教学的意见暨计算机基础课程教学基本要求》的有关要求&#xff0c;编者组织了一批多年工作在教学一线且有丰富教学经验的教师编写了《…

C语言的环境变量配置

一、编辑器选择与安装 这边选用的编辑器是比较常见的devc&#xff0c;当然vscode和vc也都可以用来学习C语言&#xff0c;要软件和C语言环境变量的话可以加QQ群&#xff1a;373270625 第一步全部默认勾选就行无脑下一步 第二步选择一个放软件的文件夹&#xff0c;我这边选择的…