Debug -> infinity
От: cradee  
Дата: 11.09.10 06:07
Оценка:
Здравстыуйте, уважаемые.

Помогите разобраться в ситуации


Eclipse Helios Release;
JDK 1.6.0_21;
Linux MCBC


Пишу приложение для работы с RS232, используя javax.comm, и одна ситуация поставила в тупик. Вот кусок кода:

public void serialEvent(SerialPortEvent event) {
        // TODO Auto-generated method stub
        switch(event.getEventType()) {
            case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
            case SerialPortEvent.BI:
            case SerialPortEvent.CD:
            case SerialPortEvent.CTS:
            case SerialPortEvent.DSR:
            case SerialPortEvent.FE:
            case SerialPortEvent.OE:
            case SerialPortEvent.PE:
            case SerialPortEvent.RI:
                break;
            case SerialPortEvent.DATA_AVAILABLE:
                byte[] readBuffer = null;
                try {
                    readBuffer = new byte[inputStream.available()];
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                try {
                    int count = 0;
                    while(this.inputStream.available() > 0) {
                        count++;
                        int numBytes = inputStream.read(readBuffer);
                    }
                    System.out.println(getHex(readBuffer));
                    System.out.println(readBuffer.length);
                    System.out.println(this.inputStream.available());
                    outputStream.close();
                    inputStream.close();
                    serialPort.removeEventListener();
                } catch (IOException e) {}
                break;


При сборке и компиляции проекта все проходит на ура, а точнее

count = 1;


Но как только пытаюсь отдебажить этот кусок цикл while уходит в бесконечность. Как такое взмжно?
Re: Debug -> infinity
От: avpavlov  
Дата: 11.09.10 08:22
Оценка:
C>Но как только пытаюсь отдебажить этот кусок цикл while уходит в бесконечность. Как такое взмжно?

А ты уверен, что из порта не идут бесконечные данные? Без отладчика может между данными есть интервалы, когда available()==0, поэтому цикл заканчивается, а под отладчиком пока Эклипс загрузить окружение, пока все доступные переменные загрузить — в очередь пришло много данных, и при этом пока ты по шагам ходишь они продолжают поступать.

C> while(this.inputStream.available() > 0) {

C> count++;
C> int numBytes = inputStream.read(readBuffer);

Вот это вообще бред, ты в цикле каждый раз в буфер записываешь с самого начала.

C> } catch (IOException e) {}


Happy debuging!
Re[2]: Debug -> infinity
От: Аноним  
Дата: 11.09.10 10:31
Оценка:
Здравствуйте, avpavlov, Вы писали:

A>Вот это вообще бред, ты в цикле каждый раз в буфер записываешь с самого начала.


while(this.inputStream.available() > 0) {
     count++;
     inputStream.read(readBuffer);
}


Почему бред? Размер буфера у меня зависит от размера поступившего соообщения readBuffer = new byte[inputStream.available()] и за один цикл я считываю его полностью. Тем более я знаю точно, что мне должно поступить на вход, в зависимости от того какой запрос я отправил.

А> } catch (IOException e) {}


Да. Забыл про e.printStackTrace().
Re[3]: Debug -> infinity
От: avpavlov  
Дата: 11.09.10 10:48
Оценка:
А>Почему бред? Размер буфера у меня зависит от размера поступившего соообщения readBuffer = new byte[inputStream.available()] и за один цикл я считываю его полностью.

А зачем тогда while?

А>Тем более я знаю точно, что мне должно поступить на вход, в зависимости от того какой запрос я отправил.


Не забудь убедиться, что драйвер тоже точно знает, что ты ждёшь на входе, и не пришлёт данные в два приёма.
Re: Debug -> infinity
От: Blazkowicz Россия  
Дата: 12.09.10 15:34
Оценка: 1 (1)
Здравствуйте, cradee, Вы писали:

C>
C>                    while(this.inputStream.available() > 0) {
C>


Прочитайте JavaDoc к классу InputStream. Метод предназначен для других задач.
Re: Debug -> infinity
От: Eugeny__ Украина  
Дата: 15.09.10 14:30
Оценка:
Здравствуйте, cradee, Вы писали:



C>Пишу приложение для работы с RS232, используя javax.comm, и одна ситуация поставила в тупик.


Честно говоря, несколько лет назад я пробовал использовать этот пакет, но глючность зашкаливала. С тех пор и до текущего времени использую коммуникацию с портами, открывая их обычный RandomAccessFile. В принципе, если нужно только читать и писать данные — подходит вполне. Тем более, что решение железобетонно стабильное.
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.