第一篇:NDIS网络防火墙开发经验总结
NDIS网络防火墙开发实践经验总结
一、window软件防火墙开发概述:
在window下开发软件防火墙可以实现:NDIS数据包的截获、NDIS数据包的抓取、NDIS数据包的分析、NDIS数据包过滤、NDIS 驱动对IP与port的过滤、NDIS中间层驱动安装技术等。本文对NDIS开发基本流程、NDIS开发注意事项、NDIS安装过程中出现的各种问题都给予详细说明,希望对做NDIS开发程序员有所帮助。
目前可以实现软件防火墙的方法有:
(1)SOCKET端口形式。
(2)NDIS中间驱动IPHOOK形式(xp/2003)。
(3)NDIS中间驱动miniport形式(xp/2003/vista/win7/win2008)。
三种形式从开发难度到使用范围都有自身的特点。
(4)SOCKET形式是面向应用层开发的,在代码及调试方面相对后两种简单的多,但
SOCKET形式不能捕获所有数据包,所以用socket开发防火墙不是最好的选择。
(5)后两种属于NDIS中间驱动程序开发,是面向驱动层(底层)开发,代码编写及调试较
socket形式上难。(说明:可能大部分采用高级语言程序员根本都没接触过驱动开发)但NDIS形式可以捕获到所有通过网卡的数据包(NDIS中间驱动是插入到协议层与网卡驱动层的中间驱动程序所以数据必须通过)。所以本文作者建议采用NDIS开发软件网络防火墙。
二、DNIS中间驱动开发注意事项:
NDIS中间驱动程序开发window防火墙要注意window版本问题,因为目前用户使用的window版本有window200、window200 server、window xp、window2003、window vistawindow
7、windown 2008 server。你采用的NDIS开发技术直接决定是否能在不同window版本上运行,这是很关键的问题。目前作者知道的NDIS防火墙技术有两种:
2.1.IP_FIREWALL_HOOK(NDIS防火墙钩子技术适合XP/2003)。
(1)这种技术的特点:相对miniport的开发、测试、安装简单些。
(2)安装步骤简单见四:可以采用注册表注册后用net start启动,也可以采用:
OpenService、CreateService、StartService等函数创建服务形式启动驱动具体用法请查询msdn帮助)
(3)比较典型的案例: ewall-Hook-Driv此种方法对window vista 之前window 2000之后的操作系统是没有任何问题。通过作者的开发测试,对于window vista 之后的产品向window 7 window 2008是不支持的(这点一定要注意)。
这里网上有许多评论有人说还支持,但本文作者给出答案是不支持,理由 msdn(http://msdn.microsoft.com/en-us/library/windows/hardware/ff546487(v=vs.8
5).aspx中有这样一句话: Note: Starting with Windows Vista, do not implement filter-hook or firewall-hook drivers.Use Windows Filtering Platform Callout Drivers instead.翻译成中文大概意思:从vista以后不再支持” filter-hook”,请使用…)。
(4)你可以在window 7或window2008测试下你的钩子防火墙在status=IoCallDriver加入dbprint代码用 dbgview.exe截获status的值你会发现
在2000、xp、2003下返回0一切正常,在vista、win7、2008下返回0xc0000002-
0xc000000d的任意值。所以钩子防火墙在vista及以后的版本是不能实现的。
所以作者建议在vista以后的版本就要用IP HOOK(ipfirewall)浪费时间啦。
2.2.NDIS(miniport –protocol)中间驱动技术(XP/2003/vista/win7/2008)。
这种形式在2000、xp、2003、vista、win7、2008下都可以现实,但原理和代码实现上 要比钩子复杂的多,安装测试也比较麻烦。典型列子是ddk源文件路径下的passthru项 目。但我开发这个项目后,总结下NDIS开发其实并不是很难只是以前对这方面知识缺 乏已。
三、NDIS程序结构:
3.1.DriverEntry函数:这个函数必须存在,它是window驱动的入口函数(IPHOOK
与miniport都必须定义的函数,在驱动安装启动是执行)。
3.1.1.这个函数有两个参数:
IN PDRIVER_OBJECTDriverObject,IN PUNICODE_STRINGRegistryPath。
3.1.2.DriverEntry内部常用代码:
NdisMInitializeWrapper(中间驱动miniport):初始化小端口时会用到这连个参数。IoCreateDevice(钩子驱动IPHOOK):建立IO设备时会用到。
3.1.3.建立miniport与protocol端口(中间驱动miniport):
NDIS_PROTOCOL_CHARACTERISTICSPChars;
NDIS_MINIPORT_CHARACTERISTICSMChars;
并分别设置PChars、MChars一系列属性参数指定处理函数。
这里有几个很重要的属性在开发防火墙程序中很重要我说明下其它参数见DDK帮助文档。
MChars.CancelSendPacketsHandler = 自定义截获发送函数;
PChars.ReceivePacketHandler =自定义截获接受函数1;
PChars.ReceiveHandler =自定义截获接受函数2;
(说明:ReceivePacketHandler与ReceiveHandler区别:是针对不同型号网卡分别采用这两个属性接受数据的建议全部设置上你自定义的接受函数。)
3.1.4.如果是IPHOOK驱动需要绑定钩子(钩子驱动IPHOOK):
IP_SET_FIREWALL_HOOK_INFO filthook;
filthook.FirewallPtr = 钩子函数(处理过滤/抓包函数的函数);
filthook.Priority = 1;
filthook.Add = true;
应用这个IoBuildDeviceIoControlRequest函数绑定具体见DDK文档。
3.2.MajorFunction函数任务的指派(IPHOOK与miniport都必须定义的函数):
DriverEntry函数是驱动与操作系统的接口函数,MajorFunction函数是用户通过
应用程序控制驱动的接口。
3.2.1.几个常用的函数(IPHOOK与miniport都必须定义的函数):
DispatchTable[IRP_MJ_CREATE] = 创建函数;
DispatchTable[IRP_MJ_CLEANUP] =清除函数;
DispatchTable[IRP_MJ_CLOSE] = 关闭函数;
DispatchTable[IRP_MJ_DEVICE_CONTROL] =用户IO控制函数(这个函数很重要);
以上三个函数可以指向IO控制函数即:
DispatchTable[IRP_MJ_CREATE] =
DispatchTable[IRP_MJ_CLEANUP] =
DispatchTable[IRP_MJ_CLOSE] =
DispatchTable[IRP_MJ_DEVICE_CONTROL] =用户IO控制函数(这个函数很重要);
3.2.2.用户IO控制函数(DevIoControl):是用户通过指定IOCTOL码向NDIS驱动发出指令要求驱动为自己做事。(具体建立IO控制码见DDK)
3.2.3.DevIoControl(NDIS是一个很重要的函数,IPHOOK与miniport都必须定义这个函数)函数的定义规则:
它有两个参数:
IN PDEVICE_OBJECTpDeviceObject,IN PIRPpIrp(这个是主要参数,是驱动程序与用户的数据通信接口)
PIO_STACK_LOCATIONpIrpSp;必须定义本地IO堆栈变量。
pIrpSp = IoGetCurrentIrpStackLocation(pIrp);//返回输入/输出堆栈位置
ioBuffer = pIrp->AssociatedIrp.SystemBuffer;//获得IO操作缓存区指针
IOCode = pIrpSp->Parameters.DeviceIoControl.IoControlCode;//获得IO操作码
下面就根据用户发来的IO操作命令进行处理,处理过程如下:
switch(IOCode)
{
Case IO控制码1:
自定义操作函数1;
Break;
Case IO控制码2:
自定义操作函数2;
Break;
Case IO控制码3:
自定义操作函数3;
pIrp->IoStatus.Information = outputBufferLength;//这里要注意
Break;
}
最后加入下面代码:
if(NtStatus!= STATUS_PENDING)
{ pIrp->IoStatus.Status = NtStatus;IoCompleteRequest(pIrp, IO_NO_INCREMENT);
}
这里我要说下NDIS驱动开发IOCTRL写入或读取数据时要注意两点:
1.上面的pIrp->IoStatus.Information = outputBufferLength句用不好会出问题的。它是用在向用户应用程序返回数据的过程体中,如果这句用不好你应用程序可能接受不到NDIS返回给你的数据。
2.同时接受和返回如何做?
其实读取和写入全是在pIrp->AssociatedIrp.SystemBuffer缓存中我们操作的次序是先把用户发来的数据读出 把要写的的数据写入AssociatedIrp.SystemBuffer中。例如:
用户EXE中IO操作是:
DeviceIoControl(devhdle, IO操作码,输入数据地址,输入数据长度, 输出数据地址, 输出数据长度,返回值地址, NULL))
NDIS可以这样读取返回数据:
读取数据:ibuff=pIrp->AssociatedIrp.SystemBuffer;
返回数据:oBuffer=pIrp->AssociatedIrp.SystemBuffer;
自定义函数(oBuffer)向oBuffer写数据。
明白啦吗?还不明白,我还有个办法就是你自己动手实验一万遍。其实我已经说的很明白啦。
注意:IO操作码: 这个码必须是可读写的。至于怎么生产你看DDK。
3.3.驱动卸载函数(Unload IPHOOK与miniport都必须定义的函数):这个函数只有一个
参数IN PDRIVER_OBJECTDriverObject。作用:当驱动卸载时释放我们在程序中分配的内存、miniport端口、IO设备等。
总结: 从NDIS程序结构中我们不难找出NDIS的miniport与iphook开发的区别就是在你
驱动中是否注册啦miniport_protocol还是绑定啦IP_SET_FIREWALL_HOOK_INFO钩子,基本结构是一样。如果你在网上看到NDIS开发文档感到很难时我只能说:”真正了解一门技术是有一个过程的,过程中遇到些困难是很正常的,关键是你能否坚持到最后!”。
四.安装NDIS驱动方法:
4.1.IPHOOK驱动安装:相当简单我这里介绍两种方法:
4.1.1.手动注册表建立服务
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINESYSTEMControlSet001Services驱动名]
“Type”=dword:0000000
1“Start”=dword:0000000
3“ErrorControl”=dword:00000001
“ImagePath”=system32drivers驱动文件名.sys
“DisplayName”=“驱动名”
“Group”=“Extended Base”
4.1.2.用”NET STRAT 服务器名”启动/”NET STOP服务器名”停止服务
4.1.3.安装启动后可以用代码直接使用此服务:
(1)#defineMY_DEVICE_NAME “.驱动名” //驱动名称
(2)HANDLEhdle=CreateFile(MY_DEVICE_NAME,GENERIC_READ |GENERIC_WRITE, 0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,(HANDLE)INVALID_HANDLE_VALUE);
(3)
4.1.4.对于(4.1.1与4.1.2)前步可以完全用代码取代手工来完成:
(1)拷贝.SYS文件到system32drivers(具体代码来完成不是很难)。
(2)定义SC_HANDLE hSCManager;变量。
(3)hSCManager = OpenSCManager(NULL, NULL,SC_MANAGER_ALL_ACCESS);打开服务控制管理器。
(4)如果(3)成功OpenService(hSCManager, lpszServiceName,SERVICE_ALL_ACCESS);打开服务。
(5)如果(4)失败说明驱动服务没有安装开始安装驱动:
hService = CreateService(hSCManager, lpszServiceName, lpszServiceName, SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, lpszDriverPath, NULL, NULL, NULL, NULL,NULL);
建立服务。
(6)启动服务器StartService(hService, 0, NULL);
(7)关闭SC_HANDLE:CloseServiceHandle(hSCManager);
(8)再使用4.1.3.中代码访问驱动。
以上说明啦NDIS钩子驱动(不含miniport-protocol端口)的安装使用两种方法。
4.2.NDIS中间驱动(miniport-protocol)安装使用方法:
4.2.1只要你掌握其实也很简单(你可以参考DDK_SRC下的netcfg例子。其中有一个很重要的函数是HrInstallNetComponent你把它看明白安装基本就差不多啦。
4.2.2.但这里有个很大开发安装程序问题:就是netcfg是用ddk编译的,我们有时要把安装代码集成到VC编译器中,有人说include ddk包文件。我这里建议你用DDK编译成dll 接口函数。
4.2.2.其次你最好对inf文件各个键值作用了解详细。我这里要说明
[SourceDisksFiles]这个键,如果你的inf文件与sys在同一个路径下那么
[SourceDisksFiles]键值为空。如下:
[SourceDisksFiles]
Passthru.sys=1 改成;Passthru.sys=1前面加分号
如果不这样在安装sys时可能提示你选择sys路径问题。
4.2.3.值得特别注意的是:无论你安装成功或不成功你最好把用到的所有inf文件和sys
文件拷贝到 windows/inf 路径下。拷贝过去绝对没有坏处,但不拷贝可能
安装过程会出现不成功的现象;这点是本人实践中总结出来的。
至此,本人对DDK开发软件防火墙的两种方法全部介绍完毕。真正想实现防火墙的封包、抓包等一系列功能需要你不断总结和摸索才行。以上内容都是作者本人通过开发过程中实践中总结出的经验可能有些地方与网上其它文章有很大出处,但上面思路在PC机上全部实现过。(本人在开发过程依据是DDK帮助文件和PASSTHRU)。在此,谢谢各位网友网上文档给予了很大的帮助!
2012年11月29日
本文来源: http:///techntxt/20121***705291
第二篇:BACnet+网络开发经验总结
BACNet这个东西的资料太少了,有用的高效的资料更是少!
资料太少,摸索着实在太辛苦,这是BACnet项目完成之后的一点开发经验,希望对正在摸索的各位同仁,有所帮助。
任务定位:
BACNet分为系统应用和开发应用,购买现有的BACNet设备组网,应用,属于系统应用,放松心情,继续读下去,如果是开发BACNet设备,这里的一点经验就不需耽误时间了。
层次定义:
BACNet既然协议里分了那么多层,我们要做多少呢?
继续放松,BACNet的系统应用来说,我们只需做到应用层+网络层就可以了,不要被协议厚厚的书吓到,我们用到的,很少。
好了,现在知道我们要干什么了,就是拿到BACNet设备进行网络层以上的应用。
资料选择:
BACNet协议,中英文网络上都可以找到,如果网络没搜过到,我的资源里也提供了下载。还推荐一本书,《智能楼宇BACNet原理与应用》董春桥写的,只出版了3000册,如果能搞到,庆幸吧!
知识储备:
既然是网络开发,必备网络编程一点小小的经验,尤其是UDP。
开发工具:
工欲善其事,必先利其器。看协议可以了然于胸,但如果有个智能点的开发工具,效率可以乘以10倍,推荐VTS,网络上应该可以下载到,我的资源里也提供了下载。
软件架构:
对于UDP,相信做这个的不需我多说。
对于BACNet编码,一句话,NPCI+BCLCI+APDU,唯一难一点的,就只有APDU,不过,有VTS的话,轻松很多。
好了,随手涂鸦的几句话,希望对大家有点帮助吧,QQ:404536204,愿与同仁共同进步!
如果上面提到的资料比较难找的话,我的资源里也有提供,开发源码:
VTS:
中文协议:
英文协议:
第三篇:构建网络防火墙
让我们修筑起一道道网络“防火墙”
——501班心理团辅课
网络为学生提供了一条很好的学习和娱乐途径,但如果沉溺其中肯定弊多利少。小学五年级是学生意志品质形成的关键时期,也是人格发展的重要时期,大家接触网络的时间越来越长,对网络也越来越迷恋,其中相当一部分学生盲目追求个人兴趣,缺乏自我控制能力,浪费大量宝贵时间,以致荒废了学业,严重影响了其身心健康成长。老师发现咱班有好多同学爱好上网,并且网络聊天时语言不够文明,还发一些不文明的图片,上一些不健康的网站,玩游戏毫无节制,有些同学经常不完成作业。于是,为了引导我们正确认识网络的利弊,了解不适度上网对自身造成的危害,初步尝试预防过度上网的方法,让我们正确地利用网络资源为我们的学习、生活增添色彩,今天下午老师特意给我们上了一节生动的心理团辅课。
课前老师对本班学生进行了相关的调查。活动在拍手游戏中拉开了序幕。神奇的网络给我们的生活带来了前所未有的便利,我们的生活也日益被网络占据。那么网络给我们带来了什么好处呢?同学们你一言我一语地说开了,有的说,可以听音乐看电影,休闲娱乐;有的说,可以聊天,结交笔友增进友谊;有的说,可以玩游戏放松心情;有的说,可以查阅资料增长见识,非常便捷;还有的说,可以购买物品既方便又便宜„„看来,网络的确给我们的生活、学习带来了便利,好处多多。“那么大家从网络中得到的是否都是快乐呢?下面我们一起来看一则小品”老师向我们抛出了这样一个疑问,紧接着郭一鸣、马圣隆、卢懿、施芷蕴四位同学上台为大家表演了一则小品——《小刚上网记》。这则小品再现了个别同学的风貌,老师还从PPT中出示了小刚因此成为“网虫”的惨痛日记,很值得同学们深思啊!紧接着老师又出示专家的一些调查研究报告,同学们全神贯注地看着屏幕,个个瞪大了眼睛,真令人吃惊,原来网络还给我们中小学生造成这么大的危害。老师又出示了咱们班的课前调查结果,指出我们班的有些同学也或多或少地存在着这些问题。
怎么办呢?老师请我们想一想,寻找解决的办法。大家又七嘴八舌地讨论开了。最后,老师给我们做了点评,总结,提出了修筑四道“防火墙”工程:
第一道“防火墙”:上网之前先明确任务。第二道“防火墙”:上网之前先限定时间。第三道“防火墙”:时间一到就“思维叫停”。第四道“防火墙”:父母帮助监督提醒。
在修筑第三道网络“防火墙”时,我们还玩了“悬崖勒马思维叫停”的游戏,同学们在轻松的游戏活动中,体验着,逐步提高自我控制力。说到第四道“防火墙”,好多同学还认为自己没有必要修筑呢,都觉得自己的控制力挺强的,呵呵,“道德只是个简单的是与非的问题,可实践起来却很难”,但愿这些同学真的能自我控制能力哦!接下来我们还将这几道“防火墙”编成了儿歌呢!你听,还朗朗上口呢:
你拍一,我拍一,上网之前任务明; 你拍二,我拍二,上网之前定时间; 你拍三,我拍三,时间一到就叫停; 你拍四,我拍四,父母监督来提醒; 你拍五,我拍五,保护视力身体棒; 你拍六,我拍六,上网一定要节制!
老师对我们这堂课的表现很满意,多次奖励我们笑脸,还在信封里装了两份礼物呢!一份是一张精美的书签,老师建议我们将今天编的儿歌誊抄在书签上,时时提醒自己勉励自己;另一份礼物是一张表格,尽管不精美,但对我们很管用,可以借助它养成好习惯。课上完,有的同学就说以后不上网了。尽管,这只是一时的想法,因为学习的需要,我们还是会上网,但相信同学们能把握网络这把双刃剑,因为,我们已开始层层设防啦!
第四篇:单片机开发经验总结
单片机开发经验总结 单片机开发 2010-07-20 00:54:19 阅读77 评论0字号:大中小 订阅
1、与发光二极管串联的电阻(排阻)的计算和选取,一般发光二极管的正常发光的电流是3~10mA,在发光二极管上产生的压降是1.7
V(轨管)R=(5-1.7)/3~10(k)
2、单片机TTL电平高电平:+5V;低电平:0V。
RS232串口电平高电平:—12V ;低电平:+12V。可以通过MAX232电平转换芯片,转换之间的电平。
3、单片机上电IO口的寄存器为高电平,其余寄存器为低电平。
4、三极管的开关作用:在B、E间接正向电压,E、C是导通的。
5、蜂鸣器:
1)有源蜂鸣器直接接上额定电压就可以连续发声。
2)无源蜂鸣器和电磁扬声器一样,需要接在音频输出电路中才能发声。
3)有源蜂鸣器带振荡源,无源的不带。
4)有源蜂鸣器的理想信号是直流电。
5)无源蜂鸣器的理想信号为方波信号。
方波发声函数:void beep()
{fmq=0;
delay 500us();
fmq=1;
delay 500us();
}
6、计算单片机指令周期:
指令周期(us)=12 /晶振频率(Mhz)
选用12M的晶振,一个指令周期为1us7、89C51的芯片最高支持24M的晶振
目前介绍单片机应用的文章很多,但介绍单片机开发工具制作的文章却较少。由于单片机是一门实践性很强的课程,如果采用传统的开发模式,则要购买价格昂贵的仿真器、编程器等开发工具来作实验。其实由于芯片功能的日益完善,我们可以利用芯片的在系统编程(ISP)功能制作出实用而低价的开发工具。本文旨在帮助DIY爱好者开发制作出适合自己的开发工具。
1当前常用开发模式
目前,基本上有两种开发模式可供选择:用仿真器、用编程器。
①用仿真器。优点:方便,可以设置断点,可以观察存储器及寄存器的内容。缺点:价格昂贵,不同类型的单片机要购买不同的仿真器;仿真器终究不是单片机,有时代码在仿真器上能通过,但在单片机中不能正常工作,反而增加了调试的难度。
②用编程器。优点:价格相对便宜,通常一款编程器可编程多种器件。缺点:操作相当不便,每次要将芯片在目标板与编程器之间转移,并且还要在编译操作界面与编程器操作界面之间切换,大部分时间在做简单的重复工作。
2新的开发模式介绍及芯片选择
本文介绍的开发工具采用一种新的开发模式(类似于编程器开发模式)。由于利用了芯片的在系统编程功能,因此不需要移动芯片。在软件设计时设计成:一旦代码文件被重新编过,即自动下载到芯片,并自动复位运行,是真正的“所编即所得”。
目前很多单片机都支持在系统编程。8051系列单片机支持在系统编程的也很多,但大多数是支持通过PC机的串口对单片机进行编程。这样有四个不方便的地方:一是项目本身与PC机串行通信不方便;二是要增加1片MAX232电平转换芯片;三是有的芯片要按特定的步骤进入下载模式,编程过程需要手工干预;四是有的芯片需要固件(定制的程序)的支持,如果不小心损坏了固件,则芯片的在系统编程功能也没有了。
经过比较,Atmel公司生产的AT89S8252是一种比较理想的芯片,适合制作开发工具。此芯片有如下特点:
◆ 与8051兼容;
◆ 内含8KB可擦写1000次的程序存储器,2KB可擦写超过100 000次的数据存储器及256字节8位宽内部RAM;
◆ 可通过SPI接口在系统串行编程,与8051兼容
◆ 串行编程时有自动擦写周期,在调试大程序时可以分段下载,节约时间;
◆ 低电压下载,无需12V编程电压。
3AT89S8252串行编程
(1)AT89S8252串行编程模式
当芯片的RST引脚置高电平时,所有程序和数据存储器可以通过SPI总线接口[SCK,MOSI(input),MISO(output)]编程。RST变高以后,在编程或擦除操作之前必须首先发送一条编程允许命令。在串行编程模式下,芯片会在字节编程之前自动插入一个擦除周期。因此,除非芯片的代码保护位被编程,编程之前不需要执行全片擦除命令。SPI接口之SCK时钟频率须低于晶振频率的1/40。
(2)AT89S8252串行编程步骤
①在XTAL1与XTAL2之间连接一个3~24MHz的晶振;在VCC与GND之前加上电源电压,将RST置高,等待10ms。
②发送串行编程允许命令。
③发送写/读/擦除等命令及数据,串行数据高位在前,低位在后,数据在时钟的上升沿锁定。④如果上一步是写命令,至少等待2.5ms。
⑤需要时重复③、④两步。
⑥将RST置低,芯片开始运行。
(3)AT89S8252串行编程命令
AT89S8252串行编程命令如表1所列。
表
(4)AT89S8252串行编程时序图
AT89S8252串行编程时序如图1所示。
图
14硬件设计
①通过计算机并口与单片机SPI口连接;
②为了保护计算机并口,需要增加1片74HC244作为隔离。
实用的原理图如图2所示。(已经过实践检验,可放心使用。)
图
25用VB编程进行并口控制
打印端口的基地址一般为0x278、0x378或0x3BC,可以从控制面板中查到。为了方便读者,表2列出了常用打印端口引脚及寄存器位元的说明。
表
在Windows环境下最简单易学的语言恐怕非VB莫属,所以我们的开发工具也选用VB作为编程语言。但由于Windows的保护,VB无法直接读写打印端口,因此我们需要另外的程序模块来实现打印端口的直接读写。在Internet网上可以找到许多此类模块,并且相当多的模块可以免费使用。经过试用,笔者推荐使用Winio v2.0。该模块支持Win9X/NT/2000/XP(http:// Yariv Kaplan),并且带有详细的帮助、例子程序及源码。使用时,将Winio.sys、Winio.dll、Winio.vxd
及Winio.bas四个文件拷贝到工作目录下,在VB中直接添加Winio.bas模块即可。本例中用到的函数有四个,分别说明如下。
①Initialize():允许端口控制函数。在使用端口输入输出函数之前调用一次,成功返回“1”,失败返回“0”。
②Shutdown():关闭端口控制函数。在退出程序时执行一次,成功返回“1”,失败返回“0”。③GetPortVal(ByVal PortAddr As Integer, ByRef Portval As Long, ByVal bSize As Byte)As Boolean:读取端口函数,PortAddr 为端口地址, Portval为端口值,bSize为要读取的字节数。读取成功时返回“1”,失败时返回“0”。
④SetPortVal(ByVal PortAddr As Integer, ByVal Portval As Long, ByVal bSize As Byte)As Boolean:写端口函数。PortAddr 为端口地址, Portval为要写的值,bSize为要写入的字节数。写入成功返回“1”,失败返回“0”。
四个函数在Winio.bas模块中的声明如下:
Declare Function InitializeWinIo Lib “WinIo.dll”()As Boolean
Declare Function ShutdownWinIo Lib “WinIo.dll”()As Boolean
Declare Function GetPortVal Lib “WinIo.dll”(ByVal PortAddr As Integer, ByRef Portval As Long, ByVal bSize As Byte)As Boolean
Declare Function SetPortVal Lib “WinIo.dll”(ByVal PortAddr As Integer, ByVal Portval As Long, ByVal bSize As Byte)As Boolean
6Intel HEX 格式文件
由于一般编译软件产生的用于写入芯片的文件都是Intel HEX格式的文件。Intel HEX文件属于文本文件,可以用记事本查看。一个Intel HEX文件的一行称为一个记录,每个记录都是由十六进制字符组成的,两个字符表示一个字节的值。Intel HEX文件通常由若干条记录组成,每个记录都具有如下的形式:
:LLAAAATTDD...DDCC
“:”——记录的起始标志;
LL——记录长度,表示该记录中的数据字节数;
AAAA——数据装入的首地址(16位);
TT——记录类型,00表示数据记录,01表示文件结束;(注意:有的编译软件会产生大于01的记录类型,本应用中对大于01记录类型的记录忽略掉即可。)
DD——数据值(字节);
CC——校验和。(将其本身与记录中除起始标志外的所有字节相加应为0,不为0则有错。)
VB编程详细说明见本刊网络补充版(http://.cn)。(由于各子程序的流程都较简单,所以直接给出源码,而未画出流程图。程序采用由底至顶的设计方法。)
结语
虽然上述程序能实现各种基本的功能,但并不完善,并未考虑各种异常情况,读者可根据实际情况进行完善。编程功力较差的朋友可直接到笔者的网站(http: //)下载相对较完善的应用程序。如果充分理解了上述程序,那么DIY一个AVR或PIC单片机的开发工具也非难事。在笔者的网站也有制作完成的“MCS51/AVR/PIC三合一下载器资料”供爱好者下载。
由于AT89S8252的价格还是较贵,所以现在市场上较难买,不过Atmel公司推出的替代
AT89C51/52的AT89S51/52也有在系统编程功能,且价格便宜。其在系统编程的实现方法与
AT89S8252类似,对本例部分程序稍作修改即可支持该器件。笔者制作的“MCS51/AVR/PIC三合一下载器”增加了对AT89S51/52的支持。
文章来源:http:///wz_17380.htmPowerd by laogu
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
再来几点:
先从最简单的AT89C5X(51,52,55等等)说起吧,做这个的时间最长,知道的可能多些,书本上的东西这里我不多说,主要谈些实际应用中的经验与教训。书可以参看北航出的一本专门讲AT89系列的,还不错,建议大家购买。
AT89C51我认为是一个非常标准的51单片机了,4个P口,1个串口,RAM只有标准的128Byte,Flash也只有4K,功能还算齐全,我就以它为基础,所以开发过程中遇到的问题吧。
第一个问题:复位源的问题
大家最常用的复位方式就是电阻加电容吧,AT89C51是高电平复位,这种方式不稳定,在产品调试时可以使用,因为在调试时我们一般使用了仿真器,而许多仿真器都会自己输出复位信号,而屏蔽掉目标板产生的复位信号,所以调试时复位信号是没有问题的,我们公司使用的是长沙菊阳的仿真器,用的是比较先进的技术,还算可以,仿真AT89系列的芯片一点问题没有,还很稳定的说。这里有一个非常重要的问题要说下,大家有时候会遇到这样的一个问题:自己的程序在仿真时运行一点问题也没有,但烧录后却不行了。结合我的经验有两种原因。一是时序可能变了,这个大家都知道,我不多说,还有一个原因就是复位信号的问题。具体情况如下:
(1)复位电路有问题,不能正常产生复位信号。因为调试时仿真器可能给你提供了复位信号,而脱离仿真器后就没有了;
(2)看门狗的问题。有些51芯片带有看门狗复位功能,如At89c55WD,当程序开启了看门狗后,有时候程序的初始化内容太多了,往往会产生了复位信号,特别是用C语言编程功能时,有时候虽然你明明在程序开始时某个地方关闭了看门狗,但程序依然会复位,这是因为C语言执行效率比汇编低,看似几行代码,有时候要很长时间的,所以在使用开门狗时一定要注意这个问题。而这个问题在使用仿真器时容易被忽视,因为即使你的程序里看门狗复位了,但是仿真器(菊阳仿真器可以开启/屏蔽这个功能)往往会屏蔽了这个复位信号,所以程序仍然会正常运行的。当你把程序烧好后再运行时,你却为发现刚调试好的程序却无法正常运行了,那是因为你的程序一直在不停复位了,注意用示波器观察RST脚可能看不到复位信号的,因为看门狗复位并不影响RST脚的电平。再一种情况就是芯片内部不带看门狗,但是电路中有CPU监控芯片的,它往往是可以提供复位信号的,而且是多种原因的复位信号,如果你发现上述情况,就可以用示波器查看RST脚看是否有电平变化。
所以建议大家做51产品开发时尽量使用CPU监控芯片,向X5045就是非常好用的,因为它还带有Eprom功能,这在很多场合使用的到的,也可以用MAX708等专用复位芯片了,既稳定又方便。
第五篇:项目开发经验总结
项目开发经验总结
本人做项目经理工作多年,感到做这个工作最要紧的就是要明白什么是因地制宜、因势利导,只有最合适的,没有什么叫对的,什么叫错的,项目经理最忌讳的就是完美主义倾向,尤其是做技术人员出身的,喜欢寻找标准答案,耽误了工作进度,也迷茫了自己。
项目开始阶段是一个最重要的阶段。项目经理在接手一个新项目的时候,首先要尽可能地多从各个方面了解项目的情况,如:
1.这个项目是什么项目,具体大概做什么事情,是谁提出来的,目的是解决什么问题。在国内很多客户都很不成熟的情况下,千万不要根据项目的名称望文生义地去想象项目的目标。一个名为“办公自动化”的项目很有可能在你进场以后一个月才发现客户其实需要的是一个计算机生产管理辅助信息系统系统。前期了解情况的工作越详细,后面的惊讶就越少,项目的风险就越小。
2.这个项目里牵涉哪些方面的人,如投资方、具体业务干系方、项目建成后的运营方、技术监督方等等,很多项目里除了业主单位的结构很复杂以外,还有一些其他单位也会牵涉进来,如项目监理公司、业主的行业主管机构等。项目经理需要了解每个方面的人对这个项目的看法和期望是什么。事先了解各个方面的看法和期望,可以让你在做项目碰到问题的时候,就每件事情分析哪些人会在什么方面支持你,哪些人会出于什么目的反对你,从而提前准备联合朋友去对抗敌人,让事情向你所希望的方向发展。没有永远的朋友,也没有永远的敌人,只有一致的利益,这句话作为项目经理是一定要记住的;
3.基本了解了客户的情况后,下面的事情就是了解自己公司各方面对这个项目的看法。
4.在做整体项目计划前,还要大致计算一下你手上的资源。首先是时间,现在市场竞争
激烈,往往很多项目要求在几乎不可能的时间范围里完成。对于这一点,你在做项目的风险控制计划的时候要充分考虑。其次是人员,根据项目预算和已往经验,大致计算一下未来的项目小组有多少种角色,每个角色目前公司是否有人,是否能完全归这个项目使用,是否需要另外招聘一些人员,招聘的准备工作要尽早启动。最后就是一些设备的准备,项目所需大件关键设备要尽早预定,以后不管发生设备等人还是人等设备的情况,浪费的都是你的时间;
5.现在是做项目说明书的时候了。一份好的项目说明书不仅将要做的事情描述得很清楚
7.明白了要做哪些事情和你手上的筹码以及你做这个项目的总体策略,现在是成立项目小组的时候了。很多项目经理都没有自己选择组员的权利,那么,就尽量发挥你的影响力去寻找那些你想要的人吧。成员的组成根据项目不同,相差较大,很难有什么具体要求,但是,一定要有精通客户业务的人,很多小项目里,这个人就是项目经理本人,大项目里会配
客户了,不知道自己要做什么,更不懂怎么做还要指手画脚的客户到处存在,但是要明白,是客户选择了你,而不是你选择了客户,有了客户你才有工资拿,心平气和一点吧;
8.如果你在一个部门时间做长了,对这些规则的运用觉得是一件理所应当的事情,但是,你现在面对的是多个部门甚至多个单位,不把沟通规则说清楚,你以后就会吃亏。下面的东西看起来无聊,其实还是很管用的:第一个是规定信息的流动方式和介质,是推还是拉。推的意思就是项目经理将主动发布信息,不管通过电话、邮件还是书面方式,保证将信息传达到每个人。这种情况适合小项目,人少;拉的意思就是项目经理就是一个类似web服务器,你自己需要什么信息就去问他。当然,没有项目经理把自己搞得那么累,他会用发布信息到公共介质的方式公布信息,简单的是白板,复杂一点的是项目的公共信息交互区,潜规则就是我发了你没去看就不要说我没告诉你。说这些看似很无聊,其实里面牵涉信息传达不完全的责任问题。当然,这些都是指一般的方式,而且不要绝对化,一般情况下,主动沟通和被动访问是同时存在的,尤其是对领导,项目经理更加应该主动去和领导沟通。第二个问题就是文档问题,很多人怕写文档,但是项目经理一定要牢记“好记性不如烂笔头”的道理。有理所以项目经理开始就要和客户说清楚有些共识的东西,比如会议纪要,甚至领导的讲话记录,都要写成文档,双方签字,这样以后扯皮的时候,就能做到有据可查。记住:说了的就和没说一样,只有写下来大家签字后才算真正发生了的。还有一些问题,比如你提交的报告,给领导(包括本方领导和客户领导)做一个选择题,结果领导压住不批,让你无所适从,结果拖延了进度。这时候,你可以等,但是注意要留记录,标明是谁的责任;另外,如果你在开始阶段就和领导商定:如果批示提交
三天后没有得到领导答复就算对方同意,这样你就会主动很多。再比如不同事件的审批流程问题:什么等级的事情记录在项目日志里、什么等级的事情要双方项目经理专门签署备忘录、什么等级的事情要双方领导出面签署合同附件等等。事先想得越周到,以后的工作就越主动。
9.定义了一些游戏规则,现在是坐下来做计划的时候了。这一节,首先是找几个关键组员,比如客户业务专家、系统分析员等等,做一下项目模块划分工作。项目分成几块去做,每一块完成什么,模块之间的信息如何交换等等。需求定义的是做什么
每件事情需要什么资源,他们之间的前后关系如何,消耗的时间有多长,完成后有什么标志等。所有的结果最后用一个叫做甘特图的形式表现出来。你做完这个表以后会惊奇地发现,甘特图上项目的结束时间会远远落后于你的计划结束时间(签合同的人永远不会先征求你的意见的)。当然,学过项目管理的人会大谈什么WBS、优化路径之类的东西,但是我的经验是你再优化也不可能把这些东西安排到计划的时间结束。如果你没碰到这个问题,在我恭喜你挑了一个轻松活之前,请你再去确认你是否罗列了所有要做的事情和正确评估了他们所需要的时间。这时候,你就要考虑牺牲一些任务的时间(也意味着质量)了。按照什么标准牺牲?这个项目的战略!我们在第三节提到过的战略。我的经验是如果你什么都赶进度,其结果可能就是十件事情你一件也没做好,想想多么失败啊。所以,把资源投到你熟悉和有把握的事情上,最后的结果是十件事情,你有三件做成了精品,三件完成,还有四件因为某些原因延误,成绩单是否靓丽了很多呢?战略决定优先级,而正确排列事情的优先级是一个项目经理能力的主要体现。
现在项目已经完成了前期工作,了解了项目的目标、搞清楚了手上的资源,制定了项目的策略,然后编制了项目的整体计划,项目进入实施阶段。进入这个阶段反而是项目经理比较空闲的时候,不像前期的时候项目经理要象记者一样到处和不同的人接触,搞清楚他们在说什么,努力猜测他们在想什么和他们的真正目的,那才是最累人的事情。当然,小项目的项目经理往往自己也是一个资源,要做很多事情,这时候反而比谁都苦。项目经理这段时间的主要工作是保持和客户领导以及自己领导的沟通。和客户领导沟通时特别要注意,除非你需要对方给你支持,那么你才需要讲得具体一点,否则,告诉他一切正常就可以了,而且态度要积极一些,千万不要说一些领导不懂的细节,比如:“王局长,最近项目进度还算正常,就是JVM经常发生一些内存泄漏的情况…”
项目经验总结(2)
前阵子负责一个接口项目的开发,虽然技术上没有太大问题,但过程并不顺利。现在总结一下经验上的不足:
一是,前期没有明确的分析文档、用例图和活动图,为了让快点看到成果,只凭着简单的需求文档进行开发。
二是,中期没有补上缺失的文档,而是在原来代码上修修补补,最后由于变化很大,所以基本上完全重构。
三是,给潜在客户的文档不明确方向,技术上太细致化,而且没有一个明确的世界观,不能在一个比较高的层面上表现接口的功能。
四是,接口散乱,没有统一的中心流程,虽然可以用,却经常走入死胡同。建议: