[chirp_devel] Need help reading a radio.

Jim Unroe
Mon Jun 13 14:23:29 PDT 2016


On Sat, Jun 11, 2016 at 4:48 PM, Jim Unroe <rock.unroe at gmail.com> wrote:
> All,
>
> I am trying to read a new radio. Here is the problem.
>
> A request for data is made like this.
>
> 52 1D 80 40
>
> Then usually 68 bytes (4 header bytes and 64 data bytes) are returned like this:
>
> 57 1D 80 40 + {64 data bytes}
>
> But every once in a while the radio will return 69 bytes (the command
> byte is sent twice increasing the header to 5 bytes) like this:
>
> 57 57 1D 80 40 + {64 data bytes}
>
> Got any advice how I can deal with this extra byte being introduced
> randomly. The OEM software apparently has no problem handling this.
>
> Jim

There is probably a more elegant approach, but here is what I did and
it seems to work very well.

def _recv(radio, addr, length=BLOCK_SIZE):
    """Get data from the radio """
    # read 4 bytes of header
    hdr = _rawrecv(radio, 4)

    # the radio randomly sends out an extra command byte
    c, a, l = struct.unpack(">BHB", hdr)
    if hdr[0:2] == "WW" and a != addr:
        # extra command byte detected
        # throw away the 1st byte and add the next byte in the buffer
        hdr = hdr[1:] + _rawrecv(radio, 1)
        LOG.debug(util.hexprint(hdr))

    # read 64 bytes (0x40) of data
    data = _rawrecv(radio, (BLOCK_SIZE))

    # DEBUG
    LOG.info("Response:")
    LOG.debug(util.hexprint(hdr + data))

    c, a, l = struct.unpack(">BHB", hdr)
    if a != addr or l != length or c != ord("W"):
        _exit_program_mode(radio)
        LOG.error("Invalid answer for block 0x%04x:" % addr)
        LOG.debug("CMD: %s  ADDR: %04x  SIZE: %02x" % (c, a, l))
        raise errors.RadioError("Unknown response from the radio")

    return data


What the above does is reads 4 bytes which should normally be the
header bytes. These 4 bytes are then "unpacked" so I have the address.

Then I test for the double command byte. The MEM_SIZE is 0x8000 so
just looking for "WW" (\x57\x57) is not good enough. If the addresses
also don't match, then there is a very near 100% chance that what was
read was caused by the extra command byte.

If the above check is "True" then we must have retrieved a double
command byte and we are short 1 byte of the header. So then we throw
away the first "W" and at the same time receive 1 more byte to
complete the header.

If the above check is "False" then nothing special needs to be done.

>From this point the remaining 64 data bytes are read and everything
continues normally.

Jim KC9HI



More information about the chirp_devel mailing list