1111* rtu
1212* binary
1313'''
14- #---------------------------------------------------------------------------#
14+ #---------------------------------------------------------------------------#
1515# import needed libraries
1616#---------------------------------------------------------------------------#
1717from __future__ import print_function
1818import sys
1919import collections
2020import textwrap
2121from optparse import OptionParser
22+ import codecs as c
23+
2224from pymodbus .utilities import computeCRC , computeLRC
2325from pymodbus .factory import ClientDecoder , ServerDecoder
2426from pymodbus .transaction import ModbusSocketFramer
2527from pymodbus .transaction import ModbusBinaryFramer
2628from pymodbus .transaction import ModbusAsciiFramer
2729from pymodbus .transaction import ModbusRtuFramer
30+ from pymodbus .compat import byte2int , int2byte , IS_PYTHON3
31+
2832
2933#--------------------------------------------------------------------------#
3034# Logging
3337modbus_log = logging .getLogger ("pymodbus" )
3438
3539
36- #---------------------------------------------------------------------------#
40+ #---------------------------------------------------------------------------#
3741# build a quick wrapper around the framers
38- #---------------------------------------------------------------------------#
42+ #---------------------------------------------------------------------------#
3943class Decoder (object ):
4044
4145 def __init__ (self , framer , encode = False ):
@@ -52,7 +56,10 @@ def decode(self, message):
5256
5357 :param message: The messge to decode
5458 '''
55- value = message if self .encode else message .encode ('hex' )
59+ if IS_PYTHON3 :
60+ value = message if self .encode else c .encode (message , 'hex_codec' )
61+ else :
62+ value = message if self .encode else message .encode ('hex' )
5663 print ("=" * 80 )
5764 print ("Decoding Message %s" % value )
5865 print ("=" * 80 )
@@ -64,7 +71,7 @@ def decode(self, message):
6471 print ("%s" % decoder .decoder .__class__ .__name__ )
6572 print ("-" * 80 )
6673 try :
67- decoder .addToFrame (message . encode () )
74+ decoder .addToFrame (message )
6875 if decoder .checkFrame ():
6976 decoder .advanceFrame ()
7077 decoder .processIncomingPacket (message , self .report )
@@ -86,7 +93,7 @@ def report(self, message):
8693 :param message: The message to print
8794 '''
8895 print ("%-15s = %s" % ('name' , message .__class__ .__name__ ))
89- for k , v in message .__dict__ .iteritems ():
96+ for ( k , v ) in message .__dict__ .items ():
9097 if isinstance (v , dict ):
9198 print ("%-15s =" % k )
9299 for kk ,vv in v .items ():
@@ -102,9 +109,9 @@ def report(self, message):
102109 print ("%-15s = %s" % ('documentation' , message .__doc__ ))
103110
104111
105- #---------------------------------------------------------------------------#
112+ #---------------------------------------------------------------------------#
106113# and decode our message
107- #---------------------------------------------------------------------------#
114+ #---------------------------------------------------------------------------#
108115def get_options ():
109116 ''' A helper method to parse the command line options
110117
@@ -136,6 +143,10 @@ def get_options():
136143 help = "The file containing messages to parse" ,
137144 dest = "file" , default = None )
138145
146+ parser .add_option ("-t" , "--transaction" ,
147+ help = "If the incoming message is in hexadecimal format" ,
148+ action = "store_true" , dest = "transaction" , default = False )
149+
139150 (opt , arg ) = parser .parse_args ()
140151
141152 if not opt .message and len (arg ) > 0 :
@@ -150,8 +161,19 @@ def get_messages(option):
150161 :returns: The message iterator to parse
151162 '''
152163 if option .message :
164+ if option .transaction :
165+ msg = ""
166+ for segment in option .message .split ():
167+ segment = segment .replace ("0x" , "" )
168+ segment = "0" + segment if len (segment ) == 1 else segment
169+ msg = msg + segment
170+ option .message = msg
171+
153172 if not option .ascii :
154- option .message = option .message .decode ('hex' )
173+ if not IS_PYTHON3 :
174+ option .message = option .message .decode ('hex' )
175+ else :
176+ option .message = c .decode (option .message .encode (), 'hex_codec' )
155177 yield option .message
156178 elif option .file :
157179 with open (option .file , "r" ) as handle :
0 commit comments