Android串口通信

关于串口通信的原理这篇博客讲的相对比较简单易懂: http://blog.csdn.net/qiwenmingshiwo/article/details/49557889,适合刚接触的同学,本片主要与大家分享一下如果具体使用,使得的自己所要开发的串口通信功能跑起来,也是菜鸟一枚,如果不对的地方请大神指教


一、串口调试工具 

最好是下载一个串口调试工具先对自己的板子测试一下,明确自己到底有那些串口串口及路径,我使用的这个工具,大家可以尝试一下:http://www.cr173.com/soft/66999.html

并且找到了相应的源码:http://download.csdn.net/download/asqwduanfeng/9676069,其实也就是谷歌提供的,大神改造了成功运行在AS上的,感谢一下大神.

二、如果使用google提供的Serial port API

1.导入so文件

在主目录文件夹下建一个jniLibs文件夹,将需要的依次导入即可



2、在主目录下建立cpp,用于存储JNI相关的C代码




之后必须在build.gradle下修改CMakeLists的路径

    externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"
        }
    }

修改完成之后,如果编译会自动生成一个如下的文件,无需修改,提交代码的时候ignore就OK




3、修改cpp下的Serialport.c和Serialport.h的内容,修改如下



将包名替换为项目的包名,类名只要是你自己命名的类,一般都是copy的,所以不用改,AS中crtl +R,搜索包名,然后将其全部替换为自己的包名即可,包名是

AndroidManifest下的,见下图


4.下载NDK,和CMAKE




使用

打开串口:

串口路径:“/dev/ttMT1”

波特率:9600

这两个参数必须不配置正确,否则无法使用,一般每个厂商会有自己特定的规定,具体会有文档说明,如果文档说明不清楚,就要主动去沟通,一定得问明白,能不能用就看这两个参数了

//打开串口
public SerialPort getSerialPort() throws SecurityException, IOException, InvalidParameterException {
    if (mSerialPort == null) {
        mSerialPort = new SerialPort(new File("/dev/ttyMT1"), 9600, 0);
        Log.d(TAG,"getSerialPort执行了");
    }
    return mSerialPort;
}


发送数据和接收数据:一般是16进制的,具体要根据说明文档按照人家规定的帧格式去操作,包括接收到的数据的处理也是如此,如果接收的有分高8位和低8位的,高8位的一定得左移8位之后和低8位一起处理,这样的数据才合理:

 //发送数据
    public void send(byte[] sendCmd) {
        Log.d(TAG,"====sendCmd======" + sendCmd);
        if (sendCmd == null && sendCmd.length == 0) {
            return;
        }
        Message message = Message.obtain();
        message.obj = sendCmd;
        sendingHandler.sendMessage(message);
    }

    /**
     * 读取流中的数据
     */
    private class ReadThread extends Thread {

        @Override
        public void run() {
            super.run();
            while (!isInterrupted()) {
                int size;
                try {
                    byte[] buffer = new byte[11];
                    if (mInputStream == null) return;
                    size = mInputStream.read(buffer);
                    if (size > 0) {
                        int i = 0;
                        i++;
                        onDataReceived(buffer, size);
                        Log.d(TAG,"==========i==========" + i);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                    return;
                }
            }
        }
    }
具体的逻辑在onDateReceived中实现,这里的byte[] buffer = new byte[11],  11是根据我们文档中每次发送的字节数来定义的,具体可以根据你自己项目中接收的字节数处理即可。

关闭串口

    //关闭串口
    public void closeSerialPort() {
        if (mSerialPort != null) {
            mSerialPort.close();
            mSerialPort = null;
        }
    }


注意:在实际开发中可能一下open和close会报红,大可不必care,只要功能正常就好了,我做的时候纠结了好长时间,发现没必要

 /**
     * 打开串口设备的方法
     * @param path 设备的绝对路径
     * @param baudrate 波特率
     * @param flags 标志
     * @return
     */
    private native static FileDescriptor open(String path, int baudrate, int flags);
    //关闭设备
    public native void close();

本人菜鸟一枚,大多地方也是借鉴前辈的经验,目前只是在使用这些,具体内部的知识还需再深究,想要走下去NDK这块是必须了解的,如果有好的学习文章或路径欢迎推荐,如果有需要详细代码的请私信我 2966325911@qq.com,或加我QQ2966325911


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值