如何在Android中读写字符设备(如/dev/ttyS0)

2024-03-20

我对Java和Android知之甚少。我想做的是在 Android 应用程序中打开 /dev/ttyS0,它应该与串行线通信,但我迷路了。

我的设备已root,并且从命令行我可以“echo ...>/dev/ttyS0”并从中读取内容,但我在尝试用Java执行此操作时迷失了方向。首先,我找不到一种方法以简单的读写模式打开文件,而不需要处理缓冲区和其他复杂的问题(显然,我想要无缓冲的 I/O)。

我在互联网上搜索,但所有示例都指的是 USB,这对我来说不可用。然后我找到了 UartDevice 类,但它是一个从中派生正确实现的类......

我尝试使用 File 类,并附加一个 Reader 和 Writer 类,但编译器抱怨,坦率地说,我不确定这是正确的方法。我需要一个框架代码来开始;我怀念一个简单的 TextFile 类,它具有可在同一个打开文件上同时使用的无缓冲 read() 和 write() 方法!

有人能指出我正确的方向吗?谢谢?


经过多次尝试,并在SO网站的大量信息的帮助下,我终于成功完成了任务。这是代码:

public class MainActivity
        extends AppCompatActivity {

    File serport;
    private FileInputStream mSerR;
    private FileOutputStream mSerW;

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

        // let this program to access the serial port, and
        // turn off the local echo. sudo() is a routine found here on S.O.
        sudo("chmod a+rw /dev/ttyS0");
        sudo("stty -echo </dev/ttyS0");
        
        // open the file for read and write
        serport = new File("/dev/ttyS0");
        try {
            mSerR = new FileInputStream(serport);
            mSerW = new FileOutputStream(serport);
        } catch (FileNotFoundException e) {}

        // edLine is a textbox where to write a string and send to the port
        final EditText edLine = (EditText) findViewById(R.id.edLine);
        // edTerm is a multiline text box to show the dialog
        final TextView edTerm = findViewById(R.id.edTerm);
        // pressing Enter, the content of edLine is echoed and sent to the port
        edLine.setOnKeyListener(new View.OnKeyListener() {
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                // If the event is a key-down event on the "enter" button
                if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {
                    // Perform action on key press
                    String cmd = edLine.getText()+"\n";
                    edTerm.append(cmd);
                    byte[] obuf = cmd.getBytes();
                    try {
                        mSerW.write(obuf);
                    } catch  (IOException e)  {}
                    edLine.setText("");

                    // read the reply; some time must be granted to the server
                    // for replying
                    cmd = "";
                    int b=-1, tries=8;
                    while (tries>0) {
                        try {
                            b = mSerR.read();
                        } catch  (IOException e)  {}
                        if (b==-1) {
                            try {
                                Thread.sleep(5);
                            } catch  (InterruptedException e)  {}
                            --tries;
                        } else {
                            tries=3;    // allow more timeout (more brief)
                            if (b==10) break;
                            cmd = cmd + (char) b;
                        }
                    }
                    // append the received reply to the multiline control
                    edTerm.append(cmd+"\n");
                    return true;
                }
                return false;
            }
        });

    }
}

请注意代码中 sudo() 命令的存在:它用于授予 ttyS0 文件读/写权限,并禁用其echo选项。如果这些权限+选项已经正确,或者存在其他设置它们的方法,则不需要 sudo() 命令。

注意:我相信 sudo() 命令意味着设备必须是rooted.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Android中读写字符设备(如/dev/ttyS0) 的相关文章

  • 找不到参数的方法 dependencyResolutionManagement()

    我正在尝试使用老师给我的一个项目 但它显示了一个错误 Settings file Users admin AndroidStudioProjects HTTPNetworking settings gradle line 1 A probl
  • 如何对这个字符串进行子串化

    我想得到这个字符串的 4 个部分 String string 10 trillion 896 billion 45 million 56873 我需要的4个部分是 10万亿 8960亿 4500万 和 56873 我所做的是删除所有空格 然
  • android中向sqlite中插入大量数据

    目前 我必须一次向我的 Android 中插入超过 100 亿条数据 然而 内存不足的问题会使程序崩溃 sqlite 插入测试非常简单 只需使用 for 循环生成 sql 插入命令并通过 开始 和 提交 进行包装 private Array
  • 卸载后 Web 应用程序不显示“添加到主屏幕”

    这是我第一次创建网络应用程序 我设法解决了这个问题 所以我得到了实际的 chrome 提示 将其添加到主屏幕 然后我从手机上卸载了该网络应用程序 因为我想将其展示给我的同事 但是 屏幕上不再出现提示 问题 这是有意为之的行为还是我的应用程序
  • CardView 圆角获得意想不到的白色

    When using rounded corner in CardView shows a white border in rounded area which is mostly visible in dark environment F
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • 获取当前 android.intent.category.LAUNCHER 活动的实例

    我创建了一个库项目 并在多个应用程序之间共享 我实现了一个简单的会话过期功能 该功能将在一段时间后将用户踢回到登录屏幕 登录屏幕活动是我的主要活动 因此在清单中它看起来像这样
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • Ubuntu 16.04 - Genymotion:找不到 /dev/hw_random

    I install Genymotion on the Ubuntu 16 04 64Bit I created a virtual emulator for Android 6 0 then I run this emulator but
  • 如何发布Android .aar源以使Android Studio自动找到它们?

    我正在将库发布到内部 Sonatype Nexus 存储库 Android Studio 有一个功能 可以自动查找通过 gradle 引用的库的正确源 我将 aar 的源代码作为单独的 jar 发布到 Nexus 但 Android Stu
  • 在 android DatePickerDialog 中将语言设置为法语

    有什么办法可以让日期显示在DatePickerDialog用法语 我已经搜索过这个但没有找到结果 这是我的代码 Calendar c Calendar getInstance picker new DatePickerDialog Paym
  • 错误:在根项目“projectName”中找不到项目“app”

    我有一个在 Eclipse 中开发的旧应用程序 现在尝试将其迁移到 Android Studio 我更新了库并遵循了基本步骤 现在 我收到此错误 Error Project app not found in root project pro
  • Android向menuItem添加子菜单,addSubMenu()在哪里?

    我想根据我的参数以编程方式将 OptionsMenu 内的子菜单添加到 menuItem 中 我检查了android sdk中的 MenuItem 没有addSubMenu 方法 尽管你可以找到 hasSubMenu 和 getSubMen
  • 增加活动的屏幕亮度

    显然 Android 操作系统中至少有三种不同的技术可以改变屏幕亮度 其中两个在纸杯蛋糕之后不再起作用 而第三个被接受的技术显然有一个错误 我想在单视图活动开始时增加屏幕亮度 然后在活动结束时将亮度恢复为用户设置 没有按钮 没有第二个视图或
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • 将 Intent 包装在 LabeledIntent 中以用于显示目的

    要求 我的应用程序中有一个 共享 按钮 我需要通过 Facebook 分享 我需要选择是否安装原生 Facebook 应用程序 我们的决定是 如果未安装该应用程序 则将用户发送到 facebook com 进行分享 当前状态 我可以检测何时
  • 将两个文本视图并排放置在布局中

    我有两个文本视图 需要在布局中并排放置 并且必须遵守两条规则 Textview2 始终需要完整显示 如果布局中没有足够的空间 则必须裁剪 Textview1 例子 文本视图1 文本视图2 Teeeeeeeeeeeeeeeeeextview1
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两

随机推荐

  • React ApexCharts 按时间间隔更新图表

    我正在构建一个 React 应用程序 它将显示一些需要通过 api 调用不断更新的图表 使用 ApexCharts 它们将显示来自不同来源的传感器数据 我根据需要设计和配置了图表 但是如果我通过更改状态数组来更新数据setInterval表
  • AngularJs $q 承诺与 async/await 兼容吗?

    我正在使用 TypeScript 版本分别为 9 07 1 5 11 和 3 7 5 开发 Angular AngularJs 混合应用程序 我们所有的 HTTP 请求 甚至是由新的 Angular 组件发出的请求 都使用以纯 Javasc
  • 在 Clojure 中使用引用

    在 clojure 中引用会导致不评估 a and a返回相同的结果 a 和 a 之间有什么区别 一个不评估 另一个评估自身 但这与不评估相同吗 a是简写 quote a eval quote form 回报form根据定义 也就是说 如果
  • Angular 2 错误和 Typescript - 如何调试?

    我刚刚开始了一个学习 Angular2 和 Typescript Javascript 的项目 我有 Java 背景 我调试项目的方法通常是堆栈跟踪 编译错误以及 在较大的项目上 大量测试用例的组合 然而 其中大部分似乎并没有直接转化为网络
  • 如何在 C 程序中最好地实现字符串到数字的映射

    我有一组明确的字符串及其对应的数字 kill gt 1 live gt 2 half kill gt 3 dont live gt 4 列表包含 30 个这样的字符串及其数字映射 如果用户输入 kill 我需要返回1 如果他输入 dont
  • Azure 缓存无法跨 VIP 交换保留会话状态?

    作为这篇文章的后续 在 Azure 云服务中启用共置会话缓存 https stackoverflow com questions 20964697 enabling co located session caching in an azur
  • 使用参数而不是硬编码字符串时,Postgres 查询非常慢

    我遇到了这个 Postgres 问题 如果我使用参数而不是在查询字符串上硬编码其值 则相同的查询需要很长时间才能执行 列名称是 media type 它是 VARCHAR 20 我使用 Symfony2 和 Doctrine2 ORM 从
  • Sqlite3 ON DELETE CASCADE 不起作用

    我的数据库中有多个表 我将仅使用其中 2 个作为示例 篮表 CREATE TABLE Basket id basket integer primary key autoincrement title text 电脑桌 CREATE TABL
  • 根据值计数计算的数据透视表字段

    我有一个数据透视表 在值中我有一些字段的计数 Region Count of Actuals Count of Budgets Percentage of Actuals Asia 40 80 我想在数据透视表 实际值百分比 中添加一个计算
  • Kendo UI 网格 - 客户端模板:转义 # 符号

    我正在使用 Kendo UI 的网格以及 Twitter Bootstrap Twitter Bootstrap 有一个内置的弹出窗口 模式 可以通过以下方式调用 a href class text yellow Login a 在我的 K
  • 如何在 React 中从 eslint 解析器中排除 css 文件

    我需要从 eslint 解析器中排除 css 文件 目前当我跑步时eslint src 这是检查所有文件 包括 css 文件 请在下面找到我的 eslintrc 文件内容 module exports parser babel eslint
  • GlobalKey 和 GlobalKeyObject 有什么区别?

    我想知道两者之间的区别 更重要的是现实世界的使用差异GlobalKey and GlobalObjectKey 什么时候使用哪个 什么时候避免 唯一的区别在于他们的方式 操作员行为 全局密钥 https api flutter dev fl
  • 用于查找已安装设备的驱动器号的批处理脚本

    我正在尝试编写一个批处理脚本来定位特定的已安装设备 我在 Windows 7 中 我知道该设备将具有文件夹驱动器 custom 因此我想查看所有可能性来查找具有此路径的设备 这是我到目前为止所拥有的 echo off setLocal En
  • 在 VBA 上声明和定义 FileSystemObject 对象的正确方法是什么?

    我正在阅读有关如何声明 FileSystemObject 对象的信息 发现了令人困惑的信息 是因为声明方式不同吗 我向您展示了我发现的一些声明和定义 FileSystemObject 对象的方法 Dim FSO As FileSystemO
  • 如何在 Git 中重新设置父级

    哪些非交互式 Git 命令实现了更改Before to After在每种情况下 1a 重新养育我 Before A B C D After C D A B 1b 重新养育二 Before C D A B After C A B D 1c 重
  • 当 matplotlib 图中的值“换行”时防止绘图连接

    我正在密谋赤经 https en wikipedia org wiki Right ascension 星历表 http rhodesmill org pyephem index html对于行星 它们具有周期性的属性 它们达到最大值 24
  • Python 中的消息框

    python中有没有一个UI库可以创建消息框或输入框 最好的选择是 tkMessageBox 模块 它应该适用于所有系统 因为 Python 通常会随 Tkinter 一起提供 如果您可以将自己限制在特定操作系统上 那么可能会有更好的选择
  • 我可以在android应用程序中以编程方式找出屏幕宽度吗? [复制]

    这个问题在这里已经有答案了 我可以在android应用程序中以编程方式找出屏幕的宽度吗 我需要绘制画布 但它的宽度应该几乎像屏幕一样 并且我无法在java零件程序中设置match parent 你可以得到默认的Display实例 然后从中读
  • Jenkins网站根路径

    我正在尝试按照此处的说明进行操作 https wiki jenkins ci org display JENKINS Running Jenkins behind Apache https wiki jenkins ci org displ
  • 如何在Android中读写字符设备(如/dev/ttyS0)

    我对Java和Android知之甚少 我想做的是在 Android 应用程序中打开 dev ttyS0 它应该与串行线通信 但我迷路了 我的设备已root 并且从命令行我可以 echo gt dev ttyS0 并从中读取内容 但我在尝试用