Android 串口通讯

释放双眼,带上耳机,听听看~!

最近遇到Android通过RS232 串口通讯来控制摄像头的需求,在这里整理记录一下供大家参考。

串口通讯和服务器之间的通讯是一样的,都是传一些参数过去,然后返回一些数据回来。不过串口通讯管这些参数叫做指令,而这些指令是由硬件的通讯协议而定的,通讯协议不同,指令自然也不同。在我开发的这个项目里,兼容了四种硬件通讯协议,这四种协议各不相同。

1.    导入.so包,并配置.gradle

sourceSets {
main {
assets.srcDirs = ['assets']
jniLibs.srcDirs = ['libs']
}
}

2. 新建android_serialport_api 包。注意必须是java跟目录而且包名确定不能增加减少。导入SerialPort与SerialPortFinder类(稍后附上Demo有源码)。

3. 控制摄像头一些指令

String _Up = "8101060107070301FF";    //向上
String _Down = "8101060107070302FF";  //向下
String _Left = "810106010E0E0103FF";  //向左
String _Right = "810106010E0E0203FF"; //向右
String _Stop = "8101060103030303FF";  //停止
String _Reset = "8101043F025AFF";     //复位
String _Focus_Big = "8101040723FF";   //焦点变大
String _Focus_Small = "8101040733FF"; //焦点变小
String _Focus_Stop = "8101040700FF";  //焦点变小
String _Cam_Pre = "8101043803FF";
String _Cam_Near = "8101040833FF";    //焦点聚近
String _Cam_Far = "8101040823FF";     //焦点聚远
String _Cam_Stop = "8101040800FF";    //停止聚焦
 

4.打开串口

 /**
* 打开串口,接收数据
* 通过串口,接收单片机发送来的数据
*/
public boolean openSerialPort(String port) {
try {
Log.e("串口","--------openSerialPort--------"+port);
serialPort = new SerialPort(new File("/dev/"+port), 9600, 0);
//            serialPort = new SerialPort(new File("/dev/ttyUSB0"), 9600, 0);
//            serialPort = new SerialPort(new File("/dev/ttyGS2"), 9600, 0);
//调用对象SerialPort方法,获取串口中"读和写"的数据流
inputStream = serialPort.getInputStream();
outputStream = serialPort.getOutputStream();
Log.e("串口",inputStream +"////" +outputStream+"");
isStart = true;
} catch (IOException e) {
e.printStackTrace();
Log.e("串口1","--------Cant_openSerialPort--------");
Log.e("串口","--------------"+e.toString());
return  false;
}
getSerialPort();
return true;
}

5.关闭串口

/**
* 关闭串口
* 关闭串口中的输入输出流
*/
public void closeSerialPort() {
Log.i("test", "关闭串口");
try {
if (inputStream != null) {
inputStream.close();
}
if (outputStream != null) {
outputStream.close();
}
isStart = false;
} catch (IOException e) {
e.printStackTrace();
}
}

6.收发指令

 /**
* 发送数据
* 通过串口,发送数据到单片机
*
* @param data 要发送的数据
*/
public void sendSerialPort(String data) {
try {
byte[] sendData = DataUtils.HexToByteArr(data);
outputStream.write(sendData);
outputStream.flush();
} catch (IOException e) {
Log.e("失败了","失败了");
//            e.printStackTrace();
}
}
private void getSerialPort() {
if (mReceiveThread == null) {
mReceiveThread = new ReceiveThread();
mReceiveThread.start();
}else {
return;
}
}
/**
* 接收串口数据的线程
*/
private class ReceiveThread extends Thread {
@Override
public void run() {
super.run();
//条件判断,只要条件为true,则一直执行这个线程
while (isStart) {
if (inputStream == null) {
return;
}
byte[] readData = new byte[1024];
try {
int size = inputStream.read(readData);
if (size > 0) {
String readString = DataUtils.ByteArrToHex(readData, 0, size);
//                        EventBus.getDefault().post(readString);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

Demo  :  https://download.csdn.net/download/csdndouniwan/11141073

人已赞赏
Android文章

Android----搜索历史(带区分切换用户id)

2020-3-19 21:23:55

Android文章

android 动态添加View

2020-3-19 21:40:05

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
有新消息 消息中心
搜索