最近遇到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