现在大部分LG电视都自带一个串口(RS232),其实通过这个串口可以完全操纵LG电视,并且功能比用遥控器强大。通过利用串口发送指令,可以对电视进行一些简单操作比如开关电视,调整音量,调换频道。也可以进行复杂控制比如调台。除此之外还能实现一些遥控器实现不了的功能,比如黑屏(screenmute),锁屏(之后遥控器和电视面板按钮将不起作用)。通过串口还可以发送每个按钮指令,所以功能上能完全替代电视遥控器。
具体细节官方提供了一个文档,可以在我的资源页面里下载http://download.csdn.net/detail/shallen320/8572513
命令格式
一般是PC给电视发送命令,PC是串口连接的主,电视是从。PC发出的命令格式是[命令][空格][目标设备号][空格][数据(多字节)][回车] 方括号只是用于分段,不是实际命令的一部分
[命令]: 2字节的命令.不同功能指令这部分不一样比如电源控制是ka,调整音量是kc
[目标设备号]: 一般LG电视默认是1,这个数字可以在电视选项里设置.如果用0的话是发送给连接的所有LG电视.注意PC是可以连接多个LG电视的.有的电视有2个串口,这样PC就能串接多个LG电视.
[数据]:指令的数据部分,可以是多字节. 对于有些指令,数据段为“FF”能查询该指令状态。比如调整音量指令,数据段为“FF”能查询当前音量。
[回车]:ASCII码的0x20,必不可少,电视靠该字符来识别数据包末尾
电视收到格式正确的命令后会应答,应答格式为[指令后一字节][空格][设备号][OK/NG][数据][x]
[指令后一字节]:发送的2字节指令后一字节
[OK/NG]:指令状态. OK代表指令有效,NG(No Good)代表指令无效。
[x]固定字符x
硬件连接
我使用了一个USB-RS232转换器,一头接PC的USB口,另一头接LG电视后面的串口接口
连接测试
使用任意一个串口终端就能进行指令的收发。我使用了windows自带的超级终端hyperterminal。使用hyperterminal设置好串口。我的串口是com4,就在属性里选择com4。按照官方说明,设置波特率为9600,8字节,无奇偶校验,1位停止位。基本都是默认值。除此之外在ASCII设置里我还勾上了Echotyped characters locally,这样自己能看到自己的输入。还勾上了Send line ends with line feeds这样能换行更易于阅读。
设置好之后测试了下电源控制命令,能控制电视启动,关闭,证明硬件连接已经就绪。图中ka 0 1是开机指令。a01 OK01x是电视的应答,说明设备号是01,指令有效,该命令当前值是01.
控制软件编程实现
硬件就绪后就可以开始着手软件编程了。Windows自带有控制串口的API,不过比较复杂,有兴趣的读者可以参考微软95年的一篇文章,时隔二十年,该文章仍然被认为串口编程的教科书:
https://msdn.microsoft.com/en-us/library/ff802693.aspx
我开始就打算利用Qt实现控制软件的图形界面部分,后来发现Qt本身就有对串口的良好支持。Qt内部有QtSerial Port库来实现对串口的读写。并且还提供一个串口终端的范例:
http://doc.qt.io/qt-5/qtserialport-terminal-example.html
所以我决定利用这个范例,在此基础上添加对LG电视的控制界面。
加入控制界面并不难,因为这个qt范例已经把底层的串口通信实现了。我在tools下加入了两个菜单选项,TVControl选项提供电视整体控制,Remote选项模拟电视的遥控器(见下图)
总结
LG业界良心,提供了串口连接来控制电视。使用串口能用电脑完全控制LG电视。试想一下加入网络功能的话可以甚至利用办公室的电脑或手机在外地控制家里的电视。(想一想都有点小激动呢)
转载请注明。