Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > javax.comm.*


Автор: barin_Student 4.6.2008, 12:51
Есть вот такие строки в моей програмке:
Код

BufferedReader BR = new BufferedReader(new InputStreamReader (port.getInputStream()));
if(BR.ready()==false)
{
    int timer = 1;
    while(BR.ready()==false)
    {
       if(timer ==10)
       {
          history.Write("Waiting, stream not ready","GSMTerminal");
       }
       this.wait(100);
       if((BR.ready())&(timer>=10))
       {
           timer = 1;
           history.Write("Stream ready=true, GSMTerminal works.","GSMTerminal");
       }
       if(timer==30)
       {
          history.Write("Stream closed, try to replay command ","GSMTerminal");
      timeToQuit = true;
          port.close();
          this.Inicialization();
          BR.close();
          break;
       }
       timer++;
    }
}
if(timeToQuit!=true)
{
   str = BR.readLine();
   history.Write(str,"GSMTerminal");
}

вот метод Inicialization:
Код

  public void Inicialization()
    {
         errorWriter = new ErrorWriter();
          history = new HistoryWriter();
        String defaultPort=properties.Load("defaultPort");
        portList = CommPortIdentifier.getPortIdentifiers();
         while (portList.hasMoreElements())
        {
        portId = (CommPortIdentifier) portList.nextElement();
        if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL)
                    {
        if (portId.getName().equals(defaultPort))
                                {
            history.Write("Found port "+defaultPort+" , try to open...","GSMTerminal");
                                    try 
                                    {
                                            port = (SerialPort) portId.open("Server",2000);
                                            portOpen=true;
                                           history.Write("Port "+defaultPort+" open!","GSMTerminal");
                                            this.setInputStream(port.getInputStream());
                                     } 
                                     catch (PortInUseException e) 
                                     {
                                               history.Write("Port "+defaultPort+" is already in use, can not use this port ","GSMTerminal");
                                             errorWriter.WriteError("Error in Inicialization ComPort  "+e);
                                             portOpen = false;
                                    }
                                    catch(IOException IOE)
                                    {
                                         errorWriter.WriteError("Error in GSMModem in Inicilize  "+IOE);
                                     }
        }
        }
            
    }
        
        
            }


А вот кусок лога:
Код

03.06.2008 01:23:32  ---------------------------------------
03.06.2008 01:23:32  at+cmgl=ALL
03.06.2008 01:23:33  Waiting, stream not ready
03.06.2008 01:23:35  Stream closed, try to replay command 
03.06.2008 01:23:35  Found port /dev/ttyS0 , try to open...
03.06.2008 01:23:35  Port /dev/ttyS0 open!
03.06.2008 01:25:30  ---------------------------------------
03.06.2008 01:25:30  at+cmgl=ALL
03.06.2008 01:25:31  Waiting, stream not ready
03.06.2008 01:25:33  Stream closed, try to replay command 
03.06.2008 01:25:33  Found port /dev/ttyS0 , try to open...
03.06.2008 01:25:33  Port /dev/ttyS0 open!
03.06.2008 01:27:28  ---------------------------------------
03.06.2008 01:27:28  at+cmgl=ALL
03.06.2008 01:27:29  Waiting, stream not ready
03.06.2008 01:27:31  Stream closed, try to replay command 
03.06.2008 01:27:31  Found port /dev/ttyS0 , try to open...
03.06.2008 01:27:31  Port /dev/ttyS0 open!
03.06.2008 01:29:26  ---------------------------------------
03.06.2008 01:29:26  at+cmgl=ALL
03.06.2008 01:29:27  Waiting, stream not ready
03.06.2008 01:29:29  Stream closed, try to replay command 
03.06.2008 01:29:29  Found port /dev/ttyS0 , try to open...
03.06.2008 01:29:29  Port /dev/ttyS0 open!
03.06.2008 01:31:24  ---------------------------------------
03.06.2008 01:31:24  at+cmgl=ALL

Могу сразу сказать к ком порту ничаго отвечающего не было подключенно , тобишь я постоянно перестартовывал ком порт.. а в какой то момент он сказал , что готов передать байты.. и повесилась программка.. в чем дело,? smile  Може кому еще надо что выложить.. просто не умею я толком вопросы задавать. smile 

Автор: barin_Student 5.6.2008, 07:39
Точнее , если не знаю где я непрвильно отписал, лучше подсказать по этому вопросу:
Код

BufferedReader BR = new BufferedReader(new InputStreamReader (port.getInputStream()));
if(BR.ready()==false)
{
    
       this.wait(100);
       if(timer==30)
       {
          history.Write("Stream closed, try to replay command ","GSMTerminal");
          timeToQuit = true;
          port.close();
          this.Inicialization();
          BR.close();
          break;
       }
       timer++;
    }
}
if(timeToQuit!=true)
{
   str = BR.readLine();// вот именно здесь выставить таймер чтения скажем читать не белее секунды , потом пускай в эксаптион выскакивает...
   history.Write(str,"GSMTerminal");

Автор: barin_Student 5.6.2008, 11:26
Неужели никто не сталкивался с такой проблемой smile :
Код

BufferedReader BR = new BufferedReader(new InputStreamReader (port.getInputStream()));
if(BR.ready()==true)
{
     String str = BR.readLine();// иногда он ничал не дает.. висит здесь.. и в NUllPointerException не выкидывает...
}

 smile 

Автор: LSD 5.6.2008, 12:48
А в чем проблема то?

То что тут:
Код

BufferedReader BR = new BufferedReader(new InputStreamReader (port.getInputStream()));
if(BR.ready()==true)
{
     String str = BR.readLine();// иногда он ничал не дает.. висит здесь.. и в NUllPointerException не выкидывает...
}

возможно "зависание" программы, это нормально. Т.к. BR.ready() возвращает true если есть хоть какие нибудь данные. А BR.readLine() будет читать из входного потока до тех пор пока, или не будет получен символ конца строки, или поток не будет закрыт. NullPointerException там вообще неоткуда взяться.

Автор: barin_Student 5.6.2008, 12:53
Да но ни строки , ничаго нет.. если судить по логам.. Как он может быть true? если ничаго к ком порту не подключенно, и ничаго не обращается к нему? smile
Код

03.06.2008 01:27:28  at+cmgl=ALL
03.06.2008 01:27:29  Waiting, stream not ready
03.06.2008 01:27:31  Stream closed, try to replay command 
03.06.2008 01:27:31  Found port /dev/ttyS0 , try to open...
03.06.2008 01:27:31  Port /dev/ttyS0 open!
03.06.2008 01:29:26  ---------------------------------------
03.06.2008 01:29:26  at+cmgl=ALL
03.06.2008 01:29:27  Waiting, stream not ready
03.06.2008 01:29:29  Stream closed, try to replay command 
03.06.2008 01:29:29  Found port /dev/ttyS0 , try to open...
03.06.2008 01:29:29  Port /dev/ttyS0 open!
03.06.2008 01:31:24  ---------------------------------------
03.06.2008 01:31:24  at+cmgl=ALL
 
Все уже двое суток ждет строки... smile , вот на чем лог закончился(программа работает) , 

Автор: LSD 5.6.2008, 12:56
Цитата(barin_Student @  5.6.2008,  13:53 Найти цитируемый пост)
Да но ни строки , ничаго нет.. если судить по логам..

Строка, это то что завершается символом конца строки. Пока его не послать в порт, то ты ничего и не получишь. Читай посимвольно, тогда возможно и узнаешь, что же записано в порт.


Цитата(barin_Student @  5.6.2008,  13:53 Найти цитируемый пост)
Как он может быть true? если ничаго к ком порту не подключенно, и ничаго не обращается к нему?

А нафига тогда вообще из него читать, если там ничего нет?

Автор: barin_Student 5.6.2008, 13:02
Вот по моему условию, как можно определить , есть ли там чаго...
Просто напросто , проверяю , ready() ? , да - читаю, нет , закрываю входящий поток , закрываю порт, открываю заново.. и вот на таком условии(когда GSMModem не подключен может сутки проработать - двое(по разному) , но падает потом , так как я вам показал..
Код

BufferedReader BR = new BufferedReader(new InputStreamReader (port.getInputStream()));
if(BR.ready()==true)
{
     String str = BR.readLine();// именно здесь повисает...
}


как избежать , какой интсрумент есть?
Код

если там ничего нет?
 
Как определить? Ведь BR.ready()==true!(будем считать что рас в сутки), а восновном если нет входящих строк , то он равен false().

Автор: LSD 5.6.2008, 14:45
Цитата(barin_Student @  5.6.2008,  14:02 Найти цитируемый пост)
как избежать , какой интсрумент есть?

Ты читать умеешь? smile 
Цитата(LSD @  5.6.2008,  13:56 Найти цитируемый пост)
Читай посимвольно

Автор: barin_Student 6.6.2008, 05:49
Умею я читать, вопревых по символьно было неудобно.. но решил я эту проблему.. стал читать посимвольно.. и суть осталась та же самая..Условие это "счас дам байты=да дам",рас в сутки выскакивало..а сам ничаго не давал...
Суть то в том , что это условие в моем случае до новой эры должно было быть ==false. smile
Вот  

Автор: barin_Student 6.6.2008, 06:50
А как посимвольно привести в строку , и где конец ?
Может так:
Код

int strInt;
while((strInt=BR.read())!=-1)//здесь тоже ошибка .. пока пишу , меняю.. вопщем ищу , как здесь условие поставить..
{
    //здесь как привести Интовое в строку , с Enter и таму подобное
}

Сорри если это вопрос №2 и я нарушил правила.. могу создать новую тему. smile 

Автор: barin_Student 6.6.2008, 07:13
Код

char[] chr = new char[255];
BR.read(chr);
String str = new String().copyValueOf(chr);

счас проверю , вот такой код.

Автор: ivg 6.6.2008, 10:11
http://java.sun.com/products/javacomm/reference/api/javax/comm/CommPort.html#enableReceiveTimeout(int)

Автор: barin_Student 6.6.2008, 10:33
Прочитал я док, спасибо за ссылку smile .. есть только разница .. разобраться с схемой работы.
Счас переделал вот как:
Код

String str = "";
int strInt = ;
port.enableReceiveTimeOut(3000);
while((strInt=BR.read())!0x0a)
{
     char s =(char)strInt;
     str = str+new String().valueOf(s);
}

Вот так ? Кто этим пользовался(enableReceiveTimeout())?Просто я не могу проверить , работает , или нет(имеется ввиду быстро проверить. smile 

Автор: ivg 6.6.2008, 10:48
Цитата(barin_Student @  6.6.2008,  13:33 Найти цитируемый пост)
Счас переделал вот как:

И что компилируется? smile
Обратите внимание на 
Цитата

Enables receive timeout, if this feature is supported by the driver. When the receive timeout condition becomes true, a read  from the input stream for this port will return immediately.
enableReceiveTimeout is an advisory method which the driver may not implement. By default, receive timeout is not enabled. 
An application can determine whether the driver supports this feature by first calling the enableReceiveTimeout method and then calling the isReceiveTimeout method. If isReceiveTimeout still returns false, then receive timeout is not supported by the driver.

PS: Доки для кого пишут?

Добавлено через 4 минуты и 17 секунд
Цитата(barin_Student @  6.6.2008,  13:33 Найти цитируемый пост)
Просто я не могу проверить , работает , или нет

Аналогично, линукса под рукой нет, да и javax.comm.* библиотеки тоже.

Автор: barin_Student 6.6.2008, 10:55
Компилится smile ...
 счас запущю...

Добавлено через 1 минуту и 15 секунд
И идет.. но узнать что это хоть что то полезное делает я не могу.. smile 

Автор: barin_Student 6.6.2008, 12:26
Все решил , большое спасибо за ссылку , у кого вопросы возникнут, по этому поводу , пишите мне отвечу.. спасибо ivg +1 репутации вам, спасибо LSD сделал я поинтовое чтение.. вопщем решил, большое спасибо еще рас, тем закрыта. smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)