Note: This html document was converted from a document created and put into the public domain by John F. Waers (jfwaers@csn.net.)
This document was converted by Tim Hogard 
(thogard@abnormal.com.)
Back to Tim's Homepage
Note that new material has been added at the end of this document.
Garmin Protocol
Garmin Protocol
 GRMN/GRMN Simplified Communication Protocol  Communication Setup
- Baud rate: 9600 bps
 -    Data bits: 8
 -    Stop bits: 1
 -    Parity:    None
 
  Message Format
    All messages start with a hexadecimal 10 start-of-message character, and are terminated by a checksum byte followed by hexadecimal 10 and 03 characters. If a data field within a message (including the checksum) contains a hexadecimal 10, it is repeated. The checksum is the   2's-complement of the modulo-256 sum of all of the message   bytes after the start-of-message character.    The Garmin PCX5 program always starts communication with a request for the model/software version. This appears to be unnecessary if just communicating with a GPS 45. However, there are probably differences in protocol between the various models of GPS receivers, and the protocol described in this document probably does not apply to all models.
    The first message byte always indicates the type of message to follow.
- 06 - Send single record
 -      0A - Prepare to send GPS database (almanac, waypoint,          route, track, etc.)
 -      1B - Number of database records to send
 -      1D - Route ID/Name record
 -      1E - Route Waypoint Record
 -      1F - Almanac Record
 -      22 - Track record
 -      23 - Waypoint Record
 
    The second message byte always indicates the number of   bytes in the message to follow, excluding the checksum and message terminator bytes.    The remaining message bytes contain the message itself,   which is dependent upon the type of message being sent.
  
Commands
- 10 0A 02 01 00 F3 10 03    Send Almanac
 -    10 0A 02 04 00 F0 10 03    Send Routes
 -    10 0A 02 06 00 EE 10 03    Send Track
 -    10 0A 02 07 00 ED 10 03    Send Waypoints
 -    10 06 02 22 00 D6 10 03    Send next record (seems to work with all types)
 -    10 06 02 xx 00 yy 10 04    Send next record commands (yy -- is the message checksum):
- 1B                  Send first record
 -             0C                  Send last record
 -             22                  Send next track record
 -             1F                  Send next almanac record
 -             1D                  Send next route waypoint record
 -             1E                  Send next route ID record
 -             23                  Send next waypoint record
 
 
  
  There is probably a command for repeating the last record,   in the event of a checksum error. The GPS 45 will automatically retransmit the last record if a send next   record command is not received within a 5 second time-out   period.
  
"OK" Message
 (or "let's get on with it" command) (GPS 45 seems to respond to all of the 0A02xx commands with this message):
- 10 06 02 0A 00 EE 10 03
 -    10        Start of message
 -    06        Record
 -    02        Number of message bytes to follow
 -    0A        "OK" response
 -    00        Future expansion?
 -    EE        Checksum
 -    1003      Message terminator
 
  Number of Records Message
    10 1B 02 05 00 DE 10 03
- 10        Start of message
 -    1B        Number of records message ID
 -    02        Number of message bytes to follow
 -    0500      0x0005 records to follow (LSB first)
 -    DE        Checksum
 -    1003      Message terminator
 
  Track Record Format
    10 22 0D CB 17 92 1C E6 08 45 B5 B5 5B BB 08 01 85 10 03
- 10        Start of message
 -    22        Track record ID
 -    0D        Number of message bytes to follow
 -    CB17921C  Latitude (40.1775)
 -    E60845B5  Longitude (-105.08953)
 -    B55BBB08  Time (seconds since 12/31/89 00:00:00), UTC
 -    01        Last record in track flag [This is 1 on the first record of a teack, 0 on all others]
 -    85        Checksum
 -    1003      Message terminator
 
 Route ID/Name Record Format
    10 1D 15 03 5F 5F 5F 5F 5F 5F 5F 5F 5F 5F 5F 5F 5F 5F 5F   5F 00 20 20 20 7B 10 03
- 10        Start of message
 -    1D        Route record ID
 -    15        Number of message bytes to follow
 -    03        Route #3
 -    5F...     Route name (all underscores indicates default             name in this case, 16 letters + null             termination)   202020    3 spaces for something (probably max name length             of 20 characters)
 -    7B        Checksum
 -    1003      Message terminator
 
  Route Waypoint Record
    10 1E 3A 48 4F 4D 45 20 20 00 22 92 1C 3F FA 44 B5 A6 19   9B 08 31 32 33 20 53 4E 4F 57 4D 41 53 53 20 50 4C 00 20   20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20   20 20 20 20 EE 10 03
- 10        Start of message
 -    1E        Route waypoint record ID
 -    3A        Number of message bytes to follow
 -    484F...   Waypoint ID, 6 letters
 -    0022921C  Latitude (40.17773)
 -    3FFA44B5  Longitude (-105.08985)
 -    A6199B08  Time waypoint stored (144,382,374 seconds since  12/31/89 00:00:00), UTC
 -    313233..  Waypoint comment, 40 letters, null terminated
 -    EE        Checksum
 -    1003      Message terminator
 
  Waypoint Record 
   10 23 3A 48 4F 4D 45 20 20 00 22 92 1C 3F FA 44 B5 A6 19   9B 08 31 32 33 20 53 4E 4F 57 4D 41 53 53 20 50 4C 00 20   20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20   20 20 20 20 E9 10 03
- 10        Start of message
 -    23        Waypoint record ID
 -    3A        Number of message bytes to follow
 -    484F...   Waypoint ID, 6 letters
 -    0022921C  Latitude (40.17773)
 -    3FFA44B5  Longitude (-105.8985)
 -    A6199B08  Time waypoint stored (144,382,374 seconds since 12/31/89 00:00:00), UTC
 -    313233..  Waypoint comment, 40 letters
 -    E9        Checksum
 -    1003      Message terminator
 
  Almanac Record 
   10 1F 2A FB 02 00 00 48 48 00 00 28 B8 00 00 80 AC 00 A8   6A 3B B1 0D A1 45 1A 99 1F BE 42 D5 9B BF D9 4A 14 C0 EB   48 07 B2 82 73 74 3F A1 10 03
- 10        Start of message
 -    1F        Almanac record ID
 -    2A        Number of message bytes to follow
 -    FB02      GPS Week (763) (FFFF indicates inactive satellite)
 -    0000      Health?
 -    4848      Somehow related to time of applicability
 -    00        Unknown   ...       (no interpretation yet)
 -    A1        Checksum
 -    1003      Message terminator  EOF Records
 
    These messages are sent at the completion of a database   transmission, when no more records remain to be sent.
- 10 0C 02 06 22 CA 10 03    Track EOF
 -    10 0C 02 07 00 EB 10 03    Waypoint EOF
 -    10 0C 02 04 00 EE 10 03    Route EOF
 -    10 0C 02 01 00 F1 10 03    Almanac EOF
 
  Upload from GPS 45 Protocol
    Send appropriate upload database command (almanac, route,   track, waypoint)   GPS 45 will respond with two messages:     "OK" message     Number of records message   Send the next record command repeatedly until EOF record   is observed. For each command, the GPS 45 will send the   next record. There appears to be no need to differentiate   between the types of next record command--any of them seem   to work.  
Download to GPS 45 Protocol
    Send number of records message   GPS 45 will respond with a send first record command of   the format:     10 06 02 1B 00 DD 10 03   Send the appropriate record. For each one, the GPS 45 will   respond with a send next record command for the   appropriate record type. Just look for the 0602 in the   message and keep on sending until the GPS 45 responds with   the appropriate EOF record (0C in the second byte).   
Format of longitude, latitude and time fields
    All are 32 bit signed integers in "little-endian" format;   i.e. least significant byte is transmitted first. To   convert the decimal latitude and longitude to degrees,   multiply by 180 / 2^31. The latitude and longitude are referenced to the WGS84 datum. The time field is the   number of seconds since 00:00 UTC, January 1, 1990.  
Summary of Message Formats
- 10 0A 02 01 00 F3 10 03    Send Almanac Database Command
 -    10 0A 02 04 00 F0 10 03    Send Routes Database Command
 -    10 0A 02 06 00 EE 10 03    Send Track Database Command
 -    10 0A 02 07 00 ED 10 03    Send Waypoints Database Command
 -     10 06 02 22 00 D6 10 03    Send next record (seems to work                              with all types)
 -    10 06 02 xx 00 yy 10 04    Send next record commands (yy            --                is the message checksum):
- 1B                  Send first record
 -             0C                  Send last record
 -             22                  Send next track record
 -             1F                  Send next almanac record
 -             1D                  Send next route waypoint record
 -             1E                  Send next route ID record
 -             23                  Send next waypoint record
 
 -     10 06 02 0A 00 EE 10 03   OK, lets get on with it message
 -     10 1B 02 05 00 DE 10 03   Number of records = 0005    10 22 0D...               Track record (15 bytes)
-    10 1D 15...               Route ID/Name (21 bytes)
 -    10 1E 3A...               Route Waypoint Record (58 bytes)
 -    10 23 3A...               Waypoint record (58 bytes)
 -    10 1F 2A...               Almanac record (42 bytes)
 
 -     10 0C 02 01 00 F1 10 03   Almanac EOF Record
 -    10 0C 02 04 00 EE 10 03   Route EOF Record
 -    10 0C 02 06 00 EC 10 03   Track EOF Record
 -    10 0C 02 07 00 EB 10 03   Waypoint EOF Record 
 
New stuff starts here....
This was added by thogard@abnormal.com
This is a list of known codes.  The number in the form of 0300 are Intel notaion for the number 3.  I expect the gerneral format for the the codes is [Start] [MsgType] {[SubMsg] {[Parameters]}}{ [Checksum]}.  This would imply that the 10 03 s not an end of message indicator but a trun arround command instead.
  These don't have the data or parity added (See above for examples)
- 10 0a 02 01 00        Hardware Version
 - 10 0a 02 02 00        Position
 - 10 0a 02 03 00        Proximity
 - 10 0a 02 04 00        Routes
 - 10 0a 02 05 00        Time
 - 10 0a 02 06 00        Track
 - 10 0a 02 07 00        Waypoints
 - 10 0a 02 08 00        Power Off
 
10 1c 02 xx xx         Send data (xx) in Async mode.   When used with 00, it turns off async mode.
Hardware
The Garmin GPS40, GPS45 and GPS90 are all based on the same hardware.  It consists of Garmins multiplexing GPS reciever as well as an 80188 based system.  The 80188 controls the display and keypad as well as the coordinate conversion to the different formats and map datums.  The program is stored in what could be Flash RAM so it might be possable to make modifications to the program area using the Garmin protocol.