uip移植笔记
Ui框架学习笔记
2.UI 消息机制....................................................................................................................................2 3.Chrome 控件树...............................................................................................................................3 4.Chrome 消息分发机制...................................................................................................................4 5.基本控件.........................................................................................................................................5
15条移动端实战UI-UE注意点
15条移动端实战UI-UE注意点在做手机产品设计的过程中,遇到很多看似很小,且很容易被忽略的问题,正是这些小问题,一次次的撩拨用户的耐心,让用户对你的产品心生怨念。
刚出道的朋友没有经过实战,对细节注意不多,往往都会遇到类似的问题,强调多次后,觉得不如写下来,给新人共勉。
苹果有他们自己的字体,一般iOS用苹果黑1、移动端产品原型设计中的像素规格顶栏一般是20px,如果是iPhone4、iPhone5的话,因为屏幕分辨率的原因,数值要翻倍,是44px。
按钮的最小值是44*44px,同样的,在iPhone4以上的设备里面要翻倍。
在android 里面也是差不多的,一般要求是44*44以上,不过iOS要求会严格一些。
具体的细节可以下载一个官方的iOS和android的UI设计规范。
2:、dp、dip、dpi、sp 等到底有什么联系区别?产生的根源和设计时的影响如何?是否屏幕密度的决定原因?UI设计师的角度理解:px(像素)是我们UI设计师在PS里使用的(不解释),同时也是手机屏幕上所显示的(也不解释)dp是开发写layout的时候使用的尺寸单位,sp是开发写layout时关于字体的字号单位,且dp与sp 总为1:1关系。
Android支持四种不同的dpi模式:ldpi mdpi hdpi xhdpi一般地,手机分辨率与所运行的dpi模式是匹配的,例如hvga(320x480像素)的手机屏幕一般在3.5英寸左右,运行在mdpi模式下(也有例外,稍后解释)(这个是ROM控制的,app 不能改变)。
当运行在mdpi下时,1dp=1px:也就是说设计师在PS里定义一个item高48px,开发就会定义该item高48dp;Photoshop中14px 大的字体,开发会定义为14sp。
对于一部wvga(480x800)手机(G7、N1、NS),一般是运行在hdpi模式下。
当运行在hdpi 模式下时,1dp=1.5px:也就是说设计师在PS里定义一个item高72px,开发就会定义该item 高48dp;Photoshop中21px大的字体,开发会定义为14sp。
uip 协议栈代码
uip 协议栈代码UIP协议栈是一种用于嵌入式系统的TCP/IP协议栈,它的设计旨在提供高效、灵活和易于移植的网络通信解决方案。
本文将介绍UIP 协议栈的基本原理、主要特点以及应用领域。
UIP协议栈的基本原理是将TCP/IP协议分成多个层次,每个层次负责不同的功能。
这些层次包括网络接口层、网络层、传输层和应用层。
网络接口层负责处理硬件接口和数据包的发送与接收,网络层负责处理IP地址和路由,传输层负责提供可靠的数据传输服务,应用层负责提供各种网络应用服务。
UIP协议栈的主要特点之一是它的代码量非常小。
由于嵌入式系统通常具有有限的资源,如处理器速度和存储容量,因此UIP协议栈的设计目标是尽量减小占用的资源。
为了实现这一目标,UIP协议栈使用了一些优化技术,如数据压缩和代码精简等。
这使得UIP协议栈非常适合于低功耗设备和资源受限的系统。
另一个重要特点是UIP协议栈的可移植性。
由于UIP协议栈是使用C语言编写的,它可以在多种嵌入式系统平台上运行。
UIP协议栈提供了一些通用的接口和配置选项,以便用户可以根据自己的需求进行定制。
这使得UIP协议栈可以广泛应用于各种嵌入式系统,如传感器网络、工业控制系统和物联网设备等。
UIP协议栈还具有良好的性能和可靠性。
它使用了一些高效的算法和机制,如快速重传和拥塞控制等,以提高数据传输的速度和可靠性。
同时,UIP协议栈还支持一些高级功能,如安全性、多播和多路径传输等,以满足不同应用的需求。
UIP协议栈广泛应用于各种嵌入式系统领域。
在传感器网络中,UIP 协议栈可以实现传感器节点之间的通信,用于数据采集和监控。
在工业控制系统中,UIP协议栈可以实现远程监控和控制,用于实时数据传输和设备管理。
在物联网设备中,UIP协议栈可以实现设备间的互联互通,用于智能家居和智能城市等应用。
UIP协议栈是一种高效、灵活和易于移植的TCP/IP协议栈,适用于各种嵌入式系统。
它具有小代码量、可移植性、良好的性能和可靠性等特点,广泛应用于传感器网络、工业控制系统和物联网设备等领域。
UCOS-II移植ARM的读书笔记
UCOS-II移植ARM的读书笔记导读:昨天晚上边看移植代码边记下来的笔记不知道怎么回事在保存的时候竟然不见了,关键是我是第一次也是正式开始移植的学习之路啊,今天在工作之前先把昨天的笔记重新回顾一下,UCOS-II的移植需要提供2,真是很郁闷,昨天晚上边看移植代码边记下来的笔记不知道怎么回事在保存的时候竟然不见了。
5555。
一个晚上工作的结果啊,关键是我是第一次也是正式开始移植的学习之路啊。
真是够倒霉的。
今天在工作真是很郁闷,昨天晚上边看移植代码边记下来的笔记不知道怎么回事在保存的时候竟然不见了。
5555。
一个晚上工作的结果啊,关键是我是第一次也是正式开始移植的学习之路啊。
真是够倒霉的。
今天在工作之前先把昨天的笔记重新回顾一下,其实后来想想也许是件好事,可以让我今天在不借助其他的帮助的情况下自己看代码自己跟自己讲一遍,其实很多看起来是倒霉看起来是灰心的事情把我们的观点换一下那么就是一件好事。
这样的情况发生在我的身上已经挺多次了。
好啦,废话不说,开始补昨天的日记UCOS-II的移植需要提供2,3个文件分别介绍如下:一:OS_CPU.H1 与编译器有关的数据类型只是按照不同的编译器编写对应的数据类型的typedef对应于ARM7的数据类型的编写如下typedef unsigned char BOOLEAN; /* 布尔变量*/typedef unsigned char INT8U; /* 无符号8位整型变量*/typedef signed char INT8S; /* 有符号8位整型变量*/typedef unsigned short INT16U; /* 无符号16位整型变量*/typedef signed short INT16S; /* 有符号16位整型变量*/typedef unsigned int INT32U; /* 无符号32位整型变量*/typedef signed int INT32S; /* 有符号32位整型变量*/typedef float FP32; /* 单精度浮点数(32位长度)*/typedef double FP64; /* 双精度浮点数(64位长度)*/在上面定义的各种数据类型中按照ARM7的堆栈宽度选择INT32Utypedef INT32U OS_STK; /* 堆栈是32位宽度*/接下来一部分是为了兼容低版本UCOS的数据类型所编写的代码,在UCOS-II中暂不考虑2 与处理器相关的代码先定义中断的实现方式,预先设定的中断方式有三种,在ARM7中设置为方式2 #define OS_CRITICAL_METHOD 2 /* 选择开、关中断的方式*/接下来的一段是我暂时还没有完全搞懂的一部分,只知道是设定了12个软件中断的函数,当调用这些函数之前都会执行对应中断号的事情。
Android UI学习笔记
Android中的像素:(sp作为文字大小的单位,dp(dip)作为其他元素的单位)dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。
px: pixels(像素). 不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多。
pt: point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用;sp: scaled pixels(放大像素). 主要用于字体显示best for textsize。
由此,根据google的建议,TextView的字号最好使用sp做单位,而且查看TextView的源码可知Android 默认使用sp作为字号单位。
在Android 中,1pt 大概等于2.22sp以上供参考,如果UI 能够以sp为单位提供设计是最好的,如果设计中没有sp的概念,则开发人员也可以通过适当的换算取近似值。
过去,程序员通常以像素为单位设计计算机用户界面。
例如,定义一个宽度为300像素的表单字段,列之间的间距为5个像素,图标大小为16×16像素等。
这样处理的问题在于,如果在一个每英寸点数(dpi)更高的新显示器上运行该程序,则用户界面会显得很小。
在有些情况下,用户界面可能会小到难以看清内容。
与分辨率无关的度量单位可以解决这一问题。
Android支持下列所有单位。
px(像素):屏幕上的点。
in(英寸):长度单位。
mm(毫米):长度单位。
pt(磅):1/72英寸。
dp(与密度无关的像素):一种基于屏幕密度的抽象单位。
在每英寸160点的显示器上,1dp = 1px。
dip:与dp相同,多用于android/ophone示例中。
sp(与刻度无关的像素):与dp类似,但是可以根据用户的字体大小首选项进行缩放。
为了使用户界面能够在现在和将来的显示器类型上正常显示,建议大家始终使用sp作为文字大小的单位,将dip作为其他元素的单位。
移动应用开发课程笔记
移动应用开发课程笔记一、课程简介移动应用开发是当前非常热门的技术领域,涵盖了iOS、Android、小程序等多种平台。
本课程将介绍移动应用开发的基本概念、技术原理和开发流程,并通过实践项目来提升学员的实际操作能力。
二、课程内容移动应用开发概述移动应用市场的现状与趋势移动应用开发的技术架构与流程iOS开发基础Xcode开发环境配置Swift编程语言基础UI设计基础与控件使用数据存储与网络通信Android开发基础Android Studio开发环境配置Java编程语言基础UI设计基础与控件使用数据存储与网络通信小程序开发基础小程序开发环境配置WXML、WXSS与JavaScript基础UI组件库与API使用跨平台开发框架React Native框架介绍与环境搭建Flutter框架介绍与环境搭建实战项目开发简单的音乐播放器项目(iOS/Android)小程序电商应用项目(微信小程序)三、课程重点与难点Swift/Java编程语言基础:Swift/Java的语法规则、数据类型、控制流等基础知识是学习移动应用开发的基础,需要学员熟练掌握。
UI设计与控件使用:iOS/Android平台都有丰富的UI控件和布局方式,需要学员根据实际需求选择合适的控件和布局方式。
数据存储与网络通信:如何合理地存储数据和进行网络通信是移动应用开发中非常重要的部分,需要学员掌握基本的数据库操作和网络通信协议。
跨平台开发框架:React Native和Flutter等跨平台开发框架可以提高开发效率,但需要学员掌握原生开发和框架开发的区别和联系。
四、实验与实践项目安排实验1:熟悉Xcode/Android Studio开发环境,完成一个简单的Hello World程序。
实验2:使用Swift/Java编写一个简单的计算器应用。
实验3:使用SQLite数据库实现数据的增删改查操作。
实验4:使用网络通信协议实现数据的上传和下载。
实验5:使用React Native/Flutter框架实现一个简单的新闻阅读应用。
uIP地址解析协议ARP分析
地址解析协议 ARPuIP是什么?uIP是一款TCP/IP协议套件,该套件为使用者的网络会话提供网络协议栈支持。
我曾尝试将uIP提供的TCP/IP协议栈移植到单片机中,当然在只有单片机而没有网卡(MAC+PHY)的情况下,这项工作是不能完成的。
在做这项工作之前,我也在网络上搜索整理了很多资料,用以充实自己的知识体系。
单方面看,TCP/IP 协议栈是一组纵向生长的协议集合;多方面看,TCP/IP协议栈是实现双方正确,有效交互的一种机制,它实现了等层协议实体之间的透明传输。
而uIP是一款轻型TCP/IP协议栈,设计目标是为无法运行开源或者付费系统的广大接入终端提供一种网络接入交互机制。
鉴于国内几乎没有开发协议栈的工作,而国外一款比较好的协议栈大概在数十万美金,对于国内的很多软件开发,设备生产的公司来说,无疑是有点奢侈,因为我们的设备不需要对网络协议的完全支持。
对接入设备而言,“通道”和对“通道上的流”的规则,是他们的关注重点。
但是,就是这么简单的需求,对网络协议的最小化支持的软件,国内几乎无有。
以单片机为例,一个简单的网络模块就是给单片机外接资源增加一个网络控制器—一般是dm9000X或者marvell等厂家的以太网控制器,通过编程实现网卡驱动后(一般u-boot源码中都提供了这些厂家芯片的裸编程序),封装一个初始化、一个接收和发送接口,就可以同uIP整合,完成运行在单片机上的网络协议处理模块了。
UIP对基本的网络协议支持的比较好,当然一个人不是一个团队,开发协议栈还是相当有挑战性的。
我想将自己调试过程中遇到的问题,以及对uIP为什么这样做的理解,沿着我的思路做一个解说。
笔墨浅显,仅供自己和需要的人参考。
做这一系列的分析,前提需要一个主题框架。
但是一时又想不起来该怎么系统的完成这些任务,所以编边写边看,边看边修改。
二层请求协议:地址解析协议-ARP。
ARP/RARP作为一个二层协议,提供在局域网内请求对端MAC(ARP)地址或者逆向请求对端IP(RARP)地址的协议。
一步一步教你移植uIP
一步一步教你移植uIP0.9到8051+RTL8019AS追风发表于2010-11-11 22:21|只看该作者|倒序浏览|打印1. google一下uip,点击进入主页http://www.sics.se/~adam/uip/index.php/Main_Page当前最新的uIP版本是 1.0,这个版本比较复杂,所以还是移植历史版本吧.打开http://www.sics.se/~adam/old-uip/下载0.9版:http://www.sics.se/~adam/download/?f=uip-0.9.tar.gz2. 打开Keil新建项目uIP0.9.uv2, 设置项目属性.2 L( E/ A* h( C# e0 @6 mmemory_model 设置为large 模式,这样默认的存储方式是xdata6 |0 v5 H. { m0 Q5 V+ s: O因为uIP0.9编译后占用20K rom, 所以必须选一个32K(>20K)的rom的单片机,+ u* m8 p& T/ Z( o: f 比如Device可设置为SST89x58或者SST89x516xx,解压缩官方下载的uIP0.9压缩包,添加文件至项目, ) |4 M1 V0 C5 a' w; b! F3 ?- @, v' N% j5 u需添加至项目的文件有:uip\uip.c, uip.c\uip.h, uip.c\uip_arch.h,) y! x2 Q: E. A- a% p! l5 `uip.c\uip_arp.c,uip.c\uip_arp.h, I; I- G7 d: t0 ]& A8 dunix\main.c, unix\uip_arch.c, unix\uipopt.h,4 `: P* G, w$ m; S/ D, j* yapps\httpd\所有文件# j! B+ \7 |1 q1 c$ \5 ?3. 因为data是系统关键字, 所以标识符data => dat6 ~' C6 J& |4 ]4 M; Y2 i) }以下文件需要改动: fs.h, fsdata.h,httpd.c4. 为RTL8019AS 编写驱动程序(具体如何操作寄存器老古的网站有详细的教程),2 r- F3 k5 S, d- U. V e# M内容在压缩包中的RTL8019AS.c, RTL8019AS.h需要更改main.h中的如下地方:include "tapdev.h" => #include "rtl8019as.h"7 `- j$ i: d Y8 {: A/ ~tapdev_init() -> rtl8019as_init()0 Q4 p9 l$ a2 H8 X wtapdev_send() -> rtl8019as_send()5 F( X8 f1 {* b% Ntapdev_read() -> rtl8019as_read()5. fsdata.c 首行添加#include "fsdata.h"关键字替换: 6 h# K, [! S7 \* w5 h/ K$ L! C& u# o. Fstatic const char -> const char codeconst struct fsdata_file -> const struct fsdata_file code7 w4 \: h* c$ Q6 I( C4 Y* {fsdata.h 文件末尾添加:) M8 x6 I' d- X2 ^" T; W#define FS_ROOT file_tcp_header_html' [4 m1 V' B$ w' g6 x; b+ o5 G: @2 s) w+ l#define FS_NUMFILES 14) v4 l D5 l9 L* h6 R. f( A2 V* {9 {/ m5 l5 U3 @& \- a% x2 Y$ V; Uconst char code data_cgi_files[];const char code data_cgi_stats[];7 D/ M. D7 d' a0 H' cconst char code data_cgi_tcp[];const char code data_img_bg_png[];# D# ^: f. P1 _5 [( x+ w* L0 N/ M, V. o/ e" O/ O- hconst char code data_about_html[];' ^8 x& b6 w2 V+ t7 D( D% W7 O5 d ; q* z x0 e9 |$ F! ~const char code data_control_html[];const char code data_404_html[];( s/ w; A2 G. s+ V' s( k0 j2 F8 a3 T; Z: Iconst char code data_files_footer_plain[];2 f& i/ S& S4 p5 G# c const char code data_files_header_html[];const char code data_index_html[];. }$ `' ~7 `( H# u: `const char code data_stats_footer_plain[];const char code data_stats_header_html[];const char code data_tcp_footer_plain[];" b' d& w' p% M. k/ M( @const char code data_tcp_header_html[];4 I/ i7 U0 w4 P! M: J* B' R6 G- x) |: W/ j" Zconst struct fsdata_file code file_cgi_files[];$ r U8 D- [3 m! W$ A- E: S7 S4 _0 mconst struct fsdata_file code file_cgi_stats[];+ ?7 f/ f1 C# l1 F1 p; m/ h* H) m4 nconst struct fsdata_file code file_cgi_tcp[];0 _, E3 b8 W4 w- p- v: G$ W) H) R: Z% i: Vconst struct fsdata_file code file_img_bg_png[];+ |# o* \7 L+ q# |$ {( P7 a+ J$ s/ d2 \+ E2 T' Uconst struct fsdata_file code file_about_html[];9 u- E( D# F0 h, X# w) k! p' Z o, M/ A |const struct fsdata_file code file_control_html[];const struct fsdata_file code file_404_html[];, R& N' V3 p5 E" Y5 m3 M7 `% I% z8 b9 y6 t8 }/ Dconst struct fsdata_file code file_files_footer_plain[];4 b' y b. {4 L5 Gconst struct fsdata_file code file_files_header_html[];3 V: |4 V- r5 G' q; j8 ~' f/ F' J5 W m+ W' W2 l) ^! Y* {& _3 B/ q* tconst struct fsdata_file code file_index_html[];/ D2 b2 T4 Y2 s iconst struct fsdata_file code file_stats_footer_plain[];+ g9 `0 r8 t# E$ Z' }! ?1 y! A. @6 X Lconst struct fsdata_file code file_stats_header_html[];3 ?& p; i8 L' `4 z0 v) b' I5 r' K' z' Econst struct fsdata_file code file_tcp_footer_plain[];0 ~5 L+ B8 E3 [6 U0 Hconst struct fsdata_file code file_tcp_header_html[];6. fs.c 第55行删除: #include "fsdata.c"3 Y; ^) r3 f- _, D6 ~0 j" j7. uipopt.h1 l+ G, {, _) G( i. n181行: #define UIP_FIXEDETHADDR 0 -> 17 ^1 ?# f8 v( N2 R7 ?/ _) J; w( x' V5 o6 L& E299行: #define UIP_ACTIVE_OPEN 1 ->0& P4 i. h W% i' l- J0 X2 j+ a4 D& C, K+ D5 k$ I497行: #define BYTE_ORDER LITTLE_ENDIAN -> BIG_ENDIAN280行: #define UIP_UDP_APPCALL udp_appcall -> httpd_appcall# K) k4 b# |! @- [ `' @ q9 b+ Y: \" \文件末尾添加:5 c. W9 b4 L8 P! X+ ?, R+ z- q, {#ifndef NULL3 C4 u( ]5 x- P#define NULL (void *)0' W+ A& A( H& r# D {, _+ Z7 {) ]4 X$ Q- X( U6 G#endif /* NULL */! A4 l% ?" z& d% c+ d0 z8. httpd.c删除以下内容:+ g1 H% O2 t3 T. G- |8 o/ [extern const struct fsdata_file file_index_html;extern const struct fsdata_file file_404_html;7 q' H1 e$ X8 I" g4 {+ z7 u220行更改:G4 I; Q+ B5 L' ]/ S3 M& D' M1 G5 bfs_open(file_index_, &fsfile); => file_index_html->name. }/ u% h2 f8 z5 Y) I! J$ L% B224行同上更改9. 上电,开发板的webserver就启动了.具体的IP和掩码在uipopt.h 文件里面设置.。
uip在单片机上的移植精讲
第一章基于单片机的网络编程概述随着网络技术的迅猛发展,Internet已经走进千家万户,越来越多的人拥有了随时随地上网的条件,享受着网络带来的方便快捷的生活。
同时,随着嵌入式控制技术的成熟,网络也逐步与之结合,深入到工业、楼宇、家居智能化等领域,实现远程数据采集、远程控制等功能。
网络化已经成为新一代嵌入式系统发展的一个重要趋势。
试想不久的将来,坐在办公室的电脑前就能查看和控制家里的门窗和灯的状态,甚至可以在下班时把家里配好汤料的电饭煲打开,到家就能闻到扑鼻而来的香味了。
盛行全球的Internet网络是基于TCP/IP协议族为基础组建的,TCP/IP是网络通讯系统互联的事实标准。
研究嵌入式系统的网络化,就要先从TCP/IP的概念入手。
1.1 TCP/IP的概念及分层结构TCP/IP协议是传输控制协议的简称,它实际上是一个协议族,包括许多相关协议。
其中最核心的协议是IP(网际协议)和TCP(传输控制协议),其它还包括ARP(地址解析协议)、RARP(逆地址解析协议)、ICMP(Internet控制报文协议)、UDP(用户数据报协议)、IGMP(Internet组管理协议)、DNS(域名系统)、TFTP(简单文件传送协议)、BOOTP(引导程序协议)、SNMP(简单网络管理协议)、Telnet(远程控制协议)、FTP(文件传送协议)、SMTP(简单邮件传送协议)等重要协议。
并且,随着网络技术的发展,还会不断有新的协议加入到TCP/IP协议族。
这些协议规范了不同的场景下的网络互连,实际应用中可以根据系统的需要使用其中的一些协议。
从TCP/IP协议的数量就可以看出,Internet网络是一个比较复杂的系统,能适配多种应用场景,根据使用协议的不同而实现不同的功能。
为了降低网络设计的复杂性,设计者将以分层的方式组织TCP/IP协议,每一层可能包括不同通信服务的多种协议。
从最底层的硬件开始,每一层都建立在其下一层的基础上,并负责向其上一层提供服务。
uC/OSⅡ下协议栈uIP的移植与应用
.
( . o eeo o ue, n n nvri f ot a dT l o 1 C l g f mp t Naj gU i s yo s n ee mmu i t n , n n 10 3 C ia l C r i e t P s c nc i sNaj g2 0 0 , hn ; ao i
Absr c : r s n , t h a i e eo me t o e I t r e e h o o y, a e y o o s h l p l n e , r m i o d t n n o t a t Atp e e t wi t e r p d d v l p h n ft n e n ttc n l g a v r t fh u e o d a p i c s fo h i a ar c n i o i g t i
po e l o ar mo e a am y tm , a ie e r mo e aa m . p rme t l e u t h w a h i k b t e ma t e ie d I t r e t r d u P t e t l r s se r l d t e z h e t lr Ex e i n a s l s o t t e l e we n s r vc sa n en t r s h t n d n c mmu ia i n ss c e s u l sa l h d t c i v e i t r o n ci n o e o n c t si u c s f l e t bi e o a h e e t n e c n e t ft m. o y s h o h
t e r fi e ao , r d c d t e n e so c e st e I tr e . n r s o s o t i e u s , u i h iht h erg r t r p o u e e d fa c s o t n e n t I e p n e t h sr q e t p t l twe g h h a g TCP I r t c lsa k u P p r / P p o o o t c l o -
Uip+Stm32移植问题总结-ChangingsBlog
Uip+Stm32移植问题总结-ChangingsBlog#include "clock-arch.h"#include "stm32f10x.h"extern __IO int32_t g_RunTime;/*---------------------------------------------------------------------------*/clock_time_tclock_time(void){return g_RunTime;}/*---------------------------------------------------------------------------*/使用stm32 滴答定时器中断代码:User/stm32f10x_it.c__IO int32_t g_RunTime = 0;void SysTick_Handler(void){static uint8_t s_count = 0;if (++s_count >= 10){s_count = 0;g_RunTime++; /* 全局运行时间每10ms增1 */if (g_RunTime == 0x80000000){g_RunTime = 0;}}}3.uipopt.h/uip-conf.h 是配置文件,用来设置本地的IP 地址、网关地址、MAC 地址、全局缓冲区的大小、支持的最大连接数、侦听数、ARP 表大小等。
可以根据需要配置。
#define UIP_FIXEDADDR 1决定uIP是否使用一个固定的IP地址。
如果uIP使用一个固定的IP地址,应该置位(set)这些uipopt.h 中的选项。
如果不的话,则应该使用宏uip_sethostaddr(),uip_setdraddr() 和 uip_setnetmask()。
#define UIP_PINGADDRCONF 0 Ping IP地址赋值。
UIP中文文档第七uIP编译时配置选项
UIP中文文档第七-uIP编译时配置选项————————————————————————————————作者:————————————————————————————————日期:相关文件:uip-conf.h uip配置文件.uipopt.h uip配置选项针对于工程的配置选项:uip有大量的配置选项,它们都可以根据工程需要重载.它们被保存在一个工程相关的uip-conf.h文件中,所有配置的名称都有UIP_CONF前辍.1.#define UIP_CONF_MAX_CONNECTIONS 最大的TCP连接数.2.3.#define UIP_CONF_MAX_LISTENPORTS 最大监听的TCP端口数.4.#define UIP_CONF_BUFFER_SIZE uip 缓冲区大小.5.#define UIP_CONF_BYTE_ORDER CPU字节顺序.6.#define UIP_CONF_LOGGING 是否开启日志7.#define UIP_CONF_UDP 是否启用UDP功能8.#define UIP_CONF_UDP_CHECKSUMS 是否启用UDC校验和.9.#define UIP_CONF_STATISTICS UIP配置统计是否开启.10.typedef uint8_t u8_t 8位的数据类型.11.typedef uint16_t u16_t 16位的数据类型.12.typedef unsigned short uip_stats_t 统计数据类型.复制代码静态配置选项:这些选项可以用来静态配置IP地址,条件是UIP_FIXEDADDR必须设为1. 指定节点的配置选项包括IP地址,子网掩码,默认路由及以太网址.而后三项只有在以太网中时才可用.1.#define UIP_FIXEDADDR 决定uIP使用固定IP与否.2.#define UIP_PINGADDRCONF 设置ping地址.3.#define UIP_FIXEDETHADDR ARP模块的编译是否用固定的MAC地址.复制代码IP配置选项:1.#define UIP_TTL 64 定义UIP包的生存时间.TTL.2.#define UIP_REASSEMBLY 打开IP包重新组装功能.3.#define UIP_REASS_MAXAGE 40 IP片断扔掉之前在重组装缓冲区等待的时间.复制代码UDP配置选项:1.#define UIP_UDP UDP支持是否编译2.#define UIP_UDP_CHECKSUMS. 是否使用UDP校验和.3.#define UIP_UDP_CONNS 最大并发UDP连接数.4.复制代码TCP配置选项:1.#define UIP_ACTIVE_OPEN 决定UIP的打开连接支持是否编译.2.#define UIP_CONNS 最大同时打开的TCP连接数.3.#define UIP_LISTENPORTS 最大TCP监听端口数.4.#define UIP_URGDATA 是否编译TCP紧迫数据提醒.5.#define UIP_RTO 3 初始重传超时计数,以定时器脉冲个数计.6.#define UIP_MAXRTX 8 一段数据最大重传多少次才取消连接.7.#define UIP_MAXSYNRTX 5 一段SYN数据要最大得传多少次,才认定连接请求失败.8.#define UIP_TCP_MSS (UIP_BUFSIZE - UIP_LLH_LEN - UIP_TCPIP_HLEN) TCP最大段大小9.#define UIP_RECEIVE_WINDOW 广播接收器的最大窗口大小.10.#define UIP_TIME_WAIT_TIMEOUT 120 一个连接处于TIME_WAIT状态的最大时间.复制代码ARP配置选项:1.#define UIP_ARPTAB_SIZE ARP表大小.2.#define UIP_ARP_MAXAGE 120 ARP表的最大存活年龄,单位为10s.复制代码通用配置选项:1.#define UIP_BUFSIZE UIP包缓冲区大小.2.#define UIP_STATISTICS 是否编译统计功能.3.#define UIP_LOGGING 某些事件的日志功能是否编译.4.#define UIP_BROADCAST 广播功能是否支持.5.#define UIP_LLH_LEN 链路层头长度.6.void uip_log (char *msg) 打印UIP日志信息.复制代码CPU架构配置:这里指定的是CPU的大小端模式.当今的CPU多时小端的,然而最著名的例外就是motorola 的CPU.它是大端的.应根据CPU的大小端模式不同,配置BYTE_ORDER.1.#define UIP_BYTE_ORDER UIP所运行的CPU大小端模式.复制代码针对应用的配置:UIP应用是使用单个应用函数数实现的.只要TCP/IP事件发生,uIP就会调用这个函数.这个函数的名字必须在编译时使用UIP_APPCALL注册到uIP.uIP应用可以在uip_conn结构中保存应用状态.这是通过利用typedef uip_tcp_appstate_t 和uip_udp_appstate_t指定应用的类型实现的.包含此定义的文件必须被包含在uipopt.h文件中.下面是一个例子:1.void httpd_appcall(void);2.#define UIP_APPCALL httpd_appcall3.4.struct httpd_state {5.u8_t state;6.u16_t count;7.char *dataptr;8.char *script;9.};10.typedef struct httpd_state uip_tcp_appstate_t复制代码1.#define UIP_APPCALL smtp_appcall TCP/IP事件的应答函数名称.2.typedef smtp_state uip_tcp_appstate_t 存储在uip_conn中的应用状态类型.3.typedef int uip_udp_appstate_t 存储在uip_conn中的应用状态类型4.#define UIP_LITTLE_ENDIAN 34125.#define UIP_BIG_ENDIAN 1234复制代码1.#define UIP_ACTIVE_OPEN2.决定是否支持在uip中打开连接.3.如果此工程中工作于uip上层的应用不需要打开TCP连接,可以关闭此项以减小编译后的代码大小.4.定义于uipopt.h中的233行.2. #define UIP_ARP_MAXAGE 120以10s为单位的ARP表项的最大年龄.120代表的是20分钟(BSD中的默认值).定义于uipopt.h中的358行.引用于uip_arp_timer().3. #define UIP_ARPTAB_SIZEARP表的大小.如果uip节点可能在本地网络中有很多连接,则此值应设得大些.定义于uipopt.h中的349行.引用于uip_arp_init(), uip_arp_out(), and uip_arp_timer().4. #define UIP_BROADCAST支持广播.此标志用于配置广播的支持,仅在开启UDP时才有意义.定义于uipopt.h中的423行.5. #define UIP_BUFSIZEuip包缓冲区大小.不就小于60字节,不须大于1500字节.这个值越小,TCP的吞吐量就越小,相反越大.定义于uipopt.h中的379行.引用于uip_split_output().6. #define UIP_BYTE_ORDER uip运行的CPU构架的字节顺序,可选值仅有两个,分别为BIG_ENDIAN和LITTLE_ENDIAN.应用全程:example-mainloop-with-arp.c, and example-mainloop-without-arp.c.定义于uipopt.h中的475行.7. #define UIP_CONNS可同时打开的最大TCP连接数.由TCP连接是静态开辟的,所以减小此选项的值可以减小RAM占用量,每个TCP连接需要大约30字节的RAM.定义于uipopt.h中的245行.引用于uip_connect().8. #define UIP_FIXEDADDR决定uIP是否使用固定IP地址.如果使用固定IP地址,则此地址可以在uipopt.h中指定.否则,如果想用动态的IP地址,则可以使用uip_sethostaddr(),u ip_setdraddr() and uip_setnetmask()三个宏动态指定.定义于uipopt.h中的97行.9. #define UIP_FIXEDETHADDR决定uIP是否使用固定的MAC地址.若不使用固定的MAC地址,则可用uip_setethaddr()在运行时动态指定.定义于uipopt.h中的127行.10. #define UIP_LISTENPORTS可以同时监听的最大端口数.每监听一个TCP端口需要两字节内存.定义于uipopt.h中的259行.引用于uip_init(), uip_listen(), and uip_unlisten().11. #define UIP_LLH_LEN链路层头的长度.这个IP头在uip_buf中的编移量.对于以太网来说,此值为14.对于SLIP来说,其值0 .定义于uipopt.h中的448行.引用于uip_ipchksum(), uip_process(), and uip_split_output().12. #define UIP_LOGGING定义是否编译事件日志.这对于调试是非常有帮助的.如果打开此项,或必须在工程的构架上实现uip_log().定义于uipopt.h中的408行.13. #define UIP_MAXRTX 8在最多多少次重新发送同一段数据之后,就得取消连接.此项不应改变.定义于uipopt.h中的288行.引用于uip_process().14. #define UIP_MAXSYNRTX 5一个SYN数据最多可以重传多少次,之后就得认为连接请求失败.此项亦不应改变.定义于uipopt.h中的297行.引用于uip_process().15. #define UIP_PINGADDRCONF设定ping IP地址.如果设定此项,则uip使用ping包来设定其IP地址.此时uip启用时会只有一个空的Ip地址,而把收到的第一个ping包设为自己的地址.注意:此项只有在UIP_FIXEDADDR设为0时才可用.定义于uipopt.h中的114行.有点长,楼下继续~••本帖最后由逐月于2010-11-17 21:44 编辑16. #define UIP_REASSEMBLY打开IP包重组.uip支持碎片IP包的重组.此项特性需要多余的RAM来盛放重组缓冲区.重组代码大小约为700字节.重组缓冲区的大小与uip_buf的大小(由UIP_BUFSIZE配置)相同.注意:IP包重组并未经过严格测试.定义于uipopt.h的156行.17. #define UIP_RECEIVE_WINDOW通告的接收器窗口.如果处理器对输入数据处理能力较慢,则应设得低些(uip_buf的大小),否则应设得高些(32768字节).定义于uipopt.h的317行.18. #define UIP_RTO 3以时钟脉冲计算的重传超时计数.此项不应改变.定义于uipopt.h的280行.引用于uip_process().19. #define UIP_STATISTICS决定是否将统计功能加入编译.统计功能对于调试和显示用户是非常有帮助的.定义于uipopt.h的393行.20. #define UIP_TCP_MSS (UIP_BUFSIZE - UIP_LLH_LEN - UIP_TCPIP_HLEN)TCP最大数据段大小.此值不应大于UIP_BUFSIZE - UIP_LLH_LEN - UIP_TCPIP_HLEN.定义于uipopt.h的305行.21. #define UIP_TIME_WAIT_TIMEOUT 120一个连接应该停留在TIME_WAIT状态的最长时间.此配置选项没有真正的实现,所以不应理会.定义于uipopt.h的328行.引用于uip_process().22. #define UIP_TTL 64uip发送的IP包的生存时间(TTL)通常此项不应更改.定义于uipopt.h的141行.23. #define UIP_UDP_CHECKSUMS是否使用UDP校验和.注意:对UDP校验和的支持目前并不包含于uIP,故此项无用.定义于uipopt.h的195行.24. #define UIP_URGDATATCP紧迫数据通告功能是否编译.紧迫数据(带外数据)在TCP中很少用到, 所以很少需要.定义于uipopt.h的273行.25. typedef uint16_t u16_t16位数据类型.这个类型定义定义了通贯uip所使用的16位数据类型.应用例程:dhcpc.c, dhcpc.h, resolv.c, resolv.h, smtp.c, smtp.h, telnetd.c, and uip-conf.h.定义于uip-conf.h的76行.26. typedef uint8_t u8_t8位数据类型.此类型定义定义了通贯uIP中使用的8位数据类型.应用例程:dhcpc.c, dhcpc.h, resolv.c,smtp.h, telnetd.c, telnetd.h, and uip-conf.h.定义于uip-conf.h的67行.27. typedef unsigned short uip_stats_t统计数据类型.此类型定义定义了通贯uIP使用的统计数据类型.定义于uip-conf.h的86行.28. typedef uip_tcp_appstate_t此种类型的应用状态将会被存储于uip_conn结构中.它通常被typedef为一种保存应用状态信息的结构.应用例程:smtp.h, telnetd.h, and webclient.h.定义于smtp.h的98行.29. typedef uip_udp_appstate_t此种类型的应用状态将会被存储于uip_conn结构中.它通常被typedef为一种保存应用状态信息的结构.应用例程:dhcpc.h.定义于resolv.h的47行.30. void uip_log ( char * msg )打印uip日志信息.此函数必须为使用uIP的模块实现,uIP每产生一条日志信息就会调用一次这个函数.。
UIPV0.9中文参考手册
件中的:
#ifndef UIP_APPCALL
#define UIP_APPCALL telnetd_app
#endif
当接收到数据、成功将数据发送到连接的另一端、建立了一新连接亦或是重传了数据时,uIP 就会调用相应的应用程序
(uip_process->UIP_APPCALL();)。应用程序同时会周期的轮询以查看是否有新数据到达。由应用程序映射不同服务到不同
1.1 uIP 介绍
随着互联网的成功,TCP/IP 协议簇已成为全球通讯标准。TCP/IP 是底层协议用于通过进行网页传输, 电子邮件传送,文件 传输以及点对点网络互联。对于嵌入式系统,能够运行本地 TCP/IP 使得系统可以直连企业内部网甚至是全球互联网。嵌入式 设备有了全功能的 TCP/IP 支持,将可以与网络中的其他主机进行通信。 传统的 TCP/IP 实现,其代码体积大占用资源多,对于 8 位或者 16 位的系统来说显得有点吃力。对于仅能容纳小于 100k 的系 统,是不可能移植一个完整的 TCP/IP 协议栈的。 uIP 设计只实现了进行网络通信所需的必要的 TCP/IP 组件。提供基础的 UDP 服务,重点是 IP,ICMP(ping), TCP 服务。uIP 是用 C 语言编写的。 许多其他为小型系统设计的 TCP/IP 实现都假定嵌入式设备会和一个运行全尺寸 TCP/IP 协议栈的工作站级别的机器通信。在这 种情形下,去除 TCP/IP 协议簇中很少使用的功能模块成为可能。但是当和运行同样受限,比如是运行分布式点对点服务和协议 的的设备通信时,那些功能却又是必需的。uIP 被设计成 RFC 兼容以使嵌入式设备有相同的通信能力,同时,uIP TCP/IP 并不 是针对特定应用的,是通用的能进行网络通信所必需组件的合集。
SoapUI学习笔记
SoapUI学习笔记1.1. 登录(/user/login)2.1.1.请求格式URIhttp://127.0.0.1:3000/user/loginMethodPOSTParamsloginName : String ⽤户名password : String 密码Cookies :token(out) : String 服务端的Session ID。
2.1.2.返回内容请求成功返回⽤户对象(隐藏密码),cookies中会保存token。
{ "errorCode": 0,"errorMessage": "请求处理成功","content": {"_id": "53fae82b1af1129c1e22a661","loginName": "sysadmin3","version": 0,"createTime": "2014-08-25 15:39:23.730","state": {"alive": true,"deviceType": "pc","loginTime": "2014-08-25 15:47:49.367"},"isAdmin": false,"sex": "male","realName": "administrator","lastLoginTime": ""}}完成后是以下界⾯修改为post并添加参数Table also contains the parameter style and level (RESOURCE or METHOD) at which parameter exists. If a parameter is added at RESOURCE level then it is used by all requests under that resource but if the parameter is at METHOD level then it will used only by the requests under that method.参数类型说明:All parameters can be defined either at the RESOURCE level or at the METHOD level. Defining a parameter at the RESOURCE level means that it is inherited by all method nodes under it, and by all requests under the METHOD nodes. Defining it on the METHOD level only propagates the parameters to the requests; it does not affect the RESOURCE level.新增测试⽤例REST 服务介绍REST(Representational State Transfer)是Roy Fielding 博⼠在2000 年提出的⼀种新的软件架构风格,它以资源(resource)为核⼼,使⽤HTTP、URI、XML 以及HTML 等现有流⾏协议和标准来完成对资源的操作及显⽰。
第二章 uIP协议栈分析V1.00
2ቤተ መጻሕፍቲ ባይዱ 2
uIP 架构
uIP相当于一个代码库,通过一系列的函数实现与底层硬件和高层应用程序 的通讯, 对于整个系统来说它内部的协议组是透明的, 从而增加了协议的通用性。 uIP协议栈与系统底层和高层应用之间的关系如图2-1所示。
图2-1 uIP在系统中的位置 从上图可以看出, uIP 协议栈主要提供了三个函数供系统底层调用。即 uip_init(), uip_input() 和 uip_periodic() 。 其 与 应 用 程 序 的 主 要 接 口 是
本页已使用福昕阅读器进行编辑。 福昕软件(C)2005-2007,版权所有, 仅供试用。
UIP_APPCALL( )。 uip_init()是系统初始化时调用的,主要初始化协议栈的侦听端口和默认所有 连接是关闭的。 当网卡驱动收到一个输入包时,将放入全局缓冲区 uip_buf 中,包的大小由 全局变量 uip_len 约束。同时将调用 uip_input()函数,这个函数将会根据包首部 的协议处理这个包和需要时调用应用程序。当 uip_input()返回时,一个输出包同 样放在全局缓冲区 uip_buf 里,大小赋给 uip_len。如果 uip_len 是 0,则说明没 有包要发送。否则调用底层系统的发包函数将包发送到网络上。 uIP 周期计时是用于驱动所有的 uIP 内部时钟事件。当周期计时激发,每一 个 TCP 连接都会调用 uIP 函数 uip_periodic()。 类似于 uip_input()函数。 uip_periodic() 函数返回时,输出的 IP 包要放到 uip_buf 中,供底层系统查询 uip_len 的大小发 送。 由于使用 TCP/IP 的应用场景很多,因此应用程序作为单独的模块由用户实 现。uIP 协议栈提供一系列接口函数供用户程序调用,其中大部分函数是作为 C 的宏命令实现的,主要是为了速度、代码大小、效率和堆栈的使用。用户需要将 应 用 层 入 口 程 序 作 为 接 口 提 供 给 uIP 协 议 栈 , 并 将 这 个 函 数 定 义 为 宏 UIP_APPCALL()。这样,uIP 在接受到底层传来的数据包后,在需要送到上层应 用程序处理的地方,调用 UIP_APPCALL( )。在不用修改协议栈的情况下可以适 配不同的应用程序。
uip简介
Uip协议栈初步分析5.1Uip协议栈架构uIP 的代码和这个文档的新版本可以在uIP的主页下载/adam/uip/。
Uip协议栈架构图Uip协议栈包含以下几层:1.硬件驱动程序:包含rtl8019as/ax88796/dm9000等的驱动程序由于uip是个免费的协议栈,在不同芯片合系统上,需要对原有的协议栈进行修改,这个过程就叫做移植,一般的uip协议栈没有提供网络芯片的驱动程序,所幸遇的是/projects/uipAVR.htm已经将uip移植到avr上,并提供了rtl8019as和ax88796的驱动程序,dm9000的驱动程序没有提供。
本开发板提供的软件也是从上述地址的软件移植而来,类似的charon ii 和ethernut软件也提供类似的驱动程序,有兴趣的也可以参考一下。
驱动程序完成,芯片的初始化,复位,溢出处理,读写函数和收发包等,主要函数如下另外对网络芯片的寻址也在此完成!!!!主要文件在rtl8019.h和rtl8019.c中2.nic网络层主要完成网络的初始化,网络芯片的选取,网络芯片的轮训poll等主要文件在nic.h和nic.c中3.uip协议栈层主要实现网络协议栈的具体实现,支持arp/icmp/udp/tcp/http/等为了实现在8位单片机上运行,系统设计时没有采用socket编程方式本层是uip协议栈的核心,所以得协议处理都在本层实现主要函数有:主要文件在uip.h和uip.c中4.uip_app层支持基于udp/tcp的上层应用函数的实现例如如果需要网页功能,需要支持http,那么在app.h/.c中实现具体的功能!!主要文件在app.h和app.c中编译文件其他介绍:Uipopt.h 这个是uip协议栈的配置函数,例如本机ip地址,本机网关,本机屏蔽码,本机mac 地址以及uip协议栈的一些常用设置等都在此修改!Uip_arp.h/.c定义了arp协议的处理函数Uip_arch.h/.c定义了协议栈需要的校验和函数5.2应用程序主要文件列表上图是一个项目的主要包含文件,其中html.h/.c是网页显示的文件!5.3. uip主要函数简介:5.4.uip main函数介绍:/******************************************************************** * Main Control Loop**********************************************************************/ int main(void){unsigned char i;unsigned char arptimer=0;////////////// MY CODE ADD//串口初始化USART_init();/////////////////////////// init NIC device driver//网络初始化函数nic_init();//uip协议栈初始化// init uIPuip_init();// init app 应用程序初始化,比如tcp或者udp ,http的应用!example1_init();// httpd_init();// init ARP cache 初始化arp协议的缓冲uip_arp_init();// init periodic timer 初始化周期函数定时器initTimer();//开放中断sei();//主循环while(1){// look for a packet查询网卡是否有数据包uip_len = nic_poll();if(uip_len == 0)//如果没有数据包{// if timed out, call periodic function for each connection if(timerCounter > TIMERCOUNTER_PERIODIC_TIMEOUT){timerCounter = 0;for(i = 0; i < UIP_CONNS; i++){uip_periodic(i);//周期性检查函数// transmit a packet, if one is readyif(uip_len > 0) //如果包长度大于0 发送包{//主动发送和重发数据包在此进行uip_arp_out();nic_send();}}/* Call the ARP timer function every 10 seconds. */if(++arptimer == 20)//更新arp表{uip_arp_timer();arptimer = 0;}}}else // packet received 接收到网络数据包{// process an IP packet 处理ip数据包if(BUF->type == htons(UIP_ETHTYPE_IP)){// add the source to the ARP cache// also correctly set the ethernet packet length before processinguip_arp_ipin();uip_input();// transmit a packet, if one is readyif(uip_len > 0){uip_arp_out();nic_send();}}// process an ARP packet 处理arp包else if(BUF->type == htons(UIP_ETHTYPE_ARP)){uip_arp_arpin();// transmit a packet, if one is readyif(uip_len > 0)nic_send();}}}return 1;}串口转TCP程序初步本范例主要实现串口数据发送到远程ip的对应端口,串口数据包含帧头和帧尾,主要有串口中断函数,和串口处理函数2个函数构成,分析如下:volatile unsigned int UartTxCount,UartRxCount,UartRxCount1;volatile unsigned char TxSendReady,RxOK,RS232Enable;//串口1通讯程序//没有增加超时处理20060822//SIGNAL(SIG_USART_RECV)#pragma interrupt_handler RS485COM:31//atmega32l @14void RS485COM(void){Rs485_Data=UDR1;//Rs485_Data=UDR;#ifdef MCUA TMEGA32//printf("=%x\n",Rs485_Data);////if(RxOK==1)printf("RxOK==1!\n");#if RS485HEADER//如果是帧头if(Rs485_Data==RSStart ) //接收到开始标志{RsStart=1; //开始接受串口1的数据Rs485Counter=0; //接收计数器清零RxBuf[Rs485Counter]=Rs485_Data; //把数据送入接收缓冲区RXBUFRSCRC=0; //RSCRC清零RxOK=0; //没有接收完成//加上0X55//#if CRC0//RSCRC+=Rs485_Data;//#endifRs485Counter++; //接收计数器加一}else if(Rs485_Data==RSEnd) //接收到结束标志{//检查CRC// if(RSCRC==RxBuf[Rs485Counter-1])// {RxBuf[Rs485Counter]=Rs485_Data; //将结束的数据送入接收缓冲区// UartRxCount=++Rs485Counter;RSLEN=++Rs485Counter; //把接收计数器的值送入RSLENRxOK=1; //接收完成RsStart=0; //清除RSSTARTRS485process();//Rs485Counter=0;// }/*RxBUF[Rs485Counter]=Rs485_Data;//加上0XAARSCRC+=Rs485_Data;//加上0XAA的字节长度Rs485Counter++;*//*else{//清除RxBuffor(j=0;j<TxBufLen;j++)RxBuf[j]='';//置位标志//3.初始化串口变量和标志// UartTxCount=0;UartRxCount=0;TxSendReady=0;RxOK=0;RS232Enable=1;}*/}else{#endif //RS485HEADER//开始接收数据帧中除了头和尾的中间数据//首先检查状态if(RxOK!=1)//如果没有结束{//检查计数器的值是否溢出//将接收的数据送入接收缓冲区RXBUF,同时计算CRC,计数器自动加一if(RsStart==1||Rs485Counter!=0){RxBuf[Rs485Counter]=Rs485_Data;//RSCRC+=Rs485_Data;Rs485Counter++;}#if RS485HEADER}#endif //RS485HEADER}}/*1. 串口及程序初始化;{TxSendReady=0;RxOK=0;RS232Enable=1;}2. 首先从串口接收数据,由于数据以0X55开始,0XAA结束,接收时数据写入RxBuf[];3. 接收完成,置接收标志RxOK=1;4. 判断RS232Enable=1,=1则复制到TxBuf, RxOK=0;TxSendReady=1;5. TCPAPP中判断if(TxSengReady==1),=1启动发送,发送完成清除TxSendReady=1;置位RS232Enable=1,允许数据装载到TxBuf*/void RS485process(void){unsigned char i;//if(UartRxCount!=0){//printf("UartRxCount=%x\n",UartRxCount);//for(i=0;i<UartRxCount;i++)printf("%x",RxBuf[i]);//printf("\n");//}//printf("RxOK=%x ",RxOK);//printf("TCP_SEND_OK=%x " ,TCP_SEND_OK);//printf("RS232Enable=%x ",RS232Enable);//printf("TCP_SEND_READY=%x \n",TCP_SEND_READY);if(TCP_SEND_OK==0){printf("TCP_SEND_OK==0\n");return;//如果发送没有完成则返回}//printf("RS232Enable=%x\n",RS232Enable);//printf("TCP_SEND_READY=%x\n",TCP_SEND_READY);//接收完成if(RSLEN!=0||RS232Enable==1)//如果不是空包和串口更新允许RS232ENABLE=1 {//如果缓冲中已经有数据包,需要把缓冲重的数据保存起来if(TCP_SEND_READY==1){//接受成功//UDR0 = j++;RxOK=0;//清接收成功标志UartRxCount1=RSLEN;//Rs485Counter;//包含包头和包尾的//把数据放入上一个数据包的TCP发送缓冲区的后面for(i=0;i<UartRxCount1;i++){TxBuf[i+UartRxCount]=RxBuf[i];}UartRxCount+=UartRxCount1;RSLEN=0;return;}if(TCP_SEND_OK)TCP_SEND_READY=1;//TCP准备发送else {UartRxCount=0;printf("TCP_SEND_OK=0\n");return;}//接受成功//printf("RxOK=1\n");RxOK=0;//清接收成功标志UartRxCount=RSLEN;//Rs485Counter;//包含包头和包尾的//把数据放入TCP发送缓冲区for(i=0;i<UartRxCount;i++){TxBuf[i]=RxBuf[i];//printf("TxBuf[%x]=%x\n",i,TxBuf[i]);}RSLEN=0;//for(i=0;i<TxBufLen;i++)RxBuf[i]='';//printf("\nTCP_SEND_READY=0\n");//RS232Enable=0;}else{printf("wait");}return;}。
UIP中文文档第三uIP配置函数
UIP中文文档第三uIP配置函数uIP配置函数用于设置一些如ip地址等的uIP运行时参数.它包括以下一些函数:1.#define uip_sethostaddr(addr) 设定主机IP地址2.#define uip_gethostaddr(addr) 获取主机IP地址3.#define uip_setdraddr(addr) 设定默认路由器地址4.#define uip_getdraddr(addr) 获取默认路由器地址5.#define uip_setnetmask(addr) 设定网络掩码6.#define uip_getnetmask(addr) 获取网络掩码7.#define uip_setethaddr(eaddr) 设定以态网MAC地址复制代码前六个函数皆定义于uip.h,最后一个定义于uip_arp.h1. uip_sethostaddr(addr)#define uip_sethostaddr(addr) uip_ipaddr_copy(uip_hostaddr, (addr))获取主机IP地址,主机IP地址由4字节的数列表示,第一个八位数就是数组的第一个成员.(八位数,octet,是网络术语,即是一个字节,但网络术语不叫字节),常用使用方法如下:1.uip_ipaddr_t addr;2.uip_ipaddr(&addr, 192,168,1,2);3.uip_sethostaddr(&addr);复制代码参数:addr 指向IP地址类型uip_ipaddr_t的指针.参考:uip_ipaddr()应用例程:dhcpc.c, example-mainloop-with-arp.c, and example-mainloop-without-arp.c.定义于uip.h的106行.2. uip_gethostaddr(addr)#define uip_gethostaddr(addr) uip_ipaddr_copy((addr), uip_hostaddr)使用方法例:1.uip_ipaddr_t hostaddr;2.3.uip_gethostaddr(&hostaddr)复制代码3. uip_setdraddr(addr)设定的是默认路由器地址.#define uip_setdraddr(addr) uip_ipaddr_copy(uip_draddr, (addr))4. uip_getdraddr(addr)获取默认路由器地址#define uip_getdraddr(addr) uip_ipaddr_copy((addr), uip_draddr)5. uip_setnetmask(addr)设定子网掩码#define uip_setnetmask(addr) uip_ipaddr_copy(uip_netmask, (addr))6. uip_getnetmask(addr)获取子网掩码#define uip_getnetmask(addr) uip_ipaddr_copy((addr), uip_netmask)7. uip_setethaddr(eaddr)1.#define uip_setethaddr(eaddr) do {uip_ethaddr.addr[0] = eaddr.addr[0]; \2.uip_ethaddr.addr[1] = eaddr.addr[1];\3.uip_ethaddr.addr[2] = eaddr.addr[2];\4.uip_ethaddr.addr[3] = eaddr.addr[3];\5.uip_ethaddr.addr[4] = eaddr.addr[4];\6.uip_ethaddr.addr[5] = eaddr.addr[5];} while(0)复制代码获取以太网的MAC地址,ARP代码需要知道以太网卡的MAC地址,才能回应ARP查询,并产生以太网头.注意:此宏只能用来确定以太网卡的MAC地址,并不能用来改变它.参数:eaddr 指向uip_eth_addr结构体的指针,里面包含了以太网卡的MAC地址. 定义于:line 134 of file uip_arp.h.1.struct uip_eth_addr {2.u8_t addr[6];3.};复制代码定义于:line1542of file uip.h.。
uip之udp应用笔记
千兆网项目中,移植了uip到mcu中,采用udp通信方式,主要用来做一些控制协议的处理。
刚开始接手的时候,并没有做过网络方面的应用,而且对tcp/ip及udp通信又不太熟悉。
好在网上有一些文档,加上仔细阅读uip_process代码,一边用抓包软件一边调试,总算把uip很好的应用了起来,而且还针对项目某些应用的特殊性,对uip源码进行了一些修改。
本文前半部分对uip源码的一些重要函数进行介绍,后半部分将对修改的部分做个记录,以备往后查阅。
本次使用的是uip-1.0,抓包软件用的Wireshark 1.6.7,这个软件真的很不错,居然支持gige vision,这点真的很意外。
一、一个完整的UDP数据报文格式其实uip就是将你要发送到网络上的数据加上报头,好让它被成功发送到目的主机。
所以我们要先搞清楚一个完整的数据报文,才能搞清楚uip到底在做些什么。
Ethernet Header:由目标mac和本机mac及type组成,共14byte,当目标mac全为ff 时,表示是udp广播。
Type=0x0800表示是ip。
在uip中,Ethernet Header结构体定义如下:IP Header:0x45表示version=4,header length=20byte;0028表示ip header+udp header+user data长度为40byte;6C14为包的ID,每发一个包,这个ID会自加1。
80的意义是time to live,表示这个包的存活时间,路由每转发一次,就会对它自减1。
17表示通信协议类型为UDP,4a0a为ip header的校验码。
再后面就是源IP和目的IP地址了。
UDP Header:0aaa表示src port为2730;0f74表示dst prot为3956;14表示udp header+user data长度为20byte,c477表示udp header的校验码,在一般的情况下,这个可以为0。
移动端UI知识点整理
名词解释iPhone各型号尺寸上图中的红字“display zoom”即为放大模式(老人模式),upsampling和downsampling意为宽度的缩放倍数IOS APP UI设计尺寸IOS APP UI设计,图片命名规则设计APP时,所有图片需要保存为PNG格式,如果是高清版本,需要将放大版的图片前缀加上@2x,iPhone6 Plus需要加@3x前缀Viewport(可视区)viewport可视区示意图上图中绿色部份为viewport(上图为iPhone3GS 默认的viewport)上图中橙色部份为viewport,不作任何设置,默认将为980px宽(逻辑分辨率)上图为对viewport进行了一系列设置,且进行了放大1.5倍后的可视区上图是PC网页在手机中浏览的情况,阴影部份为320大小,看起来是不是很不适合?使用meta标签对viewport进行设置(设置数值)效果如上图(左:设置前;右:设置后)使用meta标签对viewport进行设置(设置为设备宽)注:这里的device不应翻译为设备;devide-width 将会使用移动设备的默认逻辑分辨率来呈现页面,即最上面第一张图表中的第一行“象素”尺寸。
iPhone3GS 效果如上图(左:设置前;右:设置后),舒服了很多?注:iPhone3GS默认逻辑分辨率为320px宽,所以右图显示宽为320px。
其它viewport参数:width: 屏幕逻辑宽度initial-scale: 默认缩放倍数maximum-scale: 最大缩放倍数minimum-scale:最小缩放倍数user-scalable:用户是否可以对页面进行缩放js获取默认逻辑分辨率的方法:或者使用更详细的方法,见下例:移动端设备Viewport取值Git: https:///JacksonTian/1202575其它移动web的meta标签iPhone私有标签,实现页面全屏浏览顺带一提Android的全屏用如下代码实现iPhone私有标签,指定iPhone中safari顶端的状态条的样式;告诉设备忽略将页面中的数字识别为电话号码去除Android平台中对邮箱地址的识别禁止safari对页面中5位数字的自动识别和自动添加样式,或者也可以通用css设置去掉手机点击链接的绿框-webkit-tap-highlight-color改写iOS Safari中可点击元素的高亮颜色。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本笔记适用于uIP1.0。
移植平台介绍:MSP430F149+cs8900a+IAR
1、阅读The uIP Embedded TCP/IP Stack The uIP 1.0 Reference Manual.
2、建立一个文件夹,起名myport,将uip-1.0下的uIP和lib两个文件夹拷贝过去,然后再在myport下建立app文件夹。
3、将unix子文件夹下的clock-arch.c、clock-arch.h拷贝到myport下,这个文件实现协议栈所用的时钟,由430的定时器完成,有三个函数:
clock_time_t clock_time(void)
{
return ticks;
}
void clock_init(void)
{
定时器的初始化工作
}
__interrupt void timer_interrupt(void)/*定时器中断函数*/
{
++ticks;
}。
4、将unix子文件夹下的uip-conf.h拷贝到myport下,这个文件实现协议栈所用的配置,按照需要修改之。
5、写cs8900a的驱动函数,这里采用8位、查询模式,替换tapdev.c 或slipdev.c。
6、将unix子文件夹下的main.c函数拷贝到myport下,这个是主调度流程,按照需要修改。
7、建立自己的工程,将以上文件包含。
8、调试,改错。
其中,uip的缓冲区是以字节数组的形式产生,为了保证它的起始地址是偶数,必须指定地址。
UDP的初始化如下
void myudp_init(void)
{
uip_ipaddr_t ipaddr;//定义IP类型变量
uip_ipaddr(ipaddr, 210,29,104,88); //远程IP为210.29.104.88
if(myudp_conn != NULL)
{
uip_udp_remove(myudp_conn);//如果连接已经建立,则删除之
}
myudp_conn = uip_udp_new(&ipaddr, HTONS(1000));//建立到远程ipaddr,端口为1000的连接
if(myudp_conn != NULL)
{
uip_udp_bind(myudp_conn, HTONS(2000));//绑定本地端口为2000,也就是2000-->1000 发数据}
}
void myudp_send(char *str,short n)
{
char *nptr;
nptr = (char *)uip_appdata;
memcpy(nptr, str, n);
uip_udp_send(n); //发送n个数据
}
void newdata()
{
char *nptr;
short len;
len = uip_datalen();//读取数据长度
nptr = (char *)uip_appdata; //取得数据起始指针
if(len<4)myudp_send("Please check the command!\n",26);
else if(strncmp(nptr,"getname",7)==0)myudp_send("My name is xiaomu.",19);
else myudp_send("Unkown command!\n",16);
}
/*---------------------------------------------------------------------------*/
/** \internal
* The main UDP function.
*/
/*---------------------------------------------------------------------------*/
void
myudp_appcall(void)
{
if(uip_udp_conn->rport == HTONS(1000))
{
if(uip_poll()) {
myudp_send("hello\n",6);//定时时间到,发hello
}
if(uip_newdata()) //如果指定IP的指定端口发来数据
{
newdata();
}
}
}
TCP的和这个差不多,初始化时就监听端口uip_listen(HTONS(23));
myudp_conn = uip_udp_new(&ipaddr, HTONS(0));//如果远程ipaddr为0,端口也为0,则可以接收来自任何ip任何端口的信息,但必须指定本地端口,即要绑定。
我修改了uip.c文件中关于UDP接收的部分,使它总是可以接收来自任何ip的信息,接收的数据的ip和端口信息保存在当前连接的结构体里面,可以用来回复信息。
如果想要主动发送信息,必须在每次发送前给当前连接的结构体赋值,因为我将UDP部分的代码修改为每次打好包以后将结构体的远端信息清零!详见我的移植代码。