如何在Android中读取写入字符设备(例如 /dev /ttys0)



我对Java和Android几乎不了解。我要做的是在Android应用中打开/Dev/TTys0,该应用应该与串行线对话,但我会迷路。

我的设备是扎根的,从命令行我可以"回声...>/dev/ttys0",也可以从中读取,但是我迷失了尝试在Java中这样做。首先,我找不到以简单的读写模式打开文件的方法,而无需应对缓冲区和其他复杂性(显然,我想要无封闭的I/O(。

我搜索了Internet,但所有示例都涉及我不可用的USB。然后,我找到了Uartdevice类,但是从...

获得适当实现的类是一个类

我试图使用文件类,并将其附加到读者和作家类上,但是编译器抱怨,坦率地说,我不确定这是否有路要走。我需要一个骨架代码。我错过了一个简单的文本文件类,带有无封闭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文件提供R/W权限,并禁用其 echo echo 选项。如果这些权限 选项已经正确,或者是将它们设置为其他含义,则不需要sudo((命令。

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

Java中的所有文件访问都是通过输入和输出流进行的。如果要打开文件,则只需为其创建FileOutputStream或FileInputStream即可。这些是未掩盖的流。如果您想编写原始字节,则可以将其包装在bytearrayoutputstream或bytearrayInputStream中。

要执行角色模式,您可以使用作者。带有ASCII的charset的OutputStreamWriter可以包装FileOutputStream。那应该为您进行角色转换。只是不要使用文件作者 - 虽然看起来很合适,但它没有选项选择一个字符集,默认值不是ASCII。要阅读,请使用InputStreamReader。

相关内容

  • 没有找到相关文章

最新更新