拿MODBUS举例 ,我们发送比如:
02 03 00 01 00 01 D5 F9 (RTU方式-奇校验)
↓ ↓ ↓ ↓ ↓
子站地址 功能码 起始寄存器地址 长度 CRC校验
这个功能是从子站02读0001存储区取0001个数据到主站,从站会返回一系列的数据依据一定格式到端口。
从站接收到的数据流是否应该是: (低位优先)
1...11 0 00000010 0 (hx:02)
1...11 0 00000011 1 (hx:03)
1...11 0 00000001 0 (hx:01)
1...11 0 00000000 1 (hx:00)
1...11 0 00000001 0 (hx:01)
1...11 0 00000000 1 (hx:00)
1...11 0 11010101 0 (hx:D5)
1...11 0 11111001 1 (hx:F9)
↓ ↓ ↓ ↓
停止 起始 数据 校验
不知对否???
1...11 0 00000010 0 (hx:02)
1...11 0 00000011 1 (hx:03)
1...11 0 00000001 0 (hx:01) 发送的数据明明是00,收到的怎变成01?
1...11 0 00000000 1 (hx:00) 发送的数据明明是01,收到的怎变成00?
1...11 0 00000001 0 (hx:01) 同上。
1...11 0 00000000 1 (hx:00) 同上。
1...11 0 11010101 0 (hx:D5)
1...11 0 11111001 1 (hx:F9)
以上图片中的含义是:在H01从机中,数据地址为H2102,读取H0002个字的数据。
按楼主的解释,需要把21 02进行前后颠倒,变成02 21后再发送,同样H00 02个字的数据,也需要进行前后颠倒,变成H02 00后再发送。
但以上的解释与说明书相矛盾?
以下内容是楼主在6层的解释,从楼主发送的内容来看,0001储存区及0001个数据都被颠倒了。
这个功能是从子站02读0001存储区取0001个数据到主站,从站会返回一系列的数据依据一定格式到端口。
1...11 0 00000010 0 (hx:02)
1...11 0 00000011 1 (hx:03)
1...11 0 00000001 0 (hx:01)
1...11 0 00000000 1 (hx:00)
1...11 0 00000001 0 (hx:01)
1...11 0 00000000 1 (hx:00)
1...11 0 11010101 0 (hx:D5)
1...11 0 11111001 1 (hx:F9)
在此有2个疑问:
1、如“RTU报文帧”所示,这个“必须以连续的字符流发送整个报文帧”究竟是指什么呢?是一次性发送完整个数据报文(地址码+功能码+数据区+错误校检),还是以每11位一个报文连续将整个数据(地址码/功能码/数据区/错误校检)发送完,帧内报文以【起始位 停止位】间隔,如间隔>1.5个字符,则该帧不正常,如间隔>3.5个字符之后还没有传输字符,则视为帧结束?
2、低位优先原则(包括数据位、CRC校验)如何实现?讨论实际“物理层”的位序列情况,而不是经“数据链路层”调整后的序列!(你所列举的例子的确是这样,但我觉得这是经处理后的顺序--高前低后,因为按照规范接收方事先就知道应该将后接收的放在高位)
我的理解,02 03 00 01 00 01 D5 F9 是否就按上面这样的数据流发出去?接收方接收到后,如果数据没有错误,去除起始位和校验位,将数据位存入缓冲区,这个仅仅是物理层做的,但MODBUS被接收后,数据链路层又将数据帧的各项进行计算,如果CRC一致,同时地址又同自己地址相同(为了减少接收处理时间,在接收到地址字段时,就可以分析地址字段,而不需要等到整个帧结束),则剥掉地址和校验部分,取有效的数据部分进行分析,再将请求的数据发送到端口。
不管是什么类型的通讯方式,只要是串行通讯(包括RS232,485,基于485的PROFIBUS总线,以太网等等) 在接收数据的时候都是差不多的(都是差不多),空闲的时候一直为1(也或者一直为0),先检测起始位,如果来了一个0,或者来了一个1,就认为是起始位的开始,然后下面的数位就认为是字节部分,等到字节部分结束,就自动检查字节中1的个数,跟接收过来的校验位做比较,如果和接收过来的校验位一致,就代表这个字节是正确的,如果不一样,就代表是错误的,(对于错误的处理,如何解决?如果说对于错误的数据都扔掉,那是不是会导致数据传输不到位?因为发送方根本不知道数据有没有准确无误的到达,如果联络发送方重新发送?)
补充一下“字节序”,方便理解为什么要规定“低位优先发送”。我猜是为了适应接收数据后在存储器中储存(对于我们常用的CPU架构,如Intel,AMD的CPU使用的都是小字节序,而例如Mac OS以前所使用的Power PC使用的便是大字节序(不过现在Mac OS也使用Intel的CPU了))。
http://www.cnblogs.com/JeffreyZhao/archive/2010/02/10/byte-order-and-related-library.html
突然间,有了新的假设,是否可这样理解:
楼主需要发送的数据为 00 01 ,其高字节就是00 ,低字节是01,根据MODBUS协议规定, 首先发送高字节,然后发送低字节。因此发送第一字节为:00,紧接着发送第二字节:01,因此楼主的传输次序不对。
至于MODBUS规定:高字节被储存到低地址,而低字节被储存到高地址是另一回事。因为不同的厂家有不同的规定,三菱规定:高字节被存到高地址,而西门子规定恰恰相反,高字节被存到低地址。
但无论如何,在传输时,你必须遵循MODBUS协议规定,也就是说,首先传输高字节,然后低字节,否则相互之间通讯,将无章可言。
对于各厂家自己的规定(高、低地址),本人认为:那是各厂家自己的事,此时你收到数据后,各品牌可按自己的标准,将高、低字节存到自己规定的位置上去。
综上所述,简而言之,就是两句话:传输就是传输,储存就是储存,完全是两回事,互不相干。
是否正确?望高手指正!