ALIENTEK 战舰ENC28J60 LWIP和UIP补充例程(LWIP WEB有惊喜)
前面的话:自从接触网络模块,到现在有一阵子时间了,未来必定是网络的世界。学一些网络方面的知识是有必要的。我们ALINTEK 推出的ENC28J60网络模块块作为入门还是不错的。详细见此贴:
http://www.openedv.com/posts/list/9355.htm。时间对于一个开发人员是很宝贵的,如何快速应用是我们做技术的,都想要的。废话不多说了。因为主要集中在怎么应用所以有些细节可能不是正确的,
这个需要大家去质疑,去验证。
一、LWIP的应用
1.什么是LWIP?
lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。
2.哪里可以下载源码?
在这里可以下载到最新的应用:http://savannah.nongnu.org/projects/lwip/
3.更多详细介绍?
在这里有详细的:http://lwip.wikia.com/wiki/LwIP_Wiki
4.如何移植?
LWIP 有三种应用模式 RAW API,Netconn API,Socket API.这里我们主要简单讲解如何移植RAW API。移植LWIP的过程也是一个了解LWIP大概结构的过程。
当你把所有的错误,和警告干掉的后就差不多了,呵呵。
①首先到官网上下载好源码和应用例程。
<ignore_js_op>
lwip-1.4.1中src文件夹下的源码文件结构:
<ignore_js_op>
②按以下这个目录结构将源码加入到工程
<ignore_js_op>
前面三个就不用解释了,看看上面的源码文档结构就知道了,LWIP_ARCH文件夹是什么东东呢?它是一个操作系统与处理器平台配置有关的代码,你要问我这个东西哪里来的,
嘿嘿,从ST的官方固件库中偷来滴。里面包含了大小端的配置,类型定义,和操作系统有关的部分,不过这里没有用到操作系统,所以这个sys_arch.c文件需要改装下。
LWIP_APP顾名思义就是LWIP的应用程序了,这里面编写了,TCP服务器,TCP客户端,UDP服务器,UDP客户端,Webserver(应用程序和服务器的接口技术(CGI),动态网页技术(SSI),和ajax技术,做异步提交,获取数据)。的方法和例程。接下来请看我如何修改移植。
③底层驱动的移植。
在LWIP-NETIF文件加下,我们需要对ethernetif.c文件修改。该文件是一个底层网络接口框架。LWIP的作者已经为我们搭好了框架,其中有些代码是伪代码,我们只需要去实现就好了。
A.修改底层硬件初始化函数low_level_init(struct netif *netif)函数,在函数中设置好,网络的MAC地址,最大传输单元,然后再初始化ENC28J60,如果初始化失败则返回错误给上层调用的函数。
<ignore_js_op>
B.修改底层发送包的函数low_level_output(struct netif *netif, struct pbuf *p),在这个函数中将LWIP数据包中的缓冲区pbuf 复制到待发送的缓冲区lwip_buf中来,
然后利用ENC28J60的发包函数发出去。
<ignore_js_op>
C.修改底层接收包的函数low_level_input(struct netif *netif),这个过程就是把接收缓冲区lwip_buf中的数据复制到LWIP的pbuf中,如果收到了包, 我们就可以在lwip_buf中读取数据了。注:lwip_buf作为接收和发送数据的缓冲。
<ignore_js_op>
移植完这三个函数就差不多啦,简单吧,嘿嘿。
④在主函数main.c初始化LWIP。
lwip_init()是用来LWIP初始化的,但是其中的netif_init()初始化的是回环网络接口,我们想把数据发出去必须初始化ENC28J60。所以我们先调用lwip_init()来初始化LWIP的各个模块。
再利用netif_add函数添加网络接口就可以。这个函数会调用底层的 low_level_init函数,如果返回值为空,则说明ENC28J60初始化失败了。然后再注册,建立一下这个网络接口就OK了。
<ignore_js_op>
注意到上面的有一个函数 init_lwip_timer(); 这个是什么呢,这个是用来初始化LWIP的定时器,用来计时用的,相当于LWIP的心脏。
⑤在主函数main.c中编写轮训协议栈函数
LWIP需要周期性的处理一些函数,这些函数是是根据你使能的协议和功能模块来调用的。比如你要用到TCP协议,你就必须周期性的调用tcp_tmr()。
注意到有个timer_expired函数,这个函数就在sys_arch.c文件中,这个文件本来与操作系统有关,现在改装了。用来初始化LWIP的时钟,提供超时检测的功能,相当于定时器了。
<ignore_js_op>
⑥配置LWIP
LWIP有一个标准配置文件在opt.h中,这个头文件又包含了lwipopts.h,通常我们配置LWIP是通过这个文件来配置的。
这个头文件可以覆盖opt.h中任何你需要的配置。这样做的好处,是源码更加健壮了,而且能够防止我们错误的配置,而改不回去了。
有几个配置是很重要的,NO_SYS 1-----无操作系统 MEM_ALIGNMENT 4 --- 分配内存是四字节对齐,这个很重要,曾经莫名其妙的出现hardfault
TCP_MSS 1460 --TCP最大段大小,这个是极限值了,我们可以传更多的数据。
<ignore_js_op>
⑦在main函数中加入LWIP_Polling(),基本上就移植完毕了。这时可以使用ping 命令。
比如我设置的IP地址为19.168.1.10则,通过cmd命令进入dos环境。通过 ping 192.168.1.10 -t 就可以不断查询网络是否联通了。
| 5.如何应用? RAW API中文译为原始API可以说比较接近底层了,玩过socket编程的人都知道,socket编程用起来,是比较简单了,不像RAW API的模式,用起来比较麻烦,需要应用者对TCP,UDP这些协议,有一个 稍微深入的了解。这里我推荐一款抓包软件Wireshark。这个软件可以帮助你分析这些协议是怎么工作的。不过在用这个软件的,分析协议的时候最好不要连接到外网,会干扰的哦。 ①TCP服务器和客户端 B.TCP服务器模式 tcp_accept(tcp_server_pcb,tcp_server_accept); //指定监听状态的连接联通之后将要调用的回调函数 C.TCP客户端模式 ②UDP的服务器和客户端 A.什么是CGI? B.CGI函数介绍 1.注册URL路径和对应的函数 2.设置请求的URL的路径和CGI函数 3.编写CGI函数 } D.什么是SSI? E.SSI函数简介 F.SSI应用举例 2.编写SSI处理函数 3.再编写一个返回URL为/index.shtml的文件的CGI函数就可以了。在页面中就可以看到alientek内容了。 最后重点介绍下ajax做异步提交,更新数据: 二,添加/response.ssi文件 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-
建立连接 .jpg (65.03 KB, 下载次数: 1761)
<ignore_js_op>
-
发送数据包.jpg (21.27 KB, 下载次数: 1298)
<ignore_js_op>
-
服务器关闭连接.jpg (31.6 KB, 下载次数: 1103)
<ignore_js_op>

-
20.68 KB, 下载次数: 4854
<ignore_js_op>

-
53.25 KB, 下载次数: 4647
<ignore_js_op>

-
494.66 KB, 下载次数: 7081
<ignore_js_op>

-
转载自:http://www.openedv.com/forum.php?mod=viewthread&tid=25178&extra=&page=1
ALIENTEK 战舰ENC28J60 LWIP和UIP补充例程(LWIP WEB有惊喜)的更多相关文章
- 学习随笔:Django 补充及常见Web攻击 和 ueditor
判断用户是否登录 <!-- xxx.html --> {% if request.user.is_authenticated %} django中的request对象详解 填错表格返回上次 ...
- 开始逐步补充下相关Web知识,很多年没搞了....
<script type="text/javascript"> $(function(){ ShowProduct(); $("#ShowUserInfo&q ...
- 移植LWIP(ENC28J60)
上图就是整个移植的基本思路,非常清晰的三个层次.其实想想,本质上就是收发数据,只是LWIP协议通过对数据的封装可以实现网络传输.从图中我们就可以看到这里首先需要ENC28J60的驱动,这个驱动需 ...
- ETH—Lwip以太网通信
第39章 ETH—Lwip以太网通信 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/ ...
- 第39章 ETH—Lwip以太网通信
第39章 ETH—Lwip以太网通信 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/ ...
- ENC28J60学习笔记——第1部分
1前言 嵌入式以太网开发,可以分为两个部分,一个是以太网收发芯片的使用,一个是嵌入式以太网协议栈的实现.以太网收发芯片的使用要比串口收发芯片的使用复杂的多,市面上流通比较广泛的以太网收发芯片种类还不少 ...
- 第39章 ETH—Lwip以太网通信—零死角玩转STM32-F429系列
第39章 ETH—Lwip以太网通信 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/ ...
- LWIP互联网资料汇总
本文主要搜集了下互联网上关于LWIP的资料和教程 欢迎补充 第一部分:移植 LWIP在UCOS上移植 LWIP 在STM32上移植 http://www.docin.com/p-459242028 ...
- 基于 LWIP 建立 TCP Server 与主机通信实验
LWIP 版本:2.0.3 上一篇文章是写如何将 LWIP 移植到板子上,今天晚上记录基于 LWIP 实现与主机的网络通信. 先是打开了原子的实验例程,大概浏览了一遍,觉得 TCP 网络网络通信也就是 ...
随机推荐
- Vue常见问题集中
a.VScode保持vue语法高亮的方式: 1.安装插件:vetur.打开VScode,Ctrl + P 然后输入 ext install vetur 然后回车点安装即可. 2.在 VSCode中使用 ...
- Less学习(1)
写在开头的话: 月余前被问起会不会Less,当时就有想学这个css框架的念头,而在昨天,在前端乱炖上看到一篇LessCss的开篇介绍,忽然就有了一股立马去学的冲动,回到家后找了几篇文章看了下,初感觉比 ...
- 小菜鸟之HTML第一课
web项目 前端网页web(人体结构) HTML负责前端网页结构 Css负责网页样式 css引入 内联样式引入 内部样式 外部样式 三种基本引入器 id选择器 类选择器 标签选择器 <!DOCT ...
- 函数try{}
语法 函数try块是一种函数体的替代语法形式,是函数定义的一部分 try构造函数初始化器 复合语句 处理块序列 (1)构造函数初始化器 - 成员初始化器列表,只在构造函数允许 (2)复合语句 - 花括 ...
- VC++ 窗口透明化及透明窗口上绘画、截图、轨迹
源文件:https://files.cnblogs.com/files/MrFengD/Temp.rar
- DRF 序列化组件 序列化的两种方式 反序列化 反序列化的校验
序列化组件 django自带的有序列化组件不过不可控不建议使用(了解) from django.core import serializers class Books(APIView): def ge ...
- 解决radiobutton在gridview中无法单选的一种方法
最近在项目中有个单选gridview中某一项的需求,使用radiobutton后发现,虽然最终选择出来的是一项,但是在页面上却可以选择多项,经过查看生成的html代码,发现生成的radio的name属 ...
- jq之display:none与visible:hidden
http://www.cnblogs.com/linxiong945/p/4075146.html 今天学习到jquery的hide()部分时,突然有一个想法,jquery中的隐藏/显示部分的实现是给 ...
- 进阶Java编程(10)反射与简单Java类
1,传统属性自动赋值弊端 简单Java类主要由属性构成,并且提供有setter与getter类,同时简单Java类最大的特征就是通过对象保存相应的类属性的内容.但是如果使用传统的简单Java类开发,那 ...
- VPS磁盘划分建立新磁盘
今天我们来教下大家拿到VPS后,如何划分电脑内的磁盘空间.很多朋友可能遇到拿到VPS,为什么会打开电脑后在电脑盘那看到就一个C盘.还有些用户以为怎么只有那小的磁盘空间啊!怎么和卖的不一样啊!其实了我们 ...