This document was created to document the serial-line protocol to control Spectrum signs, which come in many sizes and flavors. Spectrum is unwilling to accurately document this protocol, and has actually released a document which is poorly written, and almost completely inaccurate. Since I am writing software which uses this protocol, it was necessary to reverse-engineer another piece of software to get the codes. My findings are here so that nobody has to go through this again. You might think it would make sense to Spectrum Corp to make this information widely usable, so that they can sell more signs, but they don’t seem too bright (pun intended).
The software that I wrote that implements this protocol is called Huddle, which is GPL and hosted by Sourceforge.
In order to send a control message, the serial port should be set to 7 data bits, even parity, 2 stop bits. The baud rate is 1200, 2400, 4800, or 9600. There is no setting in the sign for baud rate, as the sign determines the speed based on the first characters in each message. Because of this, each control message starts with a series of zeros (0x30), about ten of them for good measure.
Next comes a 0x01, followed by the sign Type Code (see table below).
This tells each type of sign whether you want it to process this
message. The Type Code is followed by a two-character hexidecimal sign
address. This is in the range of
00 (0x30 0x30) to
ff, and matches
that set in your sign. For a Type Code that addresses all boards, leave
Next comes an STX character, 0x02, to begin sending command(s). Each
command is prefaced with a Command Code (see table below). Some Command
Codes require one or more characters to follow it as parameters. For
commands where a file is being stored, such as
A, simply start the
text of the message.
You can end each command with an ETX character (0x03), and send multiple commands, ending the entire control message with an EOT character (0x04).
A sign holds one or more messages in memory, in files with a one-character name. You must send a command to reserve memory with the name of the file you will be using. This is done with a Write Special Functions command (see the table).
|Z||0x5A||All Message Centers|
|?||0x3F||All Message Centers|
|0||0x30||Response Type Code - Used only when a sign responds to a request|
|!||0x21||All Message Centers with Visual Verification - This code will cause the wallboards to give a visual indication "Transmission OK" on the wallboard screen if the transmission frame format was received without error.|
|1||0x31||All One line wallboards|
|2||0x32||All Two line wallboards|
|#||0x23||All Matrix Products|
|$||0x24||Full Matrix Products|
|%||0x25||Character Matrix Products|
|l||0x6C||3XX7 Series (3217, 3617, 3027 Wallboards)|
|m||0x6D||Power Light Series 16 row|
|n||0x6E||Power Light Series 24 row|
|z||0x7A||All Message Centers will first configure memory for 26 files of 150 characters (A-Z) then execute the specified command.|
|A||0x41||[[#Write Text File|Write Text File]]|
|B||0x42||Read Text File|
|E||0x45||[[#Write Special Functions|Write Special Functions]]|
|F||0x46||Read Special Functions|
|G||0x47||Write String File|
|H||0x48||Read String File|
|I||0x49||Write Dots Picture File|
|J||0x4A||Read Dots Picture File|
|M||0x4D||Write Matrix Picture File|
|N||0x4E||Read Matrix Dots Picture File|
|O||0x4F||Write Bulletin Message|
Write Text File
Writing text to a file is necessary for the message to be displayed.
The text of the message can use the control codes documented below. The
first character following the
A is a name of the file you are
writing. This can apparently be any character of the ASCII table above
and including 0x20.
To insert a String File in a message, send a DLE (0x10) followed by the one-character file name. String files can be changed at any time without re-sending the entire Text File, and the sign will update the message.
Send 0x1c followed by a single character.
Send 0x1b followed by one or two characters.
A transition is sent before the text which will be ‘brought in’ with the transition.
|d||Line Split Out/In ("Switch")|
|n9||Graphic: Slot Machine|
|nS||Graphic: Thank You|
|nU||Graphic: No Smoking|
|nV||Graphic: Don't Drink and Drive|
|nW||Graphic: Animal Running|
|nY||Graphic: Turbo Car|
|nZ||Graphic: Cherry Bomb|
|t||Compress Rotate (rotates left, with letters being half as wide)|
To adjust the speed of transitions, send one of the following:
To format text, place in front of the text to be altered.
|0x05||Double High Followed by '1' for on, '0' for off.|
|0x06||True Descender Followed by '1' for on, '0' for off.|
|0x07||Character Flash Followed by '1' for on, '0' for off.|
|0x1d 0x30||Double Stroke Followed by '1' for on, '0' for off.|
|0x1d 0x31||Double Width Followed by '1' for on, '0' for off.|
|0x1d 0x34||Fixed Width Followed by '1' for on, '0' for off.|
|0x1d 0x35||Fancy Followed by '1' for on, '0' for off.|
|0x12||Wide Character enable.|
|0x11||Wide Character disable.|
|0x1a 0x38||Full Height Fancy|
|0x1a 0x39||Full Height Standard|
|0x1a 0x33||Seven-High Standard|
|0x1a 0x31||Five-High Standard|
|0x22 0x6f||Line Position Top|
|0x20 0x6f||Line Position Middle|
|0x26 0x6f||Line Position Bottom|
|0x30 0x6f||Line Position Fill|
Write Special Functions
These are used to for many different things, which are listed below. This is only a partial list, however.
|$||Reserve Memory. Followed by: