Skip to content

Commit 175ccd0

Browse files
bje-dhoomakethu
authored andcommitted
Add new skip_bytes method to BinaryPayloadDecoder to skip over bytes (pymodbus-dev#205)
* Add new skip_bytes method to BinaryPayloadDecoder to skip over bytes in the payload we are not interested in. * Add an example of skip_bytes usage to the modbus-payload.py example.
1 parent bae1114 commit 175ccd0

File tree

3 files changed

+20
-2
lines changed

3 files changed

+20
-2
lines changed

examples/common/modbus-payload.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,15 @@
3535
# - a 8 byte string 'abcdefgh'
3636
# - a 32 bit float 22.34
3737
# - a 16 bit unsigned int 0x1234
38+
# - another 16 bit unsigned int 0x5678
3839
# - an 8 bit int 0x12
3940
# - an 8 bit bitstring [0,1,0,1,1,0,1,0]
4041
#---------------------------------------------------------------------------#
4142
builder = BinaryPayloadBuilder(endian=Endian.Big)
4243
builder.add_string('abcdefgh')
4344
builder.add_32bit_float(22.34)
4445
builder.add_16bit_uint(0x1234)
46+
builder.add_16bit_uint(0x5678)
4547
builder.add_8bit_int(0x12)
4648
builder.add_bits([0,1,0,1,1,0,1,0])
4749
payload = builder.build()
@@ -58,6 +60,7 @@
5860
# - a 8 byte string 'abcdefgh'
5961
# - a 32 bit float 22.34
6062
# - a 16 bit unsigned int 0x1234
63+
# - another 16 bit unsigned int which we will ignore
6164
# - an 8 bit int 0x12
6265
# - an 8 bit bitstring [0,1,0,1,1,0,1,0]
6366
#---------------------------------------------------------------------------#
@@ -69,6 +72,7 @@
6972
'string': decoder.decode_string(8),
7073
'float': decoder.decode_32bit_float(),
7174
'16uint': decoder.decode_16bit_uint(),
75+
'ignored': decoder.skip_bytes(2),
7276
'8int': decoder.decode_8bit_int(),
7377
'bits': decoder.decode_bits(),
7478
}

pymodbus/payload.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,14 @@ def decode_string(self, size=1):
349349
self._pointer += size
350350
return self._payload[self._pointer - size:self._pointer]
351351

352+
def skip_bytes(self, nbytes):
353+
''' Skip n bytes in the buffer
354+
355+
:param nbytes: The number of bytes to skip
356+
'''
357+
self._pointer += nbytes
358+
return None
359+
352360
#---------------------------------------------------------------------------#
353361
# Exported Identifiers
354362
#---------------------------------------------------------------------------#

test/test_payload.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,15 @@ def setUp(self):
3131
b'\x01\x02\x00\x03\x00\x00\x00\x04\x00\x00\x00\x00' \
3232
b'\x00\x00\x00\xff\xfe\xff\xfd\xff\xff\xff\xfc\xff' \
3333
b'\xff\xff\xff\xff\xff\xff\x00\x00\xa0\x3f\x00\x00' \
34-
b'\x00\x00\x00\x00\x19\x40\x74\x65\x73\x74\x11'
34+
b'\x00\x00\x00\x00\x19\x40\x01\x00\x74\x65\x73\x74' \
35+
b'\x11'
3536

3637
self.big_endian_payload = \
3738
b'\x01\x00\x02\x00\x00\x00\x03\x00\x00\x00\x00\x00' \
3839
b'\x00\x00\x04\xff\xff\xfe\xff\xff\xff\xfd\xff\xff' \
3940
b'\xff\xff\xff\xff\xff\xfc\x3f\xa0\x00\x00\x40\x19' \
40-
b'\x00\x00\x00\x00\x00\x00\x74\x65\x73\x74\x11'
41+
b'\x00\x00\x00\x00\x00\x00\x00\x01\x74\x65\x73\x74' \
42+
b'\x11'
4143

4244
self.bitstring = [True, False, False, False, True, False, False, False]
4345

@@ -62,6 +64,7 @@ def testLittleEndianPayloadBuilder(self):
6264
builder.add_64bit_int(-4)
6365
builder.add_32bit_float(1.25)
6466
builder.add_64bit_float(6.25)
67+
builder.add_16bit_uint(1) # placeholder
6568
builder.add_string(b'test')
6669
builder.add_bits(self.bitstring)
6770
self.assertEqual(self.little_endian_payload, builder.to_string())
@@ -79,6 +82,7 @@ def testBigEndianPayloadBuilder(self):
7982
builder.add_64bit_int(-4)
8083
builder.add_32bit_float(1.25)
8184
builder.add_64bit_float(6.25)
85+
builder.add_16bit_uint(1) # placeholder
8286
builder.add_string('test')
8387
builder.add_bits(self.bitstring)
8488
self.assertEqual(self.big_endian_payload, builder.to_string())
@@ -125,6 +129,7 @@ def testLittleEndianPayloadDecoder(self):
125129
self.assertEqual(-4, decoder.decode_64bit_int())
126130
self.assertEqual(1.25, decoder.decode_32bit_float())
127131
self.assertEqual(6.25, decoder.decode_64bit_float())
132+
self.assertEqual(None, decoder.skip_bytes(2))
128133
self.assertEqual('test', decoder.decode_string(4).decode())
129134
self.assertEqual(self.bitstring, decoder.decode_bits())
130135

@@ -141,6 +146,7 @@ def testBigEndianPayloadDecoder(self):
141146
self.assertEqual(-4, decoder.decode_64bit_int())
142147
self.assertEqual(1.25, decoder.decode_32bit_float())
143148
self.assertEqual(6.25, decoder.decode_64bit_float())
149+
self.assertEqual(None, decoder.skip_bytes(2))
144150
self.assertEqual(b'test', decoder.decode_string(4))
145151
self.assertEqual(self.bitstring, decoder.decode_bits())
146152

0 commit comments

Comments
 (0)