последовательная связь с использованием CommConnection на мобильном устройстве - PullRequest
0 голосов
/ 31 января 2012

У меня две проблемы с последовательной программой на мобильном устройстве:

  1. InputStream.available () всегда возвращает 0 в соответствии с документацией.Не удается использовать DataInputStream, поскольку данные могут быть файлом, а не строкой.Если я просто вызову read () для InputStream, он заблокирует операцию ввода-вывода, если байты не существует на другой стороне.Кроме того, я не знаю, сколько стоит размер входных данных.Итак, как мне узнать, доступны ли данные в порту и сколько их размер?
  2. Я использую гипертерминал для проверки последовательного порта, а мобильная станция отвечает только на AT-команды как ata и atd.Поэтому любая строка, такая как «hello», игнорируется, и мое приложение не видит ее.так это правда?или я что-то упустил?Как я могу сделать данные видимыми для моего приложения?

ну какие-нибудь предложения?фрагменты кода может быть?

1 Ответ

0 голосов
/ 31 января 2012

Вы можете добавить прослушиватель к SerialPort, который получает уведомление, когда данные доступны на этом порту.Внутри этого обратного вызова in.available() также должен возвращать количество байтов, которые могут быть прочитаны, но, вероятно, лучше просто использовать байты, пока read не вернет -1.

final CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier("COM1");

final SerialPort com1 = (SerialPort)portId.open("Test", 1000);
final InputStream in = com1.getInputStream();

com1.notifyOnDataAvailable(true);
com1.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
com1.addEventListener(new SerialPortEventListener() {
    public void serialEvent(SerialPortEvent event) {
        if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
            try {
                byte[] buffer = new byte[4096];
                int len;
                while (-1 != (len = in.read(buffer))) {
                    // do something with buffer[0..len]
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
});
...