最近项目在搞机顶盒这块,也接触了很多硬件知识,特此记录
1:需要设备:
1..android板子:RK3288 安卓一体板(深圳某厂商)
2.中控机:ktv中控控制器 天行的TS-480(会告知
通讯数据参数设定为:波特率4800,数据位:8 位,1位停止位,无校验)
3.测试工具:
2:功能:
中控机控制功能:控制外放设备的麦克风大小,音量大小,静音,话筒音,音调大小等
3:实现:
通过android板子的rs232串口和中控机的rs232连接通讯
需要注意rs232的线序问题,一般有三根线,红白黑,黑接黑(GND地线,红白可以交换对接测试数据是否能正常发送到中控机,我的之前买过来不能正常发送数据,然后自己剪短,红白对调接了数据才正常发送到中控机)
android串口测试工具用来查看盒子和中控机是否串口连接:
项目地址:licheedev/Android-SerialPort-Tool 打开as允许安装,用过其他几个发现没这个好用,按照中控机的通讯参数设置后调试
中控机是需要学习命令的,学习了下次发送同样的命令就知道是做啥了,学习的命令可以自己定,只要能响应的16进制字符都可以的,至于中控厂家给了我一份命令表自己没按去学习估计,但是并不影响,因为只要中控能接收到,命令自己可以定的
学习方式:按中控机某个按钮进入学习,然后按发送命令字符到中控机,再把外放遥控器对准中控机红外感应,你想要这个命令是干啥就按遥控上对应的功能,等中控机几秒存入后,该遥控功能就对应这个命令了,下次不需要遥控直接发这个命令就可以控制中控机器了,也就是命令学习完成,举例:需要一个麦克风加功能:我们定义1E这个16进制命令表示,那么只要发送1E到中机机,然后遥控找到麦克风加按钮,按一下,就学位完成了,命令就绑定了遥控的麦克风加功能,其他功能重复
关于串口通讯的请参考android串口通讯
贴下重要的代码:
/** * 16进制字符转字节 * @param hexString 大于两位的命令 * @return */ public static byte[] fromHexStringToBytes(String hexString) { if ((hexString == null) || (hexString.equals("")) || hexString.length() % 2 != 0) { return null; } else { hexString = hexString.toUpperCase(); int length = hexString.length() / 2; char[] bytec = hexString.toCharArray(); byte[] bit = new byte[length]; for (int i = 0; i < length; i++) { int p = 2 * i; //两个十六进制字符转换成1个字节,第1个字符转换成byte后左移4位,然后和第2个字符的byte做或运算 bit[i] = (byte) (fromCharToByte(bytec[p]) << 4 | fromCharToByte(bytec[p + 1])); } Log.e("link blue", "sned byte="+bit.toString()); return bit; } }
/** * 发送字节到对应的串口 * @param mBuffer * @return */ public boolean sendBuffer(byte[] mBuffer) { boolean result = true; String tail = ""; byte[] tailBuffer = tail.getBytes(); byte[] mBufferTemp = new byte[mBuffer.length+tailBuffer.length]; System.arraycopy(mBuffer, 0, mBufferTemp, 0, mBuffer.length); System.arraycopy(tailBuffer, 0, mBufferTemp, mBuffer.length, tailBuffer.length); try { if (mOutputStream != null) { mOutputStream.write(mBufferTemp); } else { result = false; } } catch (IOException e) { e.printStackTrace(); result = false; } return result; }
3.发送命令
ZKSerialPortUtil.getInstance().sendBuffer(fromHexStringToBytes("1E"));