今天老师给讲了讲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屏相关推荐

  1. Android 控制LED 屏

    翻电脑,发现2013年做的安卓控制LED屏软件,那个时候物联网还没这么火热,APP控制设备也没怎么普遍,刚刚到公司自己给公司做的第一项目就是这个APP,没有美工,界面什么哒都是自己瞎弄的.纪念一下

  2. android h5控制锁屏,WebView播放H5课件时,锁屏解锁后,页面重新绘制的问题

    难题描述:H5页面播放 ,锁屏,解锁后,重新加载了页面,三星不会出现(onpause onstop ,onresume),但在小米.魅族会调用 onpause onstop ondestroy,onr ...

  3. Android端恶意锁屏勒索应用分析

    一.前言 5月12日,一场全球性互联网灾难悄然而至,一款名为WannaCRY的PC端恶意勒索软件利用NSA泄漏的危险漏洞"永恒之蓝",给100多个国家和地区10万台电脑造成了巨大的 ...

  4. Android应用控制LED(静态编译LED驱动)

     此文章是Android应用控制底层硬件的小实验,记录下来,以防后面忘记如何操作.后面也可以按照此流程进行其他开发 开发平台:DMATEK PAD-4412 内核:Linux3.2.0 系统:An ...

  5. android播放器全屏,Android端实现全屏播放的解决办法

    之前碰到过视频播放全屏的问题,但是并没有很好解决,后面做网站时用到过一款视屏播放插件jwplayer,后面把它嵌入mui中实现全屏播放了,仅Android端测试,ios未测试. Loading the ...

  6. 如何使用Arduino和HM-10蓝牙模块实现Android App控制LED

    蓝牙是最受欢迎且易于使用的无线技术之一.几年来,蓝牙标准进行了许多升级,以跟上当前正在发生的技术改变与未来技术的步伐,并满足用户的需求.从蓝牙1.0版本到蓝牙5.0版本,有很多变化,包括更高的数据速率 ...

  7. python控制led屏_python轮询机制控制led实例

    我就废话不多说了,大家还是直接看代码吧! # -*- coding:utf-8 -*- # File: ceshitianqi import urllib2 import json import ti ...

  8. c#如何集成控制Led屏,实现数据发送自动开机、关机等操作!

    软件运行截图 1.主程序源码: using System; using System.Collections.Generic; using System.ComponentModel; using S ...

  9. android蓝牙控制led,七,ESP32 android蓝牙控制LED

    释放双眼,带上耳机,听听看~! 一.介绍 今天我们将制作一个很酷的多彩项目,我们将使用ESP32微控制器通过蓝牙控制rgb LED.简单来说,我们将通过手机控制RGB-LED. ESP内置有低功耗蓝牙 ...

最新文章

  1. rediscluster全局数据_设计数据密集型应用(6-7):分片、事务
  2. hdu 1224 最长路
  3. Red Hat Linux 挂载外部资源
  4. MAMP Pro for Mac(PHP/MySQL开发环境)
  5. AutoIt:工具栏中没有其它工具,eg,Koda
  6. 常用公共数据集----数据获取
  7. 西门子1200控制V90伺服,西门子1200通过PN通讯控制V90伺服,程序控制采用FB285功能块
  8. win7下 文件名太长无法删除,无法更名问题
  9. VS2015+MATLAB2016b混合编程
  10. 解决安装Ubuntu系统卡在载入界面,显示正在安装open vm tools
  11. petgo.jp狗粮
  12. python写名字-python写心形名字
  13. 如何做互联网广告代理?市场前景如何
  14. 编译好的GDAL库,支持ECW格式,支持proj,支持geos
  15. 【算法理论】bin packing 装箱问题
  16. Spring和Spring Boot区别
  17. 计算机管理win18,推荐:很多人不全知道的Windows7的19个新特性
  18. 邮件服务器WinWebMail 3.7.1.1 企业版安装/注册机使用方法
  19. 2019华为软件精英挑战杯参赛总结
  20. Android仿IOS吸边弹簧阻尼移动组件SpringMovingView-自定义view系列(3)

热门文章

  1. Vue技术栈(全家桶)
  2. Ant Design的入门使用教程
  3. 挥一挥衣袖,贝索斯宣布“退位”,去追寻“诗和远方”
  4. 用什么方法可以将Word转换成PDF文档?
  5. Arduino与Proteus仿真实例-I2C总线多个M24C01设备数据储存仿真
  6. python use ftp to download/updown
  7. 【宏定义】#define 的使用方法
  8. 如何建立起一套有效的APP监控体系
  9. 联想小新pro16锐龙版和酷睿版的区别 哪个好
  10. 博士入坑必读-A-Z博士(PhD)顺利毕业必读指南