problem with bcd and a number

N

nephish

Hey all,

I have been trying to get my head around how to do something, but i am
missing how to pull it off.
I am reading a packet from a radio over a serial port.

i have " two bytes containing the value i need. The first byte is the
LSB, second is MSB. Both bytes are BCD-encoded, with the LSB
containing digits zX and MSB containing digits xy. The system speed
is then xyz%, where 100% means maximum speed and would be given by
bytes 00(LSB) 10(MSB)."

that is a quote from the documentation.
Anyway, i am able to parse out the two bytes i need, but don't know
where to go from there.

thanks for any tips on this.
 
M

MRAB

Hey all,

I have been trying to get my head around how to do something, but i am
missing how to pull it off.
I am reading a packet from a radio over a serial port.

i have " two bytes containing the value i need. The first byte is the
LSB, second is MSB. Both bytes are BCD-encoded, with the LSB
containing digits zX and MSB containing digits xy. The system speed
is then xyz%, where 100% means maximum speed and would be given by
bytes 00(LSB) 10(MSB)."

that is a quote from the documentation.
Anyway, i am able to parse out the two bytes i need, but don't know
where to go from there.

thanks for any tips on this.

The value is MSB * 100 + (LSB >> 4) * 10 + (LSB & 0xF)
 
E

Ethan Furman

nephish said:
Hey all,

I have been trying to get my head around how to do something, but i am
missing how to pull it off.
I am reading a packet from a radio over a serial port.

i have " two bytes containing the value i need. The first byte is the
LSB, second is MSB. Both bytes are BCD-encoded, with the LSB
containing digits zX and MSB containing digits xy. The system speed
is then xyz%, where 100% means maximum speed and would be given by
bytes 00(LSB) 10(MSB)."

that is a quote from the documentation.
Anyway, i am able to parse out the two bytes i need, but don't know
where to go from there.

thanks for any tips on this.

As I recall, when you cut a byte in half you get two nibbles. You need
to translate your nibbles into numbers, then multiply and add --
something like this:

8<--- bcd.py ----------------------------------------------------------
def bcd_to_int(msb, lsb):
"""msb has two decimal digits, lsb has one
e.g. msb has xy=10, lsb has zX = 00, actual number (xyz)
is 100"""
ones = lsb >> 4
tens = msb & 0x0f
hundreds = msb >> 4
if ones > 9 or tens > 9 or hundreds > 9:
raise ValueError(
"invalid BCD digits in %02x %02x" % (msb, lsb)
)
tens *= 10
hundreds *= 100
answer = hundreds + tens + ones
return answer

if __name__ == '__main__':
import unittest

class Test_BCD(unittest.TestCase):
def test_valid(self):
msb = 0x09
lsb = 0x34 # 4 will be discarded as garbage
self.assertEqual(bcd_to_int(msb, lsb), 93)
def test_invalid(self):
msb = 0x1a
lsb = 0x10
self.assertRaises(ValueError, bcd_to_int, msb, lsb)

unittest.main()
8<---------------------------------------------------------------------

Hope this helps.

~Ethan~
 
E

Ethan Furman

MRAB said:
The value is MSB * 100 + (LSB >> 4) * 10 + (LSB & 0xF)

Not according to the docs -- msb has two digits, lsb has one and garbage.

~Ethan~
 
P

Peter Pearson

i would say

(MSB >> 4)*100 + (MSB & 0xF)*10 + (LSB >> 4)

but who knows

I concur. I think the documentation is trying to say that the
low-order nibble of the LSB is garbage.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,773
Messages
2,569,594
Members
45,123
Latest member
Layne6498
Top