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

 

    

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值