2024年安卓最全Android 串口开发(一) 串口读写操作,2024年最新java jvm面试

最后

想要了解更多关于大厂面试的同学可以点赞支持一下,除此之外,我也分享一些优质资源,包括:Android学习PDF+架构视频+源码笔记高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 这几块的内容。非常适合近期有面试和想在技术道路上继续精进的朋友。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

/**

  • 标记当前串口状态(true:打开,false:关闭)

**/

public static boolean isFlagSerial = false;

public static SerialPort serialPort = null;

public static InputStream inputStream = null;

public static OutputStream outputStream = null;

public static Thread receiveThread = null;

public static String strData = “”;

public static Handler mHandler;

/**

  • 打开串口

*/

public static boolean open() {

boolean isopen = false;

if(isFlagSerial){

LogUtils.e(TAG,“串口已经打开,打开失败”);

return false;

}

try {

serialPort = new SerialPort(new File(“/dev/ttyS3”), 115200, 0);

inputStream = serialPort.getInputStream();

outputStream = serialPort.getOutputStream();

receive();

isopen = true;

isFlagSerial = true;

} catch (IOException e) {

e.printStackTrace();

isopen = false;

}

return isopen;

}

/**

  • 关闭串口

*/

public static boolean close() {

if(isFlagSerial){

LogUtils.e(TAG,“串口关闭失败”);

return false;

}

boolean isClose = false;

LogUtils.e(TAG, “关闭串口”);

try {

if (inputStream != null) {

inputStream.close();

}

if (outputStream != null) {

outputStream.close();

}

isClose = true;

isFlagSerial = false;//关闭串口时,连接状态标记为false

} catch (IOException e) {

e.printStackTrace();

isClose = false;

}

return isClose;

}

/**

  • 发送串口指令

*/

public static void sendString(String data, Handler handler) {

mHandler = handler;

if (!isFlagSerial) {

LogUtils.e(TAG, “串口未打开,发送失败” + data);

return;

}

try {

outputStream.write(ByteUtil.hex2byte(data));

outputStream.flush();

LogUtils.e(TAG, “sendSerialData:” + data);

} catch (IOException e) {

e.printStackTrace();

LogUtils.e(TAG, “发送指令出现异常”);

}

}

/**

  • 接收串口数据的方法

*/

public static void receive() {

if (receiveThread != null && !isFlagSerial) {

return;

}

receiveThread = new Thread() {

@Override

public void run() {

while (isFlagSerial) {

try {

byte[] readData = new byte[32];

if (inputStream == null) {

return;

}

int size = inputStream.read(readData);

if (size > 0 && isFlagSerial) {

strData = ByteUtil.byteToStr(readData, size);

LogUtils.e(TAG, “readSerialData:” + strData);

}

} catch (IOException e) {

e.printStackTrace();

}

}

}

};

receiveThread.start();

}

}

这个类就比较重要了,打开串口、关闭串口、读写操作,都在这个类里面写了详细的注释,另外下面在贴一个工具类出来

package com.sqy.scancode.util;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.util.Base64;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStream;

import Decoder.BASE64Decoder;

import Decoder.BASE64Encoder;

/**

  • Created by Administrator on 2018/6/15.

*/

public class ByteUtil {

/**

  • 字符串转化成为16进制字符串

  • @param s

  • @return

*/

public static String strTo16(String s) {

String str = “”;

for (int i = 0; i < s.length(); i++) {

int ch = (int) s.charAt(i);

String s4 = Integer.toHexString(ch);

str = str + s4;

}

return str;

}

/**

  • 16进制转换成为string类型字符串

  • @param s

  • @return

*/

public static String hexStringToString(String s) {

if (s == null || s.equals(“”)) {

return null;

}

s = s.replace(" ", “”);

byte[] baKeyword = new byte[s.length() / 2];

for (int i = 0; i < baKeyword.length; i++) {

try {

baKeyword[i] = (byte) (0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16));

} catch (Exception e) {

e.printStackTrace();

}

}

try {

s = new String(baKeyword, “UTF-8”);

new String();

} catch (Exception e1) {

e1.printStackTrace();

}

return s;

}

/**

  • 向串口发送数据转为字节数组

*/

public static byte[] hex2byte(String hex) {

String digital = “0123456789ABCDEF”;

String hex1 = hex.replace(" ", “”);

char[] hex2char = hex1.toCharArray();

byte[] bytes = new byte[hex1.length() / 2];

byte temp;

for (int p = 0; p < bytes.length; p++) {

temp = (byte) (digital.indexOf(hex2char[2 * p]) * 16);

temp += digital.indexOf(hex2char[2 * p + 1]);

bytes[p] = (byte) (temp & 0xff);

}

return bytes;

}

/**

  • 接收到的字节数组转换16进制字符串

*/

public static String bytes2HexString(byte[] b, int size) {

String ret = “”;

for (int i = 0; i < size; i++) {

String hex = Integer.toHexString(b[i] & 0xFF);

if (hex.length() == 1) {

hex = ‘0’ + hex;

}

ret += hex.toUpperCase();

}

return ret;

}

public static String bytesToHexString(byte[] src) {

StringBuilder stringBuilder = new StringBuilder(“”);

if (src == null || src.length <= 0) {

return null;

}

for (int i = 0; i < src.length; i++) {

int v = src[i] & 0xFF;

String hv = Integer.toHexString(v);

if (hv.length() < 2) {

stringBuilder.append(0);

}

stringBuilder.append(hv);

}

return stringBuilder.toString();

}

/**

  • 接收到的字节数组转换16进制字符串

*/

public static String byteToStr(byte[] b, int size) {

String ret = “”;

for (int i = 0; i < size; i++) {

String hex = Integer.toHexString(b[i] & 0xFF);

if (hex.length() == 1) {

hex = ‘0’ + hex;

}

ret += hex.toUpperCase();

}

return ret;

}

/**

  • BASE64码解密成图片

*/

public static Bitmap Base64ToImage(String imgStr) { // 对字节数组字符串进行Base64解码并生成图片

BASE64Decoder decoder = new BASE64Decoder();

Bitmap bitmap = null;

try {

// Base64解码

byte[] b = decoder.decodeBuffer(imgStr);

for (int i = 0; i < b.length; ++i) {

if (b[i] < 0) {// 调整异常数据

b[i] += 256;

}

}

bitmap = BitmapFactory.decodeByteArray(b,0,b.length);

return bitmap;

} catch (Exception e) {

LogUtils.e(“TAG”,“解析异常”);

return bitmap;

}

}

/**

  • 将图片转换为base64加密数据

*/

public static String ImageToBase64(String imgFile) {

InputStream in = null;

byte[] data = null;

try {

in = new FileInputStream(imgFile);

data = new byte[in.available()];

in.read(data);

in.close();

} catch (IOException e) {

LogUtils.e(“TAG”,“加密异常”);

e.printStackTrace();

}

BASE64Encoder encoder = new BASE64Encoder();

return encoder.encode(data);

}

/**

  • 计算CRC16校验码

  • 逐个求和

  • @param bytes 字节数组

  • @return {@link String} 校验码

  • @since 1.0

*/

public static String getCRC_16(byte[] bytes) {

int CRC = 0x0000ffff;

int POLYNOMIAL = 0x0000a001;

int i, j;

for (i = 0; i < bytes.length; i++) {

CRC ^= ((int) bytes[i] & 0x000000ff);

for (j = 0; j < 8; j++) {

if ((CRC & 0x00000001) != 0) {

CRC >>= 1;

CRC ^= POLYNOMIAL;

} else {

CRC >>= 1;

}

}

}

if (Integer.toHexString(CRC).toUpperCase().length() == 2) {

return byteToStr(bytes, bytes.length) + “00” + Integer.toHexString(CRC).toUpperCase();

} else if (Integer.toHexString(CRC).toUpperCase().length() == 3) {

return byteToStr(bytes, bytes.length) + “0” + Integer.toHexString(CRC).toUpperCase();

}

return byteToStr(bytes, bytes.length) + Integer.toHexString(CRC).toUpperCase();

}

/**

  • 指令校验和,并取出后两位字节

  • */

public static String getSum16(byte[] msg, int length) {

long mSum = 0;

byte[] mByte = new byte[length];

/** 逐Byte添加位数和 */

for (byte byteMsg : msg) {

long mNum = ((long) byteMsg >= 0) ? (long) byteMsg : ((long) byteMsg + 256);

mSum += mNum;

} /** end of for (byte byteMsg : msg) */

/** 位数和转化为Byte数组 */

for (int liv_Count = 0; liv_Count < length; liv_Count++) {

mByte[length - liv_Count - 1] = (byte) (mSum >> (liv_Count * 8) & 0xff);

} /** end of for (int liv_Count = 0; liv_Count < length; liv_Count++) */

return byteToStr(msg, length) + byteToStr(mByte, mByte.length).substring(byteToStr(mByte, mByte.length).length() - 4, byteToStr(mByte, mByte.length).length());

}

}

4、demo下载地址 : https://github.com/z-jc/ScanCode   里面可能还会有一些别的功能,需要的话自行下载

5、另外再提供一个自己封装好的module,https://github.com/z-jc/SerialProject-master,app导入module

然后在activity内直接这样调用

最后

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

腾讯、字节跳动、阿里、百度等BAT大厂 2019-2021面试真题解析

资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

sdn.net/20180721091700752?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMyMTM2ODI3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

然后在activity内直接这样调用

最后

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

[外链图片转存中…(img-eWVh2wiE-1715730196573)]

腾讯、字节跳动、阿里、百度等BAT大厂 2019-2021面试真题解析

[外链图片转存中…(img-kljwNYbh-1715730196574)]

资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,我无法提供完整的2024Java面试题及答案,因为我无法预测未来的情况。但是,我可以给你提供一些常见的Java面试题和答案,帮助你准备面试。 1. Java中的基本数据类型有哪些? 答案:Java中的基本数据类型包括byte、short、int、long、float、double、boolean和char。 2. Java中的包装类是什么? 答案:包装类是一种将基本数据类型封装成对象的类。例如,Integer是封装int类型的包装类。 3. Java中的String类是可变的吗? 答案:String类是不可变的,一旦创建就不能被修改。如果需要修改字符串,可以使用StringBuilder或StringBuffer类。 4. Java中的继承和接口有什么区别? 答案:继承是指一个类从另一个类获取属性和方法的过程,通过extends关键字实现。接口是一种规范,定义了一组方法的集合,通过implements关键字实现。 5. Java中的异常处理机制是什么? 答案:Java中的异常处理机制通过try-catch-finally语句块来实现。try块中包含可能抛出异常的代码,catch块用于捕获并处理异常,finally块用于执行无论是否发生异常都需要执行的代码。 6. Java中的多线程是如何实现的? 答案:Java中的多线程可以通过继承Thread类或实现Runnable接口来实现。另外,还可以使用线程池来管理和调度线程。 7. Java中的反射是什么? 答案:反射是指在运行时动态获取和操作类的信息。通过反射,可以获取类的属性、方法和构造函数等信息,并且可以在运行时调用这些方法。 8. Java中的泛型是什么? 答案:泛型是一种参数化类型的机制,可以在编译时检查类型的安全性。通过使用泛型,可以使代码更加灵活和可重用。 9. Java中的集合框架有哪些? 答案:Java中的集合框架包括List、Set、Map等接口和它们的实现类。这些集合类提供了一组用于存储和操作对象的方法。 10. Java中的内存管理是如何工作的? 答案:Java中的内存管理由Java虚拟机(JVM)负责。JVM使用垃圾回收机制来自动管理内存,当对象不再被引用时,垃圾回收器会自动回收该对象所占用的内存空间。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值