当前位置: 首页 > article >正文

RK3566RK3568 安卓11 在framework层进行串口通信

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 系列文章目录
  • 前言
  • 一、首先你的串口一定要能正常通讯
  • 二、framework层添加串口通信
    • 1.根据需求找到相关目录
    • 2.先导入所需要的包
    • 3.写上初始化代码
    • 4.新增发送串口的方法
    • 5.在SerialService.java中,openSerialPort通过mSerialPorts[i].equals(path)来比对来打开串口,而mSerialPorts是通过获取config_serialPorts这个String数组,所以我们应该在config_serialPorts中添加dev/ttyS3
    • 6. 我自己需要发送的是字符串还有int用JSONObject来包一下,在interceptKeyBeforeDispatching方法里,业务代码如下
    • PS:到这里就快要结束了,但有些设备可能需要在这里加权限
  • 总结


前言

关于Android系统的串口通信,更多的是在上层app直接调用c,c++来打开串口实现串口的读写操作,但因客户需求,需要在系统层直接来完成对外设的控制,故写此篇文章帮助自己记录。


一、首先你的串口一定要能正常通讯

不能正常通讯的先看看编译文件.rc是否串口没有正常赋权限,第二个是看防火墙有没有关

adb发指令关闭防火墙

setenforce 0

二、framework层添加串口通信

1.根据需求找到相关目录

我这里的需求是需要监听外接屏的两个按键,一个控制升降杆下降,一个控制升降杆上升
这里就很方便了,底层驱动配置好按键上报,只需要在监听按下的键值那里写业务代码即可

路径:V:\Projects\RK3566_A\frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager

2.先导入所需要的包

import android.hardware.SerialPort;
import android.hardware.SerialManager;

import org.json.JSONObject;

import java.nio.ByteBuffer;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.IOException;
import java.io.File;
import org.json.JSONObject;
import org.json.JSONException;

3.写上初始化代码

    private static final String TTYS3_PATH = "dev/ttyS3";
    private static final int BAUD_RATE = 115200;

    private SerialManager mSerialManager;
    private ByteBuffer mInputBuffer;
    private ByteBuffer mOutputBuffer;
    public SerialPort mSerialPort;
    public InputStream mInputStream;
    public OutputStream mOutputStream;

这段记得写在interceptKeyBeforeDispatching方法里

        //初始化
        mSerialManager =(SerialManager)mContext.getSystemService(Context.SERIAL_SERVICE);

        try {
            mSerialPort = mSerialManager.openSerialPort(TTYS3_PATH, 115200);
        } catch (IOException e) {
        }
        mInputBuffer = ByteBuffer.allocate(1024);
        mOutputBuffer = ByteBuffer.allocate(1024);

4.新增发送串口的方法

    //新建发送串口指令函数
    public void sendSerialPort(byte[] data){
        Log.d(TAG,"sendSerialPort data = "+data);
        try {
            mOutputBuffer.clear();
            mOutputBuffer.put(data);
            mSerialPort.write(mOutputBuffer, data.length);
        } catch (IOException e) {
            e.printStackTrace();
            Log.d(TAG, "COM1 OPEN FAILED!");
        }
    }

5.在SerialService.java中,openSerialPort通过mSerialPorts[i].equals(path)来比对来打开串口,而mSerialPorts是通过获取config_serialPorts这个String数组,所以我们应该在config_serialPorts中添加dev/ttyS3

--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -990,6 +990,7 @@
          for example, /dev/ttyUSB0
     -->
     <string-array translatable="false" name="config_serialPorts">
+       <item>dev/ttyS3</item>
     </string-array>

6. 我自己需要发送的是字符串还有int用JSONObject来包一下,在interceptKeyBeforeDispatching方法里,业务代码如下

        // First we always handle the home key here, so applications
        // can never break it, although if keyguard is on, we do let
        // it handle it, because that gives us the correct 5 second
        // timeout.
        if (keyCode == KeyEvent.KEYCODE_HOME) {
            DisplayHomeButtonHandler handler = mDisplayHomeButtonHandlers.get(displayId);
            if (handler == null) {
                handler = new DisplayHomeButtonHandler(displayId);
                mDisplayHomeButtonHandlers.put(displayId, handler);
            }
            return handler.handleHomeButton(focusedToken, event);
        } else if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
            try {
                JSONObject root = new JSONObject();
                root.put("callSn", "calltest0001");
                root.put("type", 6);
                sendSerialPort(root.toString().getBytes(Charset.forName("GBK")));
                Log.e(TAG,"LQX send_down19");
            } catch (JSONException e) {
                // do nothing.
            }

        }
        else if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {
            try {
                JSONObject root = new JSONObject();
                root.put("callSn", "calltest0001");
                root.put("type", 5);
                sendSerialPort(root.toString().getBytes(Charset.forName("GBK")));
                Log.e(TAG,"LQX send_up20");
            } catch (JSONException e) {
                // do nothing.
            }
        }

PS:到这里就快要结束了,但有些设备可能需要在这里加权限

--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -271,6 +271,9 @@
     <!-- Permission to make accessibility service access Bubbles -->
     <uses-permission android:name="android.permission.ADD_TRUSTED_DISPLAY" />
 
+    <!-- Permission to serial port -->
+    <uses-permission android:name="android.permission.SERIAL_PORT" />
+

总结

以上就是今天要讲的内容,本文仅仅简单介绍了串口在framework中的简单使用,如有遗漏,欢迎补充!


http://www.kler.cn/news/148692.html

相关文章:

  • 【LeetCode】70. 爬楼梯
  • 服务器运行train.py报错解决
  • 成功的蓝图:实现长期成长与卓越表现的 6 项策略
  • 如何使用ArcGIS实现生态廊道模拟
  • 针对MySql知识的回顾
  • nodejs 如何将 Buffer 数据转为 String
  • 条形码格式
  • 位运算算法【1】
  • UI自动化的基本知识
  • Hive进阶函数:SPACE() 一行炸裂指定行
  • 【栈和队列(1)(逆波兰表达式)】
  • Ps:子路径的上下排列以及对齐与分布
  • 【开发实践】使用POI实现导出带有复杂表头的的excel文件
  • 璞华大数据产品入选中国信通院“铸基计划”
  • 【开源】基于Vue+SpringBoot的学校热点新闻推送系统
  • 梦极光(ez_re???)
  • MYSQL基础知识之【LIKE子句的使用 ,NULL值的处理,空值的处理】
  • ArrayList和顺序表
  • 服务器中深度学习环境的配置
  • 使用OSS搭建私有云内网yum仓库的方法
  • 盖茨表示GPT-5不会比GPT-4有太大改进;Intro to Large Language Models
  • 羽隔已就之图像处理之BP神经网络入门
  • C++ day36 贪心算法 无重叠区间 划分字母区间 合并区间
  • 计算机网络高频面试八股文
  • 解决Hadoop DataNode ‘Incompatible clusterIDs‘报错
  • 关于Unity中字典在Inspector的显示
  • 一、Lua基础
  • 【C++ 程序设计入门基础】- 第3节-循环结构01
  • Linux配置路由功能及添加静态路由
  • 免费查找文献期刊数据论文网站