Uniden SC200 Sportcat

  • The Uniden SC200 Sportcat is a programmable handheld scanner for police, fire, and emergency frequencies. It is also popular for sporting events such as Nascar races. After a friend purchased two of these devices, he learned that it could be plugged into a PC through the serial port. Special software from Uniden allows the scanner to be programmed from the PC. Additionally, the two units could be plugged together through this same serial connection, and a “clone” mode will duplicate all of the settings from one scanner onto the other.

    My friend captured the data between the two scanners in the hopes that he could eventually write his own software to replace the Uniden program. After examining the some of the data packets, I worked out the checksum calculation used by the communication routines. A sample line from the data packet looks like this:

    CLN 0720 8F5B5451919AFF59332D442706043E1A~08E9

    The number after the CLN (clone) is the memory address. Following this is the hexidecimal data from the memory starting at this address. Finally, there is a tilde and then the checksum. To get the checksum, take the memory address and the hex data. From the example string above, this would be:

    07208F5B5451919AFF59332D442706043E1A

    Make sure to take out the space character between the memory address and the hex data. To calculate the checksum, treat each one of these characters as a single hexidecimal digit. If this hex digit is greater than 9, add one to this digit. Next, convert the resulting hexidecimal number to decimal. Finally, the digits that make up this decimal number are then added to the checksum as if they were a hexidecimal number. When you have added up the whole string in this fashion, take the resulting sum and add $07DD to it. This is the checksum.

    Private Function Checksum(ByVal sData As String) As String
        Dim i As Integer
        Dim dwChecksum As Long
     
        dwChecksum = 0
     
        For i = 1 To Len(sData)
            dwChecksum = dwChecksum + 
                CInt("&H" + CStr(CInt("&H" + Mid(sData, i, 1))))
     
            If CInt("&H" + Mid(sData, i, 1)) > 9 Then
                dwChecksum = dwChecksum + 1
            End If
        Next i
     
        dwChecksum = dwChecksum + CInt("&H7DD")
        Checksum = Hex(dwChecksum)
    End Function

    This code above calculates the checksum using Microsoft Visual Basic 6.0.