java:使用RXTXcomm向安卓系统板子的串口进行命令写入

 

最近的任务是用java和一块安卓板子进行交互,读取命令,使用的是RXTXcomm,这个百度一下就有很多资料并且十分简单。

同时你也可以使用SecureCRT这个软件来先与板子进行交互,其中遇到的名词对你后面理解串口设置属性还是有帮助的。

左转,吾爱破解搜索:SecureCRT最新版和中文版

1.使用RXTX流程

1.找到所有可用端口(你要是实先就知道名字了也可以不需要这步)

2.打开某一个串口,并设置属性

3.添加回调,在你输入命令后,会返回系统给你发送数据的回调

4.获取串口的输出流,输出命令

5.在会调里等待回调,并在回调里,打开输入流读取数据

可以写个while重复45,不过建议每一个输入和输出之间都等待50ms

6.关闭串口和释放相关资源

2.注意事项

有两点需要注意的是:

1.命令写入

安卓系统是(UNIX)Linux系统,里面的换行是“\n”,而我们在进行命令写入的时候不能只写入命令,还需要加换行符,就像你输入了命令需要按下ENTER一样

 

SerialUtil.sendToPort(serialPort, (str + "\n").getBytes());

其实str是你输入的命令,如ls,ll之类的。有的命令在安卓系统里是没有的,这点还是得注意下

 

2.数据读取

在你输入命令之后,推荐等待50ms后读取数据,避免数据一段一段的。

一、有的数据是有一定返回的,不会一直打印,如ll,ls。这种命令就可以使用下面一直读取字节方式进行数据读取

 

    /**
     * 从串口读取数据
     *
     * @param serialPort 当前已建立连接的SerialPort对象
     * @return 读取到的数据
     * @throws ReadDataFromSerialPortFailure     从串口读取数据时出错
     * @throws SerialPortInputStreamCloseFailure 关闭串口对象输入流出错
     */
    public static byte[] readFromPort(SerialPort serialPort) throws ReadDataFromSerialPortFailure, SerialPortInputStreamCloseFailure {

        //打开输入流
        InputStream input;
        try {
            input = serialPort.getInputStream();
        } catch (IOException e) {
            throw new ReadDataFromSerialPortFailure();
        }

        byte[] bytes = new byte[1024];
        //因为返回值为byte数组,所以这里采用bite流的方式,同时也方便输入流读取
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        int len;

        try {
            while ((len = input.read(bytes)) > 0) {//这里大于0而不是!=-1,是因为后面会一直传来读取长度为0的读操作,会一直停在这里
                output.write(bytes, 0, len);
            }
        } catch (IOException e) {//读取失败,关闭输入输出流
            try {
                output.close();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            try {
                input.close();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            throw new SerialPortInputStreamCloseFailure();
        }


        //返回,并关闭输入输出流
        try {
            input.close();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        byte[] result = output.toByteArray();
        try {
            output.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

二、有的数据则是会一直打印信息,如logcat,则可用下面的方式:读取一行的字符串,然后一直读取

 

 

                    InputStream input;
                    try {
                        input = serialPort.getInputStream();
                    } catch (IOException e) {
                        e.printStackTrace();
                        break;
                    }
                    InputStreamReader inputReader = new InputStreamReader(input);
                    BufferedReader reader = new BufferedReader(inputReader);
                    String line;
                    try {
                        while ((line = reader.readLine()) != null) {
                            System.out.println(line);
                        }
                    } catch (IOException e) {
                    }
                    try {
                        reader.close();
                    } catch (IOException e1) {
                        e1.printStackTrace();
                    }


不过这种情况,在终端的时候还有用ctrl+c的方式来停止,但是用java的话,目前还没找到办法

 

针对这种情况,我选择的是只打印一定数据的行数,并期望自己想要的数据就在里面,如logcat -t 1000

三、有的数据则是某一行会刷新进度,而不是下一行显示新的进度,如yum命令安装软件的时候,但是安卓里并没有,并且也不在此次任务需求之列,所以有兴趣的朋友可以自己去试试

rxtx包和工具类代码在这:http://download.csdn.net/download/ons_cukuyo/10023567

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值