Как читать и писать символьные устройства (например, / dev / ttyS0) в Android - PullRequest
0 голосов
/ 06 июля 2019

У меня мало знаний о Java и Android.Я пытаюсь открыть / dev / ttyS0 в приложении для Android, которое должно общаться с последовательной линией, но я заблудился.

Мое устройство рутировано, и из командной строки я могу "echo ...> / dev / ttyS0 ", а также читать из него, но я теряюсь, пытаясь сделать это в Java.Для начала не могу найти способ открыть файл в простом режиме чтения-записи, не справляясь с буферами и прочими сложностями (понятно, я хочу небуферизованный ввод / вывод).

Я искал в интернете, новсе примеры относятся к USB, который не доступен для меня.Затем я нашел класс UartDevice, но это класс для получения правильной реализации из ...

Я пытался использовать класс File и присоединить к нему класс Reader и Writer, нокомпилятор жалуется, и, честно говоря, я не уверен, что это путь.Для начала мне понадобится код скелета;Я скучаю по простому классу TextFile с небуферизованными методами read () и write (), которые можно использовать одновременно в одном и том же открытом файле!

Может кто-нибудь указать мне правильное направление, спасибо?

Ответы [ 2 ]

0 голосов
/ 08 июля 2019

После многих попыток и с помощью большого количества информации с 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;
            }
        });

    }
}
0 голосов
/ 06 июля 2019

Все Доступ к файлам в Java осуществляется через потоки ввода и вывода.Если вы хотите открыть файл, вы просто создаете FileOutputStream или FileInputStream для него.Это небуферизованные потоки.Если затем вы хотите записать необработанные байты, вы можете заключить их в ByteArrayOutputStream или ByteArrayInputStream.

Чтобы сделать символьный режим, вы можете использовать Writer.OutputStreamWriter с набором символов ascii может обернуть FileOutputStream.Это должно сделать преобразование символов для вас.Просто не используйте FileWriter - хотя он кажется подходящим, у него нет возможности выбрать набор символов, и по умолчанию это не ascii.Для чтения используйте InputStreamReader.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...