android串口的接受和发送

本文详细介绍了如何在Android应用中使用Java编程处理串口通信,包括初始化SerialPort、数据接收、帧头帧尾判断以及数据发送,涉及到了异常处理和权限依赖。
摘要由CSDN通过智能技术生成

主要java代码

  • 对android串口的接受与发送的主要java代码:
    private SerialPort mSerialPort;
    private OutputStream outputStream;
    private InputStream inputStream;
    private ReadThread readThread;
    String serialPath = "/dev/ttyS0";//联芯芯片串口,tyS1(COM2)

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        try {

            //初始化SerialHelper对象,设定串口名称和波特率
            mSerialPort = new SerialPort(new File(serialPath), 9600, 0);
            outputStream = mSerialPort.getOutputStream();// 打开输出流
            inputStream = mSerialPort.getInputStream();// 打开输入流

            readThread = new ReadThread();
            readThread.start();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

private class ReadThread extends Thread {
        @Override
        public void run() {
            super.run();

            int maxLength = 2048;
            byte[] buffer = new byte[maxLength];
            int size;

            while (!isInterrupted()) {
                try {

                    // 为了一次性读完,做了延迟读取
                    if(inputStream.available() > 0) {
                        SystemClock.sleep(200);
                        size = inputStream.read(buffer);

                        if (size > 0) {
                            onDataReceived(buffer, size);
                        }
                    }

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

 public void onDataReceived(byte[] buffer, int size) {

        // 起始和结束符常量
        byte START_BYTE = (byte) 0xFE;
        if (buffer[0] == START_BYTE){    //接受到帧头
            //帧尾倒数第二个数
            byte END_BYTE2 = (byte) 0xBB;
            //帧尾最后一个数
            byte END_BYTE1 = (byte) 0xBB;
            if (buffer[size-2] == END_BYTE1 && buffer[size-1] == END_BYTE2) {  //接受到帧尾
                //根据条件获取需要发送的中间段
            }
        }
    }


            //结合所有字节发送
            try {
                    //3.将查询到的信息进行分解
                    int getIpFour = Integer.parseInt(listAtBack.get(i).split(",")[5].split("\\.")[3]);
                    int snr = Integer.parseInt(listAtBack.get(i).split(",")[10].replace("\"",""));


                    //需要和校验的数组
                    byte[] sumBuffer = new byte[] {(byte)0xFE, (byte)getIpFour, (byte)snr};
                    //和校验
                    short sumCheck = Util.sumCheck(sumBuffer);

                    //4.结合发送
                    //需要发送的数据
                    byte[] mBuffer = new byte[]{};
                    //获取和校验的2进制值
                    String binary = Integer.toString(sumCheck,2);
                    int targetLength = 16;
                    //补全位数不足16位2进制前面补0
                    if (binary.length()<targetLength) {
                        StringBuilder sb = new StringBuilder();
                        for (int j = 0; j<targetLength - binary.length(); j++) {
                            sb.append("0");
                        }
                        String newBinary = sb + binary;
                        //和校验的第一个字节(10进制方法转byte)
                        int decimal1 = Integer.parseInt(newBinary.substring(0,8),2);
                        //和校验的第二个字节(10进制方法转byte)
                        int decimal2 = Integer.parseInt(newBinary.substring(8,16),2);

                        mBuffer = new byte[] {(byte)0xFE, (byte)getIpFour, (byte)snr, (byte)decimal1, (byte)decimal2, (byte)0xBB, (byte)0xBB} ;
                    }

                    //发送完整协议
                    if (outputStream != null) {
                        if (mBuffer.length == 7) {
                            outputStream.write(mBuffer);
                        }

                    }

                } catch (Exception e ) {
                    e.printStackTrace();
                }

  • 需要的依赖:
   <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
   <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
   <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
   <uses-permission android:name="android.permission.INTERNET" />
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值