注意事项: 前导字节-一般在传输帧信息前,都要有0~4个FE不等,所以这里要注意,对于主站来说,直接发送4个FE作为前导字节即可。而从站回复,就不一定了,根据厂家不同而不同,有些没有FE的,也有4个FE的,所以对于接受程序,一定要慎重 传输次序-所有的数据项都是先传低字节,再传高字节,这里的数据项,主要涉及到地址域和数据域,因为其他都是1个字节 差错控制-通信偶校验 数据与传输运算方式:主站加0x33,从站减0x33(为嘛这么定义,可能是考虑BCD码吧) DL645-2007的地址域发送命令是AAAAAAAAAAAA,DL645-1997的地址域发送命令是999999999999 
 
1:DL645计算校验和的方法(字符串) package  com. example. modbusrtu. config ; public  class  DL645ChecksumCalculator  { public  static  void  main ( String [ ]  args)  { String  data2 =  "68 AA AA AA AA AA AA 68 11 04 33 33 34 33" ; System . out. println ( "Checksum for data2: "  +  calculateChecksum ( data2) ) ; } public  static  String  calculateChecksum ( String  hexData)  { String [ ]  hexArray =  hexData. split ( " " ) ; int [ ]  data =  new  int [ hexArray. length] ; for  ( int  i =  0 ;  i <  hexArray. length;  i++ )  { data[ i]  =  Integer . parseInt ( hexArray[ i] ,  16 ) ; } int  sum =  0 ; for  ( int  b :  data)  { sum +=  b; } int  checksum =  sum %  256 ; return  String . format ( "%02X" ,  checksum) ; } 
} 
1:DL645计算校验和的方法(byte数组) package  com. example. modbusrtu. config ; public  class  Dl645Checksum  { public  static  void  main ( String [ ]  args)  { byte [ ]  request =  new  byte [ ]  { ( byte )  0x68 ,  ( byte )  0xAA ,  ( byte )  0xAA ,  ( byte )  0xAA ,  ( byte )  0xAA ,  ( byte )  0xAA ,  ( byte )  0xAA ,  ( byte )  0x68 ,  ( byte )  0x11 ,  ( byte )  0x04 ,  ( byte )  0x33 ,  ( byte )  0x33 , ( byte )  0x34 ,  ( byte )  0x33 } ; int  checksum =  calculateChecksum ( request) ; System . out. println (  ( byte ) ( checksum &  0xFF ) ) ; } public  static  int  calculateChecksum ( byte [ ]  data)  { int  sum =  0 ; for  ( int  i =  0 ;  i <  data. length;  i++ )  { int  count =  Integer . parseInt ( String . valueOf ( data[ i] &  0xFF ) ) ; System . out. println ( Integer . valueOf ( data[ i] &  0xFF ) ) ; sum