Android端控制LED屏
今天老师给讲了讲LED屏的协议,写了一个控制LED的程序,为了深入了解,我自己给代码全部加上注释。
布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:gravity="center"tools:context=".MainActivity" ><LinearLayout
android:layout_width="match_parent"android:layout_height="wrap_content" ><TextView
android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="LED显示:" /><EditText
android:id="@+id/et_send"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"><requestFocus /></EditText></LinearLayout><LinearLayout
android:gravity="right"android:layout_width="match_parent"android:layout_height="wrap_content" ><Button
android:id="@+id/btn_send"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="发送" /><Button
android:id="@+id/btn_close"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="关闭led" /><Button
android:id="@+id/btn_exit"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="退出" /></LinearLayout></LinearLayout>
Main:
package com.newland.jni;import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;import com.example.testled.R;/*** @author Gru* */
public class MainActivity extends Activity {LEDManager led;EditText et_send;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);et_send=(EditText) findViewById(R.id.et_send);led=new LEDManager();int com=led.openUart(3, 0, 3);/*if (com>0) {Log.d("日志", "打开串口成功");}*///发送按钮findViewById(R.id.btn_send).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {String data=et_send.getText().toString().trim();led.sendMsgUartSave(data);}});//关闭LEDfindViewById(R.id.btn_close).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {led.sendMsgUartSave("");}});//退出程序findViewById(R.id.btn_exit).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {led.closeUart();System.exit(0);}});}protected void onDestroy() {led.closeUart();super.onDestroy();}
}
Linuxc类(重写调用libuart.so库的方法)
package com.newland.jni;/*** @author Gru* */
public class Linuxc {static {System.loadLibrary("uart");}/* 打开串口* 参数1:comId(那个com口)* 参数2: Mode: 区分是USB串口还是COM 串口,0 表示COM,1 表示 USB,2 表示是低频与超高频*/public static native int openUart(int comId, int mode);/* 关闭串口 * 参数:openUart()返回的句柄*/public static native void closePort(int uartId);/* 设置串口波特率* 参数1:openUart()方法返回的句柄* 参数2:baud(波特率) baudRate:(0-9) 波特率 0=1200 1=2400 2=4800 3=9600 * 4=19200 5=38400 6=57600 7=115200 8=230400 9=921600*/public static native int setUart(int uartId, int b);public static native int sendMsgUart(int a, String b);/* 通过串口发送ascii码命令* 参数1:openUart()返回的句柄;* 参数2:ascii码字符串;* 参数3:字符串的长度 参数2.length();*/public static native int sendMsgUartHex(int a, String b, int c);public static native int sendMsgUartPrint(int a, byte[] b, int c);public static native String receiveMsgUart(int a);public static native String receiveMsgUartHex(int a);public static native String receiveMsgUartStr(int a);public static native int receiveMsgUartHex(int a, int b, byte[] c);public static native String ModBusReceiveMsgUartUts(int a);public static native int ModBusSendMsgUart(int a, String b);
}
实现功能的类LEDManager():
package com.newland.jni;import java.io.UnsupportedEncodingException;import android.util.Log;/*** @author Gru**/
public class LEDManager {/* 圆心条屏通讯协议一、通讯口参数:波特率9600bps、无校验位、8数据位、1停止位;二、发送数据格式协议:格式:0xAA + 地址 + 0xBB + 0x51 + 0x54 + 数据累加和 + 数据 + 结束0xFF说明:0xAA:固定引导码1地址:硬件地址1-255,必须为控制卡的实际地址,或广播地址255 //第二个字节 地址0xBB:固定引导码20x51:命令码10x54:命令码2 //前5个字节固定的数据累加和:红色标示部份所有字节的累加和,取低位字节 //第6个字节数据:播放方式 + 速度 + 停留 + 颜色 + 总显示时间 + 显示文本内容播放方式:见附表 //第7个字节速度:0-7,八级速度 //第8个字节停留:0-99,单幅停留时间,>=99表示永久停留(单幅页面) //第9个字节颜色:0-红色,1-绿色,2-黄色 //第10个字节数据总有效时间:本条指定的数据的有效时间(数据页可能有多幅页面) //第11个字节显示文本内容:汉字内码(GB2312)或ASCII字符;结束码:0xFF通讯返回值:指令下行,控制正确接收并处理后,返回:0x1B,其余返回均为错误AA 01 BB 51 54 72 01 00 00 02 63 41 42 BB B6 D3 AD B9 E2 C1 D9 31 32 FF显示屏地址:1,速度最快:0,颜色: 黄,数据总有效时间99,内容:AB欢迎光临12附表:条屏小卡播放方式表:1 -- 左移2 -- 上移3 -- 下移4 -- 下覆盖5 -- 上覆盖6 -- 翻白显示7 -- 闪烁显示8 -- 立即打出*/int uartId=-1; //串口句柄char[] start=null; //固定开头char[] end={0xff}; //固定结束码char cPlayMode='\001'; //播放方式char cSpeed='\000'; //速度:0-7,八级速度char cRemain='\000'; //停留:0-99,单幅停留时间,>=99表示永久停留(单幅页面)char cValidTime='c'; //数据总有效时间:本条指定的数据的有效时间(数据页可能有多幅页面)public LEDManager(){start=new char[]{0xaa,0x01,0xbb,0x51,0x54,'r'};}public int openUart(int comId,int mode,int baud){uartId=Linuxc.openUart(comId, baud);Linuxc.setUart(uartId, baud);return uartId;}public void closeUart(){if(uartId!=-1){Linuxc.closePort(uartId);}}/*************************************** 方法名称:sendMsgUartSave() * 功能描述:将传递来的字符串转化为协议格式,利用Linuxc.sendMsgUartHex()方法发送 * 参数说明:字符数组 返回值:Linuxc.sendMsgUartHex句柄;**************************************/public int sendMsgUartSave(String data){if(uartId<0){return 0;}else{char[] chardata={cPlayMode,cSpeed,cRemain,'\000',cValidTime}; //播放设置char[] strdata=getEnCode(data); //LED显示的内容char[] char2data=byteMerger(chardata, strdata); //数据=播放设置+LED显示的内容start[5]=getAddchar(char2data); //计算累加和char[] char3data=byteMerger(start, char2data); //固定开始字节+数据char[] senddata=byteMerger(char3data, end); //完整的命令字符数组String str=String.valueOf(senddata); //转化为字符串//Log.d("日志", "数据格式生成="+str);int uart=Linuxc.sendMsgUartHex(uartId, str, str.length()); //通过串口发送,返回:0x1B,其余返回均为错误/*if(uart==0x1B){Log.d("日志", "发送成功");}else{Log.d("日志", "失败,返回值"+uart);}*/return uart;}}/*************************************** 方法名称:getAddchar() 功能描述:计算字符数组累加和取低八位 * 参数说明:字符数组 返回值:char**************************************/private char getAddchar(char[] a) {char b='\000';for (int i = 0; i < a.length; i++) {b = (char)(b+a[i]);}b=(char) (b&0xff);return 0;}/*************************************** 方法名称:getEnCode() 功能描述:将字符串转化成ascii码并返回字符数组* 参数说明:@param data**************************************/private char[] getEnCode(String data) {char[] endcode=new char[0];if(data.length()>0){for (int i = 0; i < data.length(); i++) {char[] temp = getCharCode(data.substring(i, i+1));endcode=byteMerger(endcode,temp);}}return null;}/*************************************** 方法名称:byteMerger() 功能描述:字符数组相加* 参数说明:字符数组a,字符数组b 返回值:相加后的字符数组**************************************/private char[] byteMerger(char[] a, char[] b) {char[] c=new char[a.length+b.length];System.arraycopy(a, 0, c, 0, a.length);System.arraycopy(b, 0, c, a.length, b.length);return c;}/*************************************** 方法名称:getCharCode() 功能描述:将传过来的字符串转化为ASCII编码* 参数说明:字符串Stirng 返回值:字符数组char[]**************************************/private char[] getCharCode(String str) {try {if(str.length()>0){byte[] bt=str.getBytes("GBK");char[] strchar=new char[bt.length];for (int i = 0; i < bt.length; i++) {strchar[i] = ((char)bt[i]);}return strchar;}} catch (UnsupportedEncodingException e) {e.printStackTrace();}return null;}
}
注意包名要和libuart.so的包名一样不然会报错
附:圆心条屏通讯协议;
就酱
Android端控制LED屏相关推荐
- Android 控制LED 屏
翻电脑,发现2013年做的安卓控制LED屏软件,那个时候物联网还没这么火热,APP控制设备也没怎么普遍,刚刚到公司自己给公司做的第一项目就是这个APP,没有美工,界面什么哒都是自己瞎弄的.纪念一下
- android h5控制锁屏,WebView播放H5课件时,锁屏解锁后,页面重新绘制的问题
难题描述:H5页面播放 ,锁屏,解锁后,重新加载了页面,三星不会出现(onpause onstop ,onresume),但在小米.魅族会调用 onpause onstop ondestroy,onr ...
- Android端恶意锁屏勒索应用分析
一.前言 5月12日,一场全球性互联网灾难悄然而至,一款名为WannaCRY的PC端恶意勒索软件利用NSA泄漏的危险漏洞"永恒之蓝",给100多个国家和地区10万台电脑造成了巨大的 ...
- Android应用控制LED(静态编译LED驱动)
此文章是Android应用控制底层硬件的小实验,记录下来,以防后面忘记如何操作.后面也可以按照此流程进行其他开发 开发平台:DMATEK PAD-4412 内核:Linux3.2.0 系统:An ...
- android播放器全屏,Android端实现全屏播放的解决办法
之前碰到过视频播放全屏的问题,但是并没有很好解决,后面做网站时用到过一款视屏播放插件jwplayer,后面把它嵌入mui中实现全屏播放了,仅Android端测试,ios未测试. Loading the ...
- 如何使用Arduino和HM-10蓝牙模块实现Android App控制LED
蓝牙是最受欢迎且易于使用的无线技术之一.几年来,蓝牙标准进行了许多升级,以跟上当前正在发生的技术改变与未来技术的步伐,并满足用户的需求.从蓝牙1.0版本到蓝牙5.0版本,有很多变化,包括更高的数据速率 ...
- python控制led屏_python轮询机制控制led实例
我就废话不多说了,大家还是直接看代码吧! # -*- coding:utf-8 -*- # File: ceshitianqi import urllib2 import json import ti ...
- c#如何集成控制Led屏,实现数据发送自动开机、关机等操作!
软件运行截图 1.主程序源码: using System; using System.Collections.Generic; using System.ComponentModel; using S ...
- android蓝牙控制led,七,ESP32 android蓝牙控制LED
释放双眼,带上耳机,听听看~! 一.介绍 今天我们将制作一个很酷的多彩项目,我们将使用ESP32微控制器通过蓝牙控制rgb LED.简单来说,我们将通过手机控制RGB-LED. ESP内置有低功耗蓝牙 ...
最新文章
- rediscluster全局数据_设计数据密集型应用(6-7):分片、事务
- hdu 1224 最长路
- Red Hat Linux 挂载外部资源
- MAMP Pro for Mac(PHP/MySQL开发环境)
- AutoIt:工具栏中没有其它工具,eg,Koda
- 常用公共数据集----数据获取
- 西门子1200控制V90伺服,西门子1200通过PN通讯控制V90伺服,程序控制采用FB285功能块
- win7下 文件名太长无法删除,无法更名问题
- VS2015+MATLAB2016b混合编程
- 解决安装Ubuntu系统卡在载入界面,显示正在安装open vm tools
- petgo.jp狗粮
- python写名字-python写心形名字
- 如何做互联网广告代理?市场前景如何
- 编译好的GDAL库,支持ECW格式,支持proj,支持geos
- 【算法理论】bin packing 装箱问题
- Spring和Spring Boot区别
- 计算机管理win18,推荐:很多人不全知道的Windows7的19个新特性
- 邮件服务器WinWebMail 3.7.1.1 企业版安装/注册机使用方法
- 2019华为软件精英挑战杯参赛总结
- Android仿IOS吸边弹簧阻尼移动组件SpringMovingView-自定义view系列(3)