内容算抄袭吗是介绍单片机端口方式几个端口的

本文可以说是在我之前写的基础仩增加了一些协议代码来实现具体UDP通信传输在这里我重新强调一下,上篇文章是在介绍如何调硬件目的是为了让应用程序可以使用这個芯片。而具体的使用就是使用三个函数:初始化、数据包发送和数据包接收数据包接收是否基于中断还需要用户根据需要自行设置。總之我们可以通过上篇文章了解到,对硬件的调试可以得到这三个有用的函数

不同网卡芯片的驱动可能略有不同。这里不一一例举所以首先需要说明的是,本文所讲的内容主要是如何用C代码来实现协议并利用数据包发送、接收函数来实现通讯,基本是与硬件无关的除中断外,本文唯一与硬件相关的地方就是大端或小端格式这也在之前的文章中有提到过,在本文涉及到的地方会再次说明也就是說使用不同网卡芯片都可以应用本文所写的代码。其次本文所写出的协议部分是已经过简化的,代码较少不需要操作系统支持。但仅能实现数据的收发而且没有验证可靠性(需要时可自行验证)。适合用在资源有限的单片机端口方式系统中或者需要用网络代替RS232通信嘚情况,当然也可以在操作系统中使用可根据情况来选择或增减。

    顺便提一下资源要求:ram最好大于2KB实在不行也得要1KB(需要一定技巧,傳输的数据内容很少不需要全部读出数据包的情况);flash或rom4KB以上,基本的单片机端口方式都能达到;可用IO怎么也得有12个控制个一般的芯爿也需要这么多的。

    在进行正文之前我再啰嗦几句,本文是讲协议的实现这里的协议部分可以从《TCP/IP协议 第一卷 —— 协议》这本书中看箌最详细最权威的讲解,如果有兴趣研究协议的话可以参考这本书(网上可以找到电子版的)下面进入主题。

    涉及到协议部分很多人會感觉摸不清头绪,不知如何下手所以看一看上面说的那本书还是很有帮助的。当然看了以下部分你也会对协议有些了解的。

    (1)初始化网卡芯片和其他外设(在网卡驱动部分已经做好了这里重新说了一遍);

    看到这会不会有些失望呢,可实际上udp通讯就是这么简单的

    UDP是User Datagram Protocol的简称,中文名是用户数据包协议是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务(这句话是在網上抄的)

说的再简单点,udp通讯与RS232一样只管将数据发送出去而不管对方是否正确的接收到了。在一些简单应用中我们似乎也不大关惢数据是否被对方正确的接收到了,因为传输过程中数据包损坏的情况也不多肯定能被正确的接收到。或者我们有其他的办法去验证這和TCP协议不一样,TCP协议是可靠的链接发送一次数据需要三次握手来反复确认数据被正确无误的接收到了,否则会重新发送一遍实现起來比较繁琐。有点跑题不过看到这里应该可以明白udp协议是一种很简单的网络通讯协议。

    简单解释一下上面三个过程初始化不用解释了。ARP通讯是整个网络传输的开始而且只需要运行一次。在《单片机端口方式驱动DM9000网卡芯片(详细调试过程)【下】》最后的部分已经讲清楚了主要是解释第三条,udp通讯收发数据

OSI参考模型中arp协议属于链路层(最底层),ip协议比arp协议高一层属于网络层(这一层还包括icmp和igmp协议)在往上一层是运输层,包括tcp协议和udp协议但是按我的理解,从数据包格式的角度看我把arp协议与ip协议放在同一级别,我们接收到的数據包中的前几十个字节用来判断是arp协议还是ip协议也就是说这两个协议是互补相容的(下面程序中会做个过滤,数据包只接收arp或ip协议最後处理的数据包中只能是arp协议或者是ip协议)。这种互补相容的协议同样也适用于tcp协议和udp协议上既然有互不相容的协议,那么也就有相容嘚协议了这种相容的协议就是指一个协议必须依赖于另一种协议才能实现,udp协议就是这样我们可以这样理解,ip协议就像一件外套udp协議好比一件衬衫,而真正的数据可以看做是穿衣服的人穿衣服的人先穿上衬衫再穿外套,这两个协议之间的关系就是这样:udp协议将数据包起来ip协议又将udp协议连同其中的数据一起包起来。也就是说实际的数据经过udp协议的包装,在经过ip协议的包装之后才能发送出去虽然看起来有些繁琐,但实际计算机端就是这样识别数据的所谓的包装就是在被包装数据前加上一小段首部数据,一般几十个字节左右

    这蔀分内容在《单片机端口方式驱动DM9000网卡芯片(详细调试过程)【下】》的后半部分已经讲过,这里为了完整性再重复一次

    在写所有协议の前,有些全局变量需要事先设定一下如ip地址、mac地址等信息。另外统一规定一下我们的单片机端口方式系统为“基板”,计算机端为“上位机”以下叫起来方便。再规定一下:char型是8位short型是16位,long型是32位OK!

    这部分是全局变量,需要在所有函数之前定义

    接下来是arp协议嘚代码,具体含义在前一篇文章中有这里对arp实现原理不做详细介绍了。另外本文认为数据包发送和接收函数已经像前篇文章中那样写恏了:


/*注意!这里涉及到大端格式和小端格式问题,小端格式需要写成0x0608也就是16位的高低两个字节转换一下,这个很重要一定要弄清楚洎己处理器的编译器的存储格式。我记得51、AVR等单片机端口方式的编译器是小端格式所以要高低字节交换。我这里和下面的程序中都按大端格式写*/


    ip协议用途很重要但对于本文仅使用udp协议来说,它只是用于装载udp协议的

    首先,定义ip协议的首部结构体和一些必要的全局变量

從这个首部看,ip协议首部结构体包含34个字节其中ip首部有20个字节。根据首部可以确定一些信息比如ip包中转载的是什么协议、ip地址、ip长度等。ip协议与arp协议的一个不同点是ip协议中包含了一个首部校验和。这样的校验和在其他协议中也都有而且计算方法也相同。校验和的作鼡是判断该协议被校验和检验过的区域(ip协议只检验首部的20个字节)是否正确进而判断该数据包是否损坏。关于这个校验和的操作有些芯片内部可以自动计算出来,有些却不能为了统一,稍后会介绍校验和的计算方法

    本文所涉及的ip协议除了装载其他协议外,没有其怹用途因此也并无很复杂的原理。接下来继续介绍涉及到ip协议的函数这里再加一些宏和变量:

/*这是一个全局变量,可以看做是个发送ip協议包的计数器专门用来填充ip协议首部结构体中的ipid成员*/

    接下来会完成两个函数,ip协议处理函数和ip协议数据包发送函数前者用来完成ip协議的数据包分析和处理,后者用来发送一个ip协议数据包具体函数如下:


//我们仅做了以上两个简单判断,其实可以做更详细判断但这些巳经足够了

/*这里将接收到的完整数据包长度减掉20字节ip协议首部和14字节以太网首部,剩余字节数作为ip协议中数据内容的字节数*/


len += 34;//更新数据包长喥增加ip首部和以太网首部共34字节

注释:值得注意的是,在这个函数中要发送的数据包长度我用了传递参数的办法。而之前我又用了个铨局变量来存放要发送的数据包长度arp协议的实现,我使用了全局变量来传递要发送的数据包长度其实这两个办法都可行,由于这两个函数我不是在同一个时间写的实现方法上有些不同,现在看来是有点冗余大家可以根据自己的书写习惯选择其中的一种方法,我就不茬这里修改程序了*******************************************/

    由于这里ip协议仅仅用于装载udp协议,所以暂时没有办法发包来验证

    上节ip协议中提到过校验和的概念,并且用到了一个函数“ip_chksum()”下面简单介绍一下校验和及其实现方法。

校验和机制是一种检验数据包完整性的方法也就是查看一下接收到的包是否坏损(數据出错)。其原理也比较简单在发送数据包时,将校验和计算的结果放上在指定位置上数据包发送到接收端后,接收端在发送端检驗和的基础上再进行一次检验和的计算,如果结果全“0”则表示正确,否则表示数据包已经损坏(一般损坏的数据包就直接丢弃了)

校验和采用一种很巧妙且简单的数学方法进行计算,使发送端和接收端校验和的计算方法相同而且根据计算结果可以正确判断数据包Φ被校验的数据区域是否有损坏(但不能确定是哪个数据是损坏的)。计算方法如下:校验和占用16位(2字节)首先,以0x0000为起始将待被验證的数据以16位宽依次取出与之相加如果溢出就将结果再加1。依次累加下去直到完成所有数据的检验如果数据是奇数个字节(即最后一位数据不是16位宽,只有8位)那么将此数据扩展到16位宽(高8位填充0)后再相加这样就得到了一个基本的校验和结果。最后将此结果取反後便得到最终可用的校验和了。说了这么多用一句最简单的话概括:数据求和后取反(或数据取反后求和)。

    下面看一下具体函数校驗和通过两部分函数组成,求和函数和取反函数求和函数做通用校验用,取反函数被各个协议调用:

// UDP首部和数据部分校验和计算

// UDP伪首部校验和计算

udp协议的校验和计算似乎比较复杂首先,udp协议校验和计算覆盖udp首部和udp数据(tcp协议也一样)这与ip协议的校验和不同,但计算方法相同其次,udp协议(和tcp协议)的校验和还要包含一个12字节的“伪首部”伪首部包括:32位源ip地址、32位目的ip地址、8位0、8位协议(udp为17)和16位嘚udp长度(首部加数据的字节数)。这个伪首部在数据包内并不是真实存在的仅仅是在计算校验和时参与计算而已。关于udp的伪首部及其校驗和的实现就简单介绍到这这一部分即使没有看懂也没关系,因为udp校验和是可选的在80年代以后,计算机厂商在默认条件下关闭了udp校验囷的功能以提高udp协议的速度。对于我们来说更可以避免这种繁琐的校验计算来提高发送和接收数据包的速度。当然为了保证数据的准确性,你也可以按上面方法计算需要注意的是,tcp协议的校验和是必选的不可以省略。

其中后两个函数是我们需要在各自协议中用到嘚在ip协议部分用到了ip_chksum函数。这两个函数是这样使用的:发送数据包时首先将需要校验的部分填写好,再将校验和的位置填充0调用该協议的校验和函数并将返回结果填充在校验和的位置;接收数据包时,直接调用函数校验该协议如果函数返回“0x0000”表示校验成功,否则表示数据损坏

    值得注意的是,我们在发送和接收数据包的时候都要进行校验和的计算但用到的函数都是同一个。我想看到这里大家腦袋里会有许多问号,用这个函数计算的校验和到底是个什么结果呢为什么发送和接收都用同一个函数就能完成呢?

我先来解释一下用這个函数所产生的结果及其原理发送数据包时,将校验和位置0后在利用函数校验会得到一个16位宽的校验和数据(数值本身看不出有任哬意义)。当接收端再用相同的算法重新计算一遍这些相同的数据后神奇的是,如果数据完好结果会是全0否则得不到全0结果。至于为什么我觉得从数学角度看,通过一堆推导可以验证这一结论的我们就当这是定理好了。如果好奇你可以自己找一些数来手动算一下。

    上面所讲的校验和计算函数“chksum()”是个通用函数其它协议也可以根据自己的规则来调用它。这里为了简单我只给出udp协议的校验和函数。

    好像说了很多铺垫才刚刚进入主题如果大家觉得arp协议有点复杂,ip协议也不简单那么你会发现udp协议要简单得多!

    与之前一样,为udp协议萣义一些全局变量和结构体等

udp协议首部长度仅有8个字节,分4个部分且均以16位宽对齐。其中udp协议涉及到了端口的概念,我简单解释一丅端口的作用我们知道通过ip地址可以确定是哪个网卡在工作(或者说是哪个计算机在工作),而端口表示在某个ip地址里哪一个软件在工莋也就是说端口是软件的地址。TCP/IP协议中有个“插口”的概念这个插口就是指由“ip地址:端口”所组成的联合地址,它可以确定所接收箌的数据包是哪个计算机里的哪个软件发过来的也就是说“插口”这种地址可以精确到正在运行的软件。端口是由16位宽的数值组成的茬网络中有规定,哪个端口号代表着什么意思当然,大部分的端口号是公开的可以在自己的软件中使用。其实在非操作系统环境下,这个端口的作用并不大我们一般不大关心到底是那个软件在给我们发数据,因为正常情况下都是唯一的一个软件在给我们发数据如果一台计算机里有多个软件可以给我们发数据,这个端口就有意义了这里我们用下面的全局变量来表示端口号,初始化为0方便更改。

    唍成以上定义和声明我们开始写udp协议代码,并验证

    发送udp数据包代码很简单吧,只要填充好udp首部即可当然,ip包发送函数也要正确下媔写个简单的main函数验证一下。

关于以下调试过程的注释:调试程序我习惯于用上串口可以很方便的在上位机上显示调试信息,所我在main函數里加上个几个串口相关函数这些函数仅仅用于调试,而且与处理器相关用到时我只给出函数用途而不在写代码了。另外上面提到嘚对芯片初始化等操作,在main函数里省略了这里只挑选最关键的代码来验证。需要定义的宏和全局变量在上面已经提到过,main函数里也不茬重复

上面main函数利用udp发送了四个数。实际上main函数的作用就是将要发送的数据放到发送数据的缓存中并且指定好数据部分的长度,真正發送数据包的工作都是由前面讲到的函数来完成的至于如何把数据放到缓存和放多少数据是由自己的程序决定的。为了简单易懂我直接向发送数据缓存中填写了四个数值。

    这里向大家推荐个软件“IRIS”用于网络调试可以很方便的查看所有经过网卡的数据包,我们利用这個工具查看我们发出的数据包如图1所示:

图1 验证发送udp数据包

PS:请不要问我要这个软件,因为这是收费的软件我也是试用的,不过用这個软件查看数据包很方便需要的话还是自己想办法吧。

图中在“capture”栏中的右上部分是接收到的数据包(我只过滤了基板收发的数据包)共显示三个,依次是基板发出的arp请求、上位机发出的arp应答和基板发出的包含四个数据的udp包这与我们所写的main函数中的顺序是一致的。在“capture”栏中左半部分是当前选中数据包的解析我选中的是第三个udp数据包,可以看到解析出的数据包结构:mac首部、ip首部、udp首部和4字节数据這样便可以验证我们发送的udp数据包是没有错误的。另外在红圈处我们看到udp校验和,这与ip的校验和表示的不同我们看ip首部中校验和部分後面注释了一个“correct”标记表示校验正确,但udp的校验和没有这个标记这并不是说udp校验和计算错误了,而是说上位机没有对udp校验和做验证吔就验证了udp校验和是可选的,在默认情况下是关闭的

}

请问RC522怎么和单片机端口方式相连引脚随便接哪个端口都可以吗?图片上的有点不懂什么SDA数据接口的,是SDA这个接口和数据接口相接什么意思,不是很懂。


}

我要回帖

更多关于 单片机端口方式 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信