产品评测:Pro-Lite 滚动信息显示屏

作者:Walter Stoneburner
Product Review: Pro-Lite Scrolling Message Signs
  • 制造商:Pro-Lite

  • 电子邮件:info@prolite.com

  • 网址:http://www.pro-lite.com/

  • 价格:150 美元

  • 作者:Walt Stoneburner

Pro-Lite Tru-Color II PL-M2014R 是一款经济实惠的多色 LED 滚动信息显示屏,可以通过标准的 RS-232 串口进行控制。该显示屏可以直接从 Pro-Lite (http://www.pro-lite.com/) 购买,也可以在各种折扣仓库以大约 150 美元的价格购买。串行电缆和 Windows 软件单独出售。

本文不仅是一篇评测;它还可以作为 Pro-Lite PL-M2014R(ROM 版本 5.24Q 和 32K 内存,带有 Trivia 模式,基本上是您的标准显示屏)的入门指南。到目前为止,公众可以获得的开发者信息不多,这意味着显示屏通常使用附带的红外遥控器进行配置以显示静态消息。只需花费很少的钱,就可以构建自己的串行电缆,并使用 Linux 控制显示屏以显示超出静态文本的内容。

高可见度显示屏的商业和个人应用几乎是无限的:报告软件交付的剩余天数、宣布交通拥堵、提供天气预报、显示日期和时间、发送公共消息、报告系统负载、宣布新邮件、显示谁已登录、警告磁盘空间不足、登录信息、作为监视器宣布意外的服务器中断等等。

与显示屏通信几乎就像通过串口发送文本一样简单;但是,为了使显示屏响应并执行高级任务,需要进行一些文本操作。Linux 处理串口通信,因此向显示屏发送信息就像写入文件一样简单。

幸运的是,大部分工作可以通过简单的脚本完成。您只需要对 shell、AWK、PERL 或 Python 有基本的了解,就可以在几乎很短的时间内运行起来。第一个障碍是构建电缆并配置 Linux 以通过串口进行通信。

电缆构造
Product Review: Pro-Lite Scrolling Message Signs

图 1. 母 DB9 适配器

第一步是将 RJ12 连接到母 DB9 适配器。这不需要任何工具,适配器套件可以在大多数计算机用品商店以大约 2 美元的价格购买。您需要的另一件事是一段两端带有公头适配器的 RJ12 电缆。这意味着标准的电话线就足够了。您的电缆很可能具有标准的颜色,黑色、红色、绿色和黄色,按此顺序排列。

电缆有两种类型:直通型和反转型。您需要将 RJ12 电缆首尾相连(像一个环)以找出您需要构建哪种适配器。

Product Review: Pro-Lite Scrolling Message Signs

图 2. RJ12 适配器图

以下两种情况之一会很明显:要么电线颜色匹配,黑色对黑色,红色对红色等等,要么它们会反转顺序,显示黑色对黄色,红色对绿色等等。

如果电缆是直通型,颜色匹配,则将您的 RJ12 连接到 DB9 适配器,使用引脚 2 作为绿色,引脚 3 作为红色,引脚 5 作为黄色。如果电缆是反转型,颜色顺序反转,则将您的 RJ12 连接到 DB9 适配器,使用引脚 2 作为红色,引脚 3 作为绿色,引脚 5 作为黑色。

Product Review: Pro-Lite Scrolling Message Signs

图 3. RJ12 到 DB9 接线

将未使用的适配器电线塞入外壳中,然后将适配器卡紧。注意不要让裸露的末端接触适配器外壳内的任何金属。您可能需要剪掉未使用的电线。在您的串口上连接延长线,并将适配器电线直接连接到延长线,以便在将引脚推入连接器之前测试接线配置。

当一切完成时,RJ12 的一端插入 LED 显示屏的侧面,另一端插入您刚制作的适配器,适配器插入计算机。

配置 Linux 与显示屏通信

我的显示屏已插入 COM1,也称为 /dev/ttyS0。我选择使用指向显示屏的符号链接,以防将来我决定更改为另一个串口。要创建链接,以 root 用户身份键入

ln -s /dev/ttyS0 /dev/prolite

我倾向于避免以 root 用户身份进行开发。暂时抛开安全问题,我们可以通过键入以下命令使设备世界可写

chmod a+rw /dev/prolite
显示屏使用无奇偶校验、8 位数据位、1 位停止位进行通信;不使用任何类型的握手(硬件或软件)。早期版本的显示屏仅以 300 波特率工作,但可以升级到 9600 波特率。我遇到的所有显示屏都开箱即用就具有 9600 波特率的功能。最重要的是,所有显示屏都能够进行通信,即使在 300 波特率下,您也可以超过显示屏的速度。唯一的缺点是显示屏的波特率必须根据手册中的设置通过遥控器设置。这只需要做一次。

理论上,显示屏要求在发送到显示屏的每个字符之间有 15 毫秒的延迟。我发现 Linux 的设备驱动程序似乎工作正常,无需在软件中执行任何特殊操作。

stty speed 9600 cs8 -parenb -cstopb cread \
   -clocal -crtscts -ignpar -echo nl1 cr3 < \
   /dev/prolite

当然,您可以将显示屏可以处理的任何波特率替换为 9600。当您不是 root 用户时,此命令将起作用,因为它对世界可写。

与显示屏通信最重要的信息是,发送到显示屏的每个命令都必须以回车符/换行符对结尾。这在键盘上是 ctrl-M ctrl-J,在十六进制中是 0x0C 0x0A。C 程序员会将其识别为 \r\n。如果您希望 Linux 为您处理行尾序列,请键入命令

stty opost -ocrnl onlcr < /dev/prolite

当您发送换行符时,Linux 会自动发送回车符/换行符。现在可以从 shell 列出文本或将其重定向到 /dev/prolite。如果您想自己发送回车符,请键入

stty -opost -ocrnl -onlcr < /dev/prolite
其中选项定义为
  • opost:后处理输出流。

  • -opost:不后处理输出流。

  • -ocrnl:不将回车符转换为换行符。

  • -onlcr:不将每个换行符转换为回车符/换行符对。

  • onlcr:将每个换行符转换为回车符/换行符对。

The stty 命令允许简要表示定义设备特性的所有 termios 结构。对于具有自动回车符的 9600,N,8,1,在一行中键入
stty 0:705:bd:0:3:1c:7f:15:4:0:1:0:11:13:1a:0:
12:f:17:16:0:0:73 < /dev/prolite
对于没有自动回车符的 9600,N,8,1,使用以下行
stty 0:700:bd:0:3:1c:7f:15:4:0:1:0:11:13:1a:0:
12:f:17:16:0:0:73 < /dev/prolite
命令语法

只需最少的理解即可操作显示屏。精通需要熟悉协议并进行一些实验。

通过使用简单的电话线分线 Y 型连接器,可以将多个显示屏通过同一串口连接到计算机。每个显示屏都有一个可分配的逻辑地址,允许您向特定的显示屏发送消息。逻辑地址在十六进制中表示为 01 到 FF 之间的数字。地址可以共享以实现分组;通过这种方式,发送到 ID01 的消息会发送到所有 ID01 的显示屏。

与显示屏的通信始终使用可读的 ASCII 字符完成;因此,任意 ID 2F 将用数字“2”和大写字母“F”表示。

ID00 保留为“广播到所有显示屏”的意思。默认情况下,显示屏预配置为 ID01;这可以通过遥控器更改。如果您正在寻址直接连接到计算机的单个显示屏,它将在每个成功的命令后以其 ID 号响应。发送到 ID00 的消息不会返回响应,当线路通过 Y 型连接器共享时,单个显示屏也不会返回响应。

除了设置日期和时间的消息外,所有发送到显示屏的消息都以以下格式发送,后跟回车符/换行符:<IDxx>commandxx 是 00 到 FF。任何长度超过 1,023 字节的命令都将被显示屏忽略。

要设置日期和时间,不需要 ID。格式为 <TYYMMDDwhhmmss>,其中 YY 是年份,MM 是月份,DD 是日期,w 是星期几(0=周日,1=周一,...6=周六),hh 是小时,mm 是分钟,ss 是秒。这可以使用 shell 非常容易地完成。使用以下命令设置所有显示屏的日期/时间

ate "+<T%y%m%d%w%H%M%S>" te "+<T%y%m%d%w%H%M%S>" > /dev/prolite> /dev/prolite

前导 + 符号告诉 date 命令通过替换构建字符串;有关详细信息,请参阅您的 man 手册。

要指示显示屏开始监听响应,请向其发送格式为 <IDxx> 的空命令;例如,键入

echo "<ID01>" > /dev/prolite
页面

显示屏最基本的概念是页面的概念。页面由显示屏现在或将来某个时间要显示的消息组成。页面可以包含文本、数字、符号、字体属性标签、颜色标签、图形标签和效果标签。有 26 个页面,恰如其分地命名为 A 到 Z。识别页面时大小写很重要。

任何给定页面可以容纳大约 1,012 字节的信息。我说大约是因为特殊标签(参见侧边栏)消耗超过一个字节,这意味着更少的空间。此外,通过一些技巧,完全省略页面指令并默认为页面 A,可以额外挤出两个字节,这意味着更多的空间。

设置页面的命令是 <Px>,其中 x 是页面名称。此序列之后的任何文本都被视为显示屏的文本。要在页面 A 上设置消息“Linux Rules”,请键入以下命令

echo "<ID01><PA>Linux Rules" > /dev/prolite

重要的是在末尾留出额外的空间,以便消息的末尾与消息滚动时的开头分隔开。

要删除页面,请使用 <DPx>,其中 x 是页面名称。例如,要删除页面 B,请键入

echo "<ID01><DPB>" > /dev/prolite
显示页面

显示屏不断显示页面。如果默认页面 A 正在滚动,那么当其内容更改时,它将立即开始显示新消息。否则,我们必须使用 <RPx> 命令告诉显示屏要运行哪个页面,其中 x 是要显示的页面。通常,显示屏一次只能运行一个页面。

一旦定义了页面,就可以运行它。例如,要重复显示我们的消息,请键入

echo "<ID01><RPA>" > /dev/prolite

运行未定义的页面将导致显示显示屏的演示。

脚本编写者感兴趣的两点

  1. 可以更新未显示的页面的内容,然后在稍后的时间切换到该页面。

  2. 可以更新当前显示的消息。唯一的问题是显示将在消息中间中断。

遗憾的是,您无法询问显示屏页面的内容是什么、当前正在显示哪个页面,或者何时开始或结束显示序列。因此,像双缓冲这样的技术不适用于连续消息。

我收到 Pro-Lite 发来的一条简洁消息,暗示显示屏的未来版本旨在明确解决计算机用户的此类需求。

定时器

为了同时显示一个或多个消息,显示屏包含十个名为 A 到 J 的定时器。每个定时器指定一个时间和要按顺序显示的 1 到 32 个页面。您可以在序列中重复页面。序列的显示时间包括星期几、小时和分钟,其中任何一个都可以使用通配符 (*) 来匹配“所有”。

当定义第一个定时器时,显示屏将进入“定时器”模式,并将立即显示该定时器的消息。如果定义了两个或多个定时器,显示屏似乎会等待一分钟,然后检查每个定时器以查看是否根据当前时间触发了定时器。如果是,则在显示消息结束时,新的定时器序列生效。如果没有规则匹配,则不会进行任何更改。

请注意,显示屏检查当前时间的规则。它不会回头尝试查找以前的定时器。因此,如果您将定时器设置为下午 4:15,而现在是下午 4:17,那么您已经错过了显示屏更改的时刻。

如果两个或多个定时器都对当前时间有效,则显示屏会不可预测地选择一个进行显示。这意味着您不能将一个定时器设置为在 4:15 显示,而将另一个定时器设置为在任何小时后的 15 分钟显示。这两个规则都将在 4:15 触发,并且将显示哪个消息是不确定的。

定时器命令定义为 <Tx>dhhmmABC...,其中 x 是定时器,d 是 0(周日)到 6(周六)表示星期几,hh 是两位数的小时,mm 是分钟。“ABC...”是要按指定顺序显示的 1 到 32 个页面的列表。请注意,Page-A 和 Timer-A 是两个不同的、不相关的实体。设置为“*****”的定时器将立即触发。

以下序列将在上午 8:00、中午、下午 1:00 和下午 5:00 显示一系列消息

$ cat > /dev/prolite
<ID01>
<ID01><PA>Good morning.
<ID01><PB>Have a nice lunch.
<ID01><PC>Get back to work.
<ID01><PD>Have a safe drive home.
<ID01><TA>*0800A
<ID01><TB>*1200B
<ID01><TC>*1300C
<ID01><TD>*1700D
ctrl-D

为了显示整个页面序列,只需列出更多页面字母。例如,创建一个方案很有用,您可以在其中将页面字母分配给不同的消息内容。例如,页面 A 可以是每小时公告,页面 R 是您机器的运行时状态,页面 M 是每日消息,页面 T 是时间等等。要立即显示多个页面(包括重复)

$ cat > /dev/prolite
<ID01>
<ID01><TA>*****TAMARA
ctrl-D
两条有趣的小信息
  • 由于某种原因,周日午夜的特定时间(00000 作为定时器值)似乎无法始终如一地工作。我怀疑它会将此值与未设置的定时器混淆。

  • 如果发出 run-page 命令 (<ID01><RPA>),显示屏将退出“定时器”模式并显示请求的页面。如果您然后发出命令 <ID01><RP*>,显示屏将返回“定时器”模式,显示最后的消息序列。

要删除定时器,请使用 <DTx>,其中 x 是定时器字母,或 * 表示所有定时器。例如,要删除定时器 D,请键入
echo "<ID01><DTx>" > /dev/prolite
图形

有 26 个图形块可以重新定义,并且通常用于图形。图形通过标签 <Bx> 插入到文本中,其中 x 是从 A 到 Z 的字母。例如,此命令将显示一个马克杯和一个酒杯

echo "<ID01><PA><BW> Party Tonight <BZ>"
>\
   /dev/prolite

更改图形需要 <Gx> 命令,后跟一个由 126 个字符组成的字符串,这些字符由 R(红色)、Y(黄色)、G(绿色)和 B(黑色或未点亮)组成。在单个命令行上背靠背指定了七行每行十八个 LED 的序列。(见图 4。)

Product Review: Pro-Lite Scrolling Message Signs

图 4. 图形块规范

我知道至少有一位用户将字体加载到一系列图形块中,并以这种方式能够显示比显示屏技术上默认允许的字符更多的字符——非常聪明。

要删除图形块,将其恢复为默认值,请使用 <DGx>,其中 x 是字母 A 到 Z;* 是指示要删除所有图形块的通配符。

冷知识

显示屏的另一个附加功能是按顺序显示一个冷知识问题、您的消息、问题的答案以及您的消息再次出现。它会遍历一个预定义的问答列表,然后重新开始。显示屏可以加载您自己的列表,该列表不必是冷知识。列表最大可达 16KB,为页面留下 16KB。如果未加载列表(即,您删除了冷知识),则显示屏的全部 32KB 可用于页面内容。要制作您自己的列表,请执行以下操作

$ cat > /dev/prolite
<ID01>
<ID01><Q+>
<ID01>What operating system isn't a pig?
<ID01>Linux.
<ID01>What operating system is free?
<ID01>Linux.
<ID01><Q->
Control-D

要删除冷知识,只需省略 <Q+><Q-> 之间的行。如果未加载任何消息,则冷知识模式将关闭。如果已加载,则冷知识模式将打开。

其他有用的命令和技巧

要重置显示屏,删除所有定时器和页面,请像这样使用 <D*>

echo "<ID01><D*>" > /dev/prolite

从技术上讲,没有办法使显示屏停止运行。但是,您可以利用软件中的一个怪癖来做同样的事情。如果您在消息中使用 <FX> 标签来控制显示屏的速度,但不提供消息,则旧文本不会被清除,并且显示屏会停止滚动,直到收到新消息。

功能标签

其他标签在“功能标签”中显示。欧洲标签可用于图 5 中显示的字符。

Product Review: Pro-Lite Scrolling Message Signs

图 5. 可用的欧洲字符

显示屏的用途

使显示屏有用并不需要太多操作。例如,可以通过编辑您的 crontab 文件 (crontab -e) 来包含以下内容,每隔几分钟执行向显示屏发送命令的脚本

*/5 * * * * /usr/local/bin/sign 1> /dev/null \
2> /dev/null

每隔五分钟,系统将调用 /usr/local/bin/sign。在这个脚本中,我们可以放置任意数量的任务。要显示我们的正常运行时间,请添加以下行

#!/bin/bash
stty 0:705:bd:0:3:1c:7f:15:4:0:1:0:11:13:1a:0:12\
:f:17:16:0:0:73 < /dev/prolite
echo "<ID01><PU>'uptime' " > /dev/prolite
echo "<ID01><TA>*****U" > /dev/prolite
如果 root 用户想要查看日志文件的最后一行滚动显示,则此命令就足够了
tail -f -n 1 /var/log/messages |
   awk '{ print "<ID01><PA>" $0 " "; }' >
   /dev/prolite &
此作业在后台运行,从日志末尾获取输入的行,在其前面加上 <ID01><PA> 并将其发送到显示屏。然后,该进程进入休眠状态,直到创建另一个日志条目。以 root 用户身份运行的唯一原因是访问 messages 文件。

通过设置一个几分钟后触发的定时器,显示屏还可以充当我们系统的监视器。理想情况下,显示屏将在定时器触发之前得到更新,并且定时器将再次设置为将来的某个时间。如果显示屏未更新,则定时器会触发并显示备用警报消息。

!/bin/bash
stty 0:705:bd:0:3:1c:7f:15:4:0:1:0:11:13:1a:0:12\
:f:17:16:0:0:73 < /dev/prolite
echo "<ID01><PU><FD>Server Up" > /dev/prolite
echo "<ID01><DTB>" > /dev/prolite
echo "<ID01><TA>00001U" > /dev/prolite
echo "<ID01><TD><FB><CC>Server Down" > \
   /dev/prolite
date "+<ID01><TB>*%H%MD" -date "7 min" > \
   /dev/prolite

要做到这一点,需要一些技巧。首先,您不能使用通用定时器 (<TA>*****) 来运行标准消息,因为它与我们的监视器定时器冲突。其次,我们不能使用定时器 <TA>00000,因为它会使显示屏感到困惑。因此,我们必须使用周日午夜后一分钟 (<TA>00001) 才能显示我们的消息。当未定义定时器时,定义的第一个定时器会显示我们的页面。

删除定时器 B 使我们继续使用定时器 A,后者显示正常文本。显示屏会忽略删除不存在的定时器和页面的请求。一旦定义并显示页面 A,我们在后台定义页面 B 并设置时间,再次使用巧妙的 date 命令在七分钟后输出它。由于我们的 cron 作业设置为每五分钟运行此脚本,因此除非出现问题,否则定时器永远不会触发。

如果 Linux 遭受电源故障、cron 守护进程被杀死或显示屏断开连接,它将显示警告消息。标签 <FD> 表示消息应立即出现而不是滚动,其中 <FB> 表示文本应从中心出现——这将迅速引起您的注意。

有关协议、电缆和显示屏的更多信息,请访问 http://wls.wwco.com/prolite/。该站点还包含用于操作显示屏的各种应用程序的源代码。

Product Review: Pro-Lite Scrolling Message Signs
Walt Stoneburner 目前在 Downright Software, LLC 担任软件工程师。在业余时间,他喜欢使用 Linux、玩非电脑游戏、阅读和评测硬件和开发软件。欢迎通过 wls@wwco.com 或 ICQ# 5368391 与他联系。
加载 Disqus 评论