不管是什么类型的通讯方式,只要是串行通讯(包括RS232 , 485, 基于485的PROFIBUS总线,以太网等等) 在接收数据的时候都是差不多的(都是差不多),空闲的时候一直为1(也或者一直为0),先检测起始位,如果来了一个0,或者来了一个1,就认为是起始位的开始,然后下面的数位就认为是字节部分,
等到字节部分结束,就自动检查字节中1的个数,跟接收过来的校验位做比较,如果和接收过来的校验位一致,就代表这个字节是正确的,如果不一样,就代表是错误的,(对于错误的处理,如何解决?如果说对于错误的数据都扔掉,那是不是会导致数据传输不到位?因为发送方根本不知道数据有没有准确无误的到达,如果联络发送方重新发送?)
拿MODBUS举例 ,我们发送比如
则从串口发送出
这个功能是从从站读0001存储区取0001个数据到主服务器。从站会返回一系列的数据依据一定格式到端口。
从站接收到的数据流是否应该是:
我的理解,02 03 00 01 00 01 D5 F9 是否就按上面这样的数据流发出去?接收方接收到后,如果数据没有错误,去除起始位和校验位,将数据位存入缓冲区,这个仅仅是物理层做的,但MODBUS被接收后,数据链路层又将数据帧的各项进行计算,如果CRC一致,同时地址又同自己地址相同,则剥掉地址和校验部分,取有效的数据部分进行分析,再将请求的数据发送到端口。
而以太网拥有多层协议,从物理层到应用层,每层都有不同的协议,但我的理解以太网再复杂,协议再多,估计也跟上面的MODBUS协议差不多,从网卡接收到得是数据帧,网卡也是先接收比特位,去除停止,起始,校验,取数据,应该在数据帧中规定了数据帧的长度,否则,网卡不会知道数据什么时候结束。网卡等数据接收完后网卡取出来的数据后分析, (这个时候计算机并不知道已经接收到数据)如果发过来的MAC地址和自己的MAC地址一致,则表明是发送给自己的,则网卡会剥离MAC地址部分,通知CPU,
让CPU来接收已经被网卡剥离MAC地址的数据,这样就进入了网络层,网络层就判断是给哪个应用程序的,判断好后,剥离其IP地址和端口号,将数据给相应的应用程序,等应用程序接收到后,看以哪种格式来处理,比如HTTP则要以一种格式显示,而其他的应用程序估计要以其他格式显示。
总的理解,我觉得协议就是穿衣服和脱衣服的过程,在有用的数据前面加上标志,在一层一层的包装,等到接收的时候,再一层一层的卸装,得到有用的数据
这个只是我个人理解,肯定有不对的地方,希望大家讨论!