Guest
Thu Nov 08, 2007 6:21 pm
Witam,
piszę w javie aplikację do obsługi modemu GSM. Kod aplikacji:
public static void main(String[] args) {
try {
CommPortIdentifier cpi CommPortIdentifier.getPortIdentifier("COM10");
SerialPort port = (SerialPort) cpi.open("app1", 2000);
port.setSerialPortParams(9600, SerialPort.DATABITS_8,
SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
InputStream is = port.getInputStream();
OutputStream os = port.getOutputStream();
InputStreamReader isr = new InputStreamReader(is);
Scanner scanner = new Scanner(isr);
for(;

{
InputStreamReader systemIn = new
InputStreamReader(System.in);
Scanner systemScanner = new Scanner(systemIn);
String line = systemScanner.nextLine();
if (line.equals("END")) {
break;
}
os.write((line + "\n").getBytes());
System.out.println(scanner.nextLine());
}
port.close();
} catch (NoSuchPortException ex) {
ex.printStackTrace();
} catch (PortInUseException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
} catch (UnsupportedCommOperationException ex) {
ex.printStackTrace();
}
}
(pomijam importy i nazwę klasy).
Mam następujący problem - po wysłaniu na port komendy AT zamiast
oczekiwanego OK otrzymuję dokładnie te same dane. Mam pewność, że port
na którym zainstalowano modem to COM9.
Czy znacie przyczynę takiego zachowania się portu?
Pozdrawiam,
Tomasz Jurkiewicz
Guest
Thu Nov 08, 2007 6:22 pm
oczywiscie mam pewnosc ze to COM10 a nie COM9.
J.F.
Guest
Thu Nov 08, 2007 6:39 pm
On Thu, 08 Nov 2007 09:21:25 -0800, Jurkiewicz.Tomek@gmail.com wrote:
Quote:
Mam następujący problem - po wysłaniu na port komendy AT zamiast
oczekiwanego OK otrzymuję dokładnie te same dane.
Czy znacie przyczynę takiego zachowania się portu?
A telefon podlaczony ?
modemy lubia zrobic echo, ate0 wylacza.
Dane do telefonu dochodza ? [czyli czy komendy wykonuje]
J.
Zbych
Guest
Thu Nov 08, 2007 7:20 pm
Jurkiewicz.Tomek@gmail.com przemówił ludzkim głosem:
Quote:
Mam następujący problem - po wysłaniu na port komendy AT zamiast
oczekiwanego OK otrzymuję dokładnie te same dane. Mam pewność, że port
na którym zainstalowano modem to COM9.
Czy znacie przyczynę takiego zachowania się portu?
Echo to nie wina portu, tylko modemu (trzeba wyłączyć w nim echo).
A co do braku odpowiedzi, to sprawdź na jaki znak końca linii reaguje
modem ( \n, czy \r, a może oba?).
Guest
Thu Nov 08, 2007 7:30 pm
Dzieki za odpowiedzi.
Quote:
A telefon podlaczony ?
modemy lubia zrobic echo, ate0 wylacza.
Dane do telefonu dochodza ? [czyli czy komendy wykonuje]
J.
Telefon nie odpowiada chyba tak jak trzeba. Za pomoca hyperterminala
wykonalem nastepujace operacje (nieparzyste linie to komendy, parzyste
to odpowiedzi)
AT
OK
AT+CMGF=1
OK
AT+CMGL="ALL"
CMS ERROR: 500
Kod bledu 500 to 'nieznany blad'.
Od momentu tej sekwencji, nie moge ani nic wyslac hyperterminalem, a
dane wysylane z mojej aplikacji juz nie odbijaja (aplikacja jest
napisana w ten sposob, ze zawiesza sie w oczekiwaniu na odpowiedz
modemu - ktora nie nadchodzi). Co wiecej - przy uzyciu aplikacji
globetrotter ciagle moge laczyc sie z internetem, itp. Od czasu do
czasu (zupelnie losowo, czasem w mojej aplikacji, czasem w
hyperterminalu) karta zwraca sekwencje:
_OSIGQ: n, 0 gdzie 10<n<20 mniej wiecej. To sa jakies parametry
syglnalu sieci - wniosek: karta (jakos) dziala.
Wyglada wiec na to, ze mam jakis wiekszy problem z ta karta. Jesli uda
mi sie go rozwiazac, to odpisze, tymczasem czekam na kolejne pomysly
co moze byc nie tak.
Pozdr,
Tomek
J.F.
Guest
Thu Nov 08, 2007 8:09 pm
On Thu, 08 Nov 2007 10:30:39 -0800, Jurkiewicz.Tomek@gmail.com wrote:
Quote:
Telefon nie odpowiada chyba tak jak trzeba. Za pomoca hyperterminala
wykonalem nastepujace operacje (nieparzyste linie to komendy, parzyste
to odpowiedzi)
AT
OK
AT+CMGF=1
OK
AT+CMGL="ALL"
CMS ERROR: 500
Kod bledu 500 to 'nieznany blad'.
Od momentu tej sekwencji, nie moge ani nic wyslac hyperterminalem,
Ustaw moze mgf=0 i zobacz czy wyrzuci w pdu.
J.
Guest
Thu Nov 08, 2007 8:41 pm
On 8 Lis, 20:09, J.F. <jfox_xnosp...@poczta.onet.pl> wrote:
Quote:
On Thu, 08 Nov 2007 10:30:39 -0800, Jurkiewicz.To...@gmail.com wrote:
Telefon nie odpowiada chyba tak jak trzeba. Za pomoca hyperterminala
wykonalem nastepujace operacje (nieparzyste linie to komendy, parzyste
to odpowiedzi)
AT
OK
AT+CMGF=1
OK
AT+CMGL="ALL"
CMS ERROR: 500
Kod bledu 500 to 'nieznany blad'.
Od momentu tej sekwencji, nie moge ani nic wyslac hyperterminalem,
Ustaw moze mgf=0 i zobacz czy wyrzuci w pdu.
J.
Problem rozwiazalem juz. Okazalo sie, ze wszystkie komendy wysylane sa
dobrze. Po prostu zapychalem bufor. Nie wiem czemu, ale modem wysyla
bardzo duzo pustych linii (co 2 linia wyslana z modemu jest pusta).
Stad wrazenie, ze modem nie reaguje. Do tego dochodzi mnostwo danych
kontrolnych wysylanych co jakis czas. Ogolnie rzecz biorac, nie da sie
napisac tego typu aplikacji niewspolbieznie ;)
Ponizej wklejam dzialajacy kod aplikacji, ktora pozwala na rozmawianie
z modemem GSM z poziomu stdin i stdout. Wymagania: Java 6 sdk,
zainstalowane javax.comm (pod windows nalezy pobrac API ze strony sun,
i sterowniki comm.jar, javax.comm.properties oraz win32comm.dll i
zainstalowac w odpowiednich katalogach. dla linux wystarcza
javax.comm).
Dziekuje bardzo za rady,
moze komus przyda sie ta mini-dyskusja.
Pozdrawiam,
Tomek
---
import java.io.InputStreamReader;
import java.util.Scanner;
/**
*
* @author tomek
*/
public class Reader extends Thread {
private Scanner scanner;
/** Creates a new instance of Reader */
public Reader(InputStreamReader isr) {
this.scanner = new Scanner(isr);
this.scanner.useDelimiter("\\r\\n");
}
public void run() {
System.out.println("Start");
for(;

{
System.out.println("> " + scanner.nextLine());
}
}
}
----
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.Scanner;
import javax.comm.*;
/**
*
* @author tomek
*/
public class Main {
/** Creates a new instance of Main */
public Main() {
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
try {
CommPortIdentifier cpi =
CommPortIdentifier.getPortIdentifier("COM9");
SerialPort port = (SerialPort) cpi.open("tusa1", 2000);
port.setSerialPortParams(9600, SerialPort.DATABITS_8,
SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
InputStream is = port.getInputStream();
OutputStream os = port.getOutputStream();
InputStreamReader isr = new InputStreamReader(is);
Scanner scanner = new Scanner(isr);
scanner.useDelimiter("\\n\\r");
Reader reader = new Reader(isr);
reader.start();
for(;

{
InputStreamReader systemIn = new
InputStreamReader(System.in);
Scanner systemScanner = new Scanner(systemIn);
String line = systemScanner.nextLine();
if (line.equals("END")) {
break;
}
os.write((line + "\n\r").getBytes());
}
port.close();
reader.join();
} catch (NoSuchPortException ex) {
ex.printStackTrace();
} catch (PortInUseException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
} catch (UnsupportedCommOperationException ex) {
ex.printStackTrace();
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}