Android串口通信 - Go语言中文社区

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


版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_34855745/article/details/76322366
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-06-28 03:53:40
  • 阅读 ( 711 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢