吵吵   2014-06-27  阅读:3,916

关于COM口的数据传输的物理层我们不再研究了,什么九个针脚,那个针脚是数据接收,如何跳线等等,就不讲了。我们这一个系列只关注软件层面的东西,如果感兴趣,可以自己百度之。

接下来我们我们要讲COM口的数据链接层协议ASTME1381-02。

什么叫数据连接层,通俗来讲,数据连接层就是数据包,通过打包这些数据,保证这些数据能够完整的传输过去。传输过去后,再解包这些数据,使得它能够成为一个完整的数据。

如果你把这个理解为一个数据传输的框架,或者说是个快递包裹,你就会很容易的理解了。

为了送一次包裹,或者说发送一次数据,一般会包括这三个步骤:

1)建立连接。建立连接的实际上要解决两个问题,一个是谁是数据发送者,谁是数据接收者。二是,接收者到底忙不忙,有没有空来接收你发送的数据。

2)数据传输。当发送者和接收者都建立连接,准备就绪之后,数据传输要解决的问题是有多少数据的问题。例如快递员给了你一个包裹,再给你一个包裹,那到底什么时候给完我,否则我收到的包裹不齐全,就没有办法组成一个完整的物品了。

3)结束连接。当发送者已经没有数据发送的时候,就要告知接收者,你可以干其它的去了,咱两说拜拜了。

比喻是类似上述说的了,但是实际的传输过程,会有更多的细节机制,已保证数据能够有效到达。

一 建立连接。

数据发送者发送[ENQ]信号给接收者,告诉他,我要给你发数据了,你就准备接收吧。当接收者接收到了[ENQ]信号后,它有两种选择:

回复一个[ACK]信号,告诉你的小伙伴,我随时准备迎接你的礼物了!

你也可以回复一个[NAK]的信号,告诉那家伙,我很忙,没工夫搭理你。

回复[ACK]当然没啥问题,你们可以继续往下走,但是回复[NAK]呢?某天那个苦苦追寻的女神,告诉你“你是个好人!”,真的是伤心透了。但是世界上没有追不到的女神,只有不努力的屌丝,因此等过了10秒后,发送者就继续发送[ENQ]信号,直到女神回复[ACK]打止。

那么如果还有一种极端案例,发送者和接收者同时都发出[ENQ]怎么办呢?那没有办法,IPU是老大,你LIS接口要让着它,你LIS接口就啥都不做好了,等1秒后,IPU会继续给你发[ENQ]的!那么如果IPU给我传完了数据,我是不是可以发数据给他了?不行,因为前面你们撞车了,因为惹怒了IPU老大,你20秒后给它才气消了,再给他发[ENQ],他才接收你。

数据链接层

二 数据传输。

1)所有的数据的传输都需要按照它既定的框架来传输,这个框架是怎么样的呢?

[STX][F#][TEXT][ETX][CHK1][CHK2][CR][LF]

里面的TEXT就是我们要传输的内容了,内容是什么样的格式,就是表现层的内容了,我们下篇再说。

其它的符号代表什么意思呢?
[STX]:ASCII码为2,代表框架开始。
[F#]:框架的序号。为数字的0到7,从1开始一直到2,3,4,5,6,7,0。如果多于8个包怎么办呢,没有关系直接循环用就好了。这个序号有什么用呢,可以判断你收到的包是不是有重复,或者有丢包。
[ETX]:ASCII码为3,内容结束标志。
[CHK1][CHK2]:这个叫做校验和的高四位和低四位,说起来会比较复杂,就是将从[STX]一直到[ETX](包括ETX)的字符值相加,然后除以256取余,得到这个数后转成一个8位的byte。然后高4位就是[CHK1],第四位就是[CHK2]。比如01111010用十六进制表示为7A,则[CHK1] = ‘7’,[CHK2]= ‘A’。
[CR][LF]:ASCII码为13,10,框架结束标志。

说到这里,我们核心的东西还没有出来。封包最重要的一个用途就是要解决多个数据包的切割和重新组合的问题,以保证数据能够完整和顺序传输过去。

对于ASTM E1381-02协议来讲,每个包最大的字节数是64000 byte,除去那些框架的7个字节标志,其实内容部分最大值也就是63993了。那么当要传输的内容大于63993怎么办?例如我们要传输一个图片怎么办?

答曰,分割,将包按照63993给分割了。那么,接收者如何判断收到的数据是否传输完了呢?要看如上框架的[ETX]字段。假设有多个包的数据,那么第1到n-1个包[ETX]字段就不是[ETX]了,是[ETB](ASCII码为23),那么当你发现这个标志是[ETB]的时候,你就要继续收数据,直到标志变成了[ETX],说明你收到了最后一个包,那么将之前收到的数据一组合,就是完整数据了。

ASTM传输协议的复杂性并不在于它的数据结构,它的数据结构简单的7个标志,应该说是很简洁的。复杂的是它传输的应答机制,如果超时,将会被中断传输。当发送者发送了一个数据包后,接收着可以有以下反应:

A 发送[ACK],告诉发送者,我已经正确接收了,你可以继续发送或者结束了。

B 发送[NAK],告诉发送者,数据有问题或者我很忙。那么发送者会将上一次发送的包再发送出去,最多会尝试6次。

C 啥都不做。等15秒后,发送者不理你了,直接中断传输了。

三 结束传输。

结束传输很简单,发送[EOT](ASCII码为4)就可以了,那么代表这次的会话结束了,双方都回到空闲的状态,可以随时的收发数据了。

有一点要注意的是,因为IPU是老大,所以IPU处理LIS接口发给它的[EOT],它一律视为[ACK],例如LIS接收了一个包后,不想接收后面的包了,因此LIS发送[EOT]给IPU,但是对不起,IPU会视为[ACK],然后继续给你发数据!

好了,关于ASTM数据连接层的协议,我们今天就研究到这里了,不知道各位看懂了木有,有没有信心封装一个类出来?

吵吵微信朋友圈,请付款实名加入:

吵吵 吵吵

发表评论

电子邮件地址不会被公开。 必填项已用*标注