S
selonboy
Unregistered / Unconfirmed
GUEST, unregistred user!
[?]通过RS232串口发送控制信号到“画中画处理器”,[blue]难点在如何计算CRC-16数值[/blue],请高手帮忙解答,附资料如下:
*************************************
1.1 字格式
RSC电气连接同RS-232标准,采用的RS-232参数如下:通讯速度: 9.6kbps,38.4kbps,115.2kpbs;Data bits: 8;Start bit: 1;Stop bit: 1;Parity bit: No。不采用 XON/XOFF,RTS/CTS等流控制信号.
位的序列为:
起始位 1 2 3 4 5 6 7 8 停止位
1.2 信息帧结构
RSC的通讯以信息帧为最小单位。RSC支持二进制格式的数据传输,二进制信息帧标准结构为:
初始结构 ≥4字节的时间
地址码 1字节 (地址域)
功能码 1字节 (功能域)
数据区 N字节 (数据域)
错误校验 16位CRC码 (错误检测域)
结束结构 ≥4字节的时间
信息开始传送时至少需要3.5个字符的静止时间,依据使用的波特率,很容易计算这个静止时间。发送完最后一个字符后,也有一个至少3.5个字符的静止时间,然后才能发送一个新的信息。网络上的设备连续监测网络上的信息,包括静止时间。
*地址域
可能的设备地址是1-247,0是广播地址。主设备通过将要联络的从设备的地址放入地址域来选通从设备。从设备回应消息时,将自己的地址放入回应的地址域当中,告知主设备是哪个从设备作出回应。
*功能域
功能域告知从设备执行那些行为。从设备回应时,对正常回应仅功能代码。对异常回应则将最高位置为1。
*数据域
数据域定义了十六进制数集合,范围00…FF。
主设备到从设备的数据域包含附加的信息,规定了从设备执行由功能代码所定义的功能的具体行为。例如主设备要读取一组从设备的保持寄存器(功能代码03),数据域指定了起始寄存器以及要读的寄存器数量。
*错误检测域
错误检测域包含一16bits值,其值是对消息的内容进行循环冗长检测方法(CRC)得出。CRC域添加在整个消息的最后,添加时先是低字节然后是高字节。
≒≒≒≒≒≒≒≒ []最关键的信息来了!≒≒≒≒≒≒≒≒
[red]1.3 CRC-16的实现
1.3.1 生成CRC-16校验字的步骤:
(1) 装入一个全1的16位寄存器
(2)该寄存器的低位字节与开始的8位字节“异或”,结果放入该16位寄存器
(3)将该16位寄存器右移一位
(4)若右移出的位的位值是1,则多项式10100000 00000001和移后的寄存器“异或”;若右移出的位值是0,则返回(3)。
(5)重复(3)和(4),直至移出8位。
(6)接下来的8位字节与该寄存器“异或”
(7)重复(3)~(6),直至该消息(报文)所有的字节均与16位寄存器进行了“异或”且移位8次。
(8)该16位寄存器的内容即2字节CRC错误校验,被加到报文的最后。添加时先是低字节后是高字节,故CRC的高位字节是发送消息的最后一个字节。
1.3.2 接收设备的CRC-16处理:
接收信息的设备将接收到的所有信息(含CRC码)重新计算CRC码,并判断该CRC码是否为0,如果为0,表示接收的信息帧正确无误,否则,则表明接收的信息帧有误,在进行CRC计算时只用8个数据位,起始位及停止位都不参与CRC计算。
例如:
对1号机的按键操作:
进入主菜单:0x01 0x41 0xFC 0x10 0x11
按MODE/MENU 键:0x01 0x41 0xFE 0x91 0xD0
按ESC/PIP HIDE键: 0x01 0x41 0xFD 0xD1 0xd1[/red]
......
≒≒≒≒≒≒≒≒ 最关键的信息结束 ≒≒≒≒≒≒≒≒
苦思半响仍不得其解,渴望有高人指点迷津(最好是写个函数计算过程,我用Delphi),不胜感激!
300分放在这儿了...
*************************************
1.1 字格式
RSC电气连接同RS-232标准,采用的RS-232参数如下:通讯速度: 9.6kbps,38.4kbps,115.2kpbs;Data bits: 8;Start bit: 1;Stop bit: 1;Parity bit: No。不采用 XON/XOFF,RTS/CTS等流控制信号.
位的序列为:
起始位 1 2 3 4 5 6 7 8 停止位
1.2 信息帧结构
RSC的通讯以信息帧为最小单位。RSC支持二进制格式的数据传输,二进制信息帧标准结构为:
初始结构 ≥4字节的时间
地址码 1字节 (地址域)
功能码 1字节 (功能域)
数据区 N字节 (数据域)
错误校验 16位CRC码 (错误检测域)
结束结构 ≥4字节的时间
信息开始传送时至少需要3.5个字符的静止时间,依据使用的波特率,很容易计算这个静止时间。发送完最后一个字符后,也有一个至少3.5个字符的静止时间,然后才能发送一个新的信息。网络上的设备连续监测网络上的信息,包括静止时间。
*地址域
可能的设备地址是1-247,0是广播地址。主设备通过将要联络的从设备的地址放入地址域来选通从设备。从设备回应消息时,将自己的地址放入回应的地址域当中,告知主设备是哪个从设备作出回应。
*功能域
功能域告知从设备执行那些行为。从设备回应时,对正常回应仅功能代码。对异常回应则将最高位置为1。
*数据域
数据域定义了十六进制数集合,范围00…FF。
主设备到从设备的数据域包含附加的信息,规定了从设备执行由功能代码所定义的功能的具体行为。例如主设备要读取一组从设备的保持寄存器(功能代码03),数据域指定了起始寄存器以及要读的寄存器数量。
*错误检测域
错误检测域包含一16bits值,其值是对消息的内容进行循环冗长检测方法(CRC)得出。CRC域添加在整个消息的最后,添加时先是低字节然后是高字节。
≒≒≒≒≒≒≒≒ []最关键的信息来了!≒≒≒≒≒≒≒≒
[red]1.3 CRC-16的实现
1.3.1 生成CRC-16校验字的步骤:
(1) 装入一个全1的16位寄存器
(2)该寄存器的低位字节与开始的8位字节“异或”,结果放入该16位寄存器
(3)将该16位寄存器右移一位
(4)若右移出的位的位值是1,则多项式10100000 00000001和移后的寄存器“异或”;若右移出的位值是0,则返回(3)。
(5)重复(3)和(4),直至移出8位。
(6)接下来的8位字节与该寄存器“异或”
(7)重复(3)~(6),直至该消息(报文)所有的字节均与16位寄存器进行了“异或”且移位8次。
(8)该16位寄存器的内容即2字节CRC错误校验,被加到报文的最后。添加时先是低字节后是高字节,故CRC的高位字节是发送消息的最后一个字节。
1.3.2 接收设备的CRC-16处理:
接收信息的设备将接收到的所有信息(含CRC码)重新计算CRC码,并判断该CRC码是否为0,如果为0,表示接收的信息帧正确无误,否则,则表明接收的信息帧有误,在进行CRC计算时只用8个数据位,起始位及停止位都不参与CRC计算。
例如:
对1号机的按键操作:
进入主菜单:0x01 0x41 0xFC 0x10 0x11
按MODE/MENU 键:0x01 0x41 0xFE 0x91 0xD0
按ESC/PIP HIDE键: 0x01 0x41 0xFD 0xD1 0xd1[/red]
......
≒≒≒≒≒≒≒≒ 最关键的信息结束 ≒≒≒≒≒≒≒≒
苦思半响仍不得其解,渴望有高人指点迷津(最好是写个函数计算过程,我用Delphi),不胜感激!
300分放在这儿了...