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 this as 00.

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

Type Codes

Char ASCII Usage
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
a 0x61 3214C Wallboard
b 0x62 3614C Wallboard
c 0x63 3024C Wallboard
d 0x64 3424C Wallboard
e 0x65 1512R Wallboard
f 0x66 1512C Wallboard
g 0x67 3214R Wallboard
h 0x68 3614R Wallboard
i 0x69 3024R Wallboard
j 0x6A 3424R Wallboard
k 0x6B 1023/1033 Wallboards
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.
C 0x43 7430I
D 0x44 7440I
E 0x45 7460I
U 0x55 790I
" 0x22 Serial Clocks
^ 0x5E 205C

Command Codes

Char ASCII Usage
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.

Colors

Send 0x1c followed by a single character.

Char Color
1 Red
2 Green
3 Amber
4 Dim Red
5 Dim Green
6 Brown
7 Orange
8 Yellow
9 Rainbow Horizontal
A Rainbow Checker
B Rainbow Mix

Transitions

Send 0x1b followed by one or two characters.

A transition is sent before the text which will be ‘brought in’ with the transition.

Identifier Transition
a Rotate Left
b Hold
c Flash
d Line Split Out/In ("Switch")
e Roll Up
f Roll Down
g Roll Left
h Roll Right
i Wipe Up
j Wipe Down
k Wipe Left
l Wipe Right
m Scroll
n0 Twinkle
n1 Sparkle
n2 Snow
n3 Interlock
n4 Switch
n5 Slide
n6 Spray
n7 Starburst
n8 Graphic: Welcome
n9 Graphic: Slot Machine
nS Graphic: Thank You
nU Graphic: No Smoking
nV Graphic: Don't Drink and Drive
nW Graphic: Animal Running
nX Graphic: Fireworks
nY Graphic: Turbo Car
nZ Graphic: Cherry Bomb
o Auto Mode
p Roll In
q Roll Out
r Wipe In
s Wipe Out
t Compress Rotate (rotates left, with letters being half as wide)

Speed

To adjust the speed of transitions, send one of the following:

Type Code Usage
0x15 Speed 1
0x16 Speed 2
0x17 Speed 3
0x18 Speed 4
0x19 Speed 5

Text Formatting

To format text, place in front of the text to be altered.

Code Usage
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
0x1e 0x30 Proportional
0x1e 0x31 Fixed
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.

Type Code Usage
$ Reserve Memory. Followed by:
  • The one-character name of the file (any ASCII char above 0x1f)
  • The type of file ('A' for text file, 'B' for string file)
  • Some parameters (which are not documented). "AU" works for text files, "L" works for string files.
  • The length of the file in four hex characters.
  • For text files, "FF00". For string files, "0000". This might mean something, but it's undocumented.