Velocity Reviews > problem with bcd and a number

# problem with bcd and a number

nephish
Guest
Posts: n/a

 08-04-2011
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.

MRAB
Guest
Posts: n/a

 08-04-2011
On 04/08/2011 19:26, nephish wrote:
> 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)

Ethan Furman
Guest
Posts: n/a

 08-04-2011
nephish wrote:
> 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~

Christoph Hansen
Guest
Posts: n/a

 08-04-2011
MRAB schrieb:

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

i would say

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

but who knows

Ethan Furman
Guest
Posts: n/a

 08-04-2011
MRAB wrote:
> On 04/08/2011 19:26, nephish wrote:
>> 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)

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

~Ethan~

Peter Pearson
Guest
Posts: n/a

 08-05-2011
On Thu, 04 Aug 2011 21:52:45 +0200, Christoph Hansen <(E-Mail Removed)> wrote:
> MRAB schrieb:
>
>> The value is MSB * 100 + (LSB>> 4) * 10 + (LSB& 0xF)

>
> 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.

--
To email me, substitute nowhere->spamcop, invalid->net.

 Thread Tools

 Posting Rules You may not post new threads You may not post replies You may not post attachments You may not edit your posts BB code is On Smilies are On [IMG] code is On HTML code is OffTrackbacks are On Pingbacks are On Refbacks are Off Forum Rules

 Similar Threads Thread Thread Starter Forum Replies Last Post nephish Python 4 08-05-2011 03:52 PM Manaryu VHDL 1 09-10-2010 06:55 AM - Bobb - Windows 64bit 12 07-09-2006 11:07 AM bob VHDL 6 11-25-2003 05:30 PM Glen Herrmannsfeldt VHDL 4 07-31-2003 11:18 PM

Advertisments