Ajuda com comunicação Serial e o TC65 da siemens

eae galera, seguinte, to precisando usar o modulo TC65 da siemens para me comunicar com um dispositivo com baudrate 9600, para isso eu estou usando o código abaixo:

[code]package src;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.microedition.io.CommConnection;
import javax.microedition.io.Connector;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

import com.siemens.icm.io.ATCommandFailedException;

public class Teste extends MIDlet {

public ComandoAT atc;
public InputStream in;
public OutputStream out;
CommConnection con;
Arquivo arq;

/**
 * Construtor
 * Abre conexão com a porta serial
 */
public Teste() {
	System.out.println("\nConstrutor");
	try {
		atc = new ComandoAT(false);		
		System.out.println("\nTry");
		con = (CommConnection) Connector.open("comm:com0;blocking=off;baudrate=9600;autorts=off;autocts=off");
		int baudrate = con.getBaudRate();
		System.out.println("Baudrate com0: " + baudrate);
		out = con.openOutputStream();
		in = con.openInputStream();
		//in = atc.getDataInputStream();			
		
	} catch (IOException e) {
		System.out.println(e);	
		
	} catch (ATCommandFailedException e) {
		System.out.println(e);
	}

}


  /**
   * Método principal da aplicação.
   * Primeiro a ser executado quando a aplicação é iniciada.
   */
 public void startApp() throws MIDletStateChangeException {		  
	 System.out.println("\nstartApp\n");

	 System.out.println(resposta);
	 //Seta 8 data bits, sem bit paridade e stop bit 1
	 resposta = atc.send("AT+ICF=3","ERROR: AT+ICF",false); 
	 System.out.println(resposta);
	 //Seta controle de fluxo XON/XOFF
	 resposta = atc.send("AT\\Q0", "ERROR: AT\\Q1", false); 
	 System.out.println(resposta);
	 //Seta o baudrate para 9600
	 //resposta = atc.send("AT+IPR=9600", "ERROR: AT+IPR", false); 
	 //System.out.println(resposta);
	 
	 int rcv = 0;
  
	 try {
		 arq = new Arquivo("file:///a:/teste.txt");
		 System.out.println("arquivo pronto");
		 
		 out.write(new String("status").getBytes());
		 System.out.println("status enviado");
		 
		 String input = "";
		 			 	
		 while(rcv != -1){
			 //if(in.available() > 0){
				 rcv = in.read();
				 //rcv++;
				 if(rcv >= 0){	
					 input = input + (char)rcv;
					 System.out.println(input);
					 if((char)rcv == '\r'){
						 rcv = -1;
					 }
				 }	  
			 //}				 
		 }
		 System.out.println("escrevendo em arquivo");
		 arq.esvreverArquivo(input);
		 System.out.println(arq.lerArquivo());
		 arq.fecharArquivo();
		 
		
		 
	 } catch (IOException e1) {
		 System.out.println(e1);
	 }			
	 
	 destroyApp(true);			 
	 
 }

  /**
   * Método chamado quando a aplicação tem de ser temporariamente pausada.
   */
 public void pauseApp() {
	 System.out.println("\npauseApp()\n");
	 
 }

  /**
   * Método chamado quando a aplicação é finalizada.
   * Aqui deve ser destruido tudo que não pode ser levado pelo garbage collector.
   */
 public void destroyApp(boolean unconditional) {
	 System.out.println("\ndestroyApp(" + unconditional + ")\n");
	 try {
		 con.close();
		 in.close();
		 out.close();
		 
	 } catch (IOException e) {
		 System.out.println(e);
	 }
	 notifyDestroyed();
	 
 }

}[/code]

eu consigo enviar o comando pela serial, mas eu nao recebo nenhuma resposta e quando eu conecto o pc direto pela serial com o dispositivo e mando o mesmo comando eu consigo a resposta

alguem pode me ajudar ae???

vlws

só para completar, ele meio que trava no comando in.read()
nao faz mais nada depois dele

Nunca programei para o TC65, mas estou usando um Motorola G24.

Você desligou o controle de fluxo ao abrir a porta serial (autorts=off;autocts=off),
certifique-se de dasabilitar também o controle de fluxo do dispositivo para o qual você está enviando os comandos.
Não seria AT+IFC=0 ?

O método read() de uma InputStream bloqueia até que chegue dado. Se está travado direto, e nunca saiu de lah (do in.read()),
então pode ser que não tenha chegado nenhum dado, mais um sinal de que pode ser controle de fluxo.

.

ops, foi mal nao ter respondido, mas eu ja resolvi meu problema :wink:

e que tal postar a resolução do problema? :wink:

final de contas outras pessoas podem ter a mesma dúvida q vc! :smiley:

té mais

o problema era no meu cabo serial :stuck_out_tongue:
por isso q nem postei

Apenas para reforçar o que o Ricarte Barros disse, relamente o comando read() fica 'preso ’ até que chegue um dado.
Por isso é importante para quem vai mexer com esses módulos, saber mexer bem com threads ou ThreadsPool para liberar o resto do aplicativo.
Abraços

CLáudio kunde

é, eu to ligado nisso, mas por enquanto isso não é problema para a minha aplicaçao :slight_smile:

[quote=Ricarte Barros]Nunca programei para o TC65, mas estou usando um Motorola G24.

Você desligou o controle de fluxo ao abrir a porta serial (autorts=off;autocts=off),

.[/quote]

outra coisa q eu percebi, na minha aplicacao eu nao uso mais esse autorts=off;autocts=off

Bom dia!!

Seguinte,

Estou comecando a programar para XT65 o que seria a mesma coisa para TC65.
Estou com uma duvida a respeito de criar um arquivo TXT e nao consigo pois nao acho a API certa.

Vi esse exemplo que vc enviou no forum e é bem o que eu preciso, so nao consigo construir a classe Arquivo.

Se puder me ajudar fico agradecido!!

Valeu!!

Marco

[quote=marcobogo]Bom dia!!

Seguinte,

Estou comecando a programar para XT65 o que seria a mesma coisa para TC65.
Estou com uma duvida a respeito de criar um arquivo TXT e nao consigo pois nao acho a API certa.

Vi esse exemplo que vc enviou no forum e é bem o que eu preciso, so nao consigo construir a classe Arquivo.

Se puder me ajudar fico agradecido!!

Valeu!!

Marco[/quote]

opa cara, seguinte, vou postar aki alguns metodos da minha classe arquivo, deles já da pra tu tirar oq tu precisa e qq coisa eh soh perguntar

estes sao os atributos q tu precisa basicamente

private PrintStream printer; //imprime os caracteres em arquivos private FileConnection file; //usado para leitura de arquivos

metodo pra criar o arquivo

[code]public Arquivo(String caminho, boolean novo) throws IOException{
this.file = (FileConnection)Connector.open(caminho);
//Cria o arquivo caso ele não exista
if(!this.file.exists()){
this.file.create();
} else if(novo){
this.file.delete();
this.file.create();
}

}[/code]

metodo pra escrever

[code]public void escreverArquivo(String texto) throws IOException{
OutputStream out = this.file.openOutputStream();
String temp = this.lerArquivo();
this.printer = new PrintStream(out);

	//Checa se o arquivo já tem algo escrito, caso não, escreve na primeira linha, caso sim, pula uma linha e escreve
	if(temp.length() > 0){ 
		this.printer.println(temp + texto);
	} else {
		this.printer.println(texto);
	}
	out.close();
	
}[/code]

e pra ler

[code]public String lerArquivo() throws IOException{
this.in = this.file.openDataInputStream();
String texto = “”;
while(in.available() > 0){
int rcv = in.read();
texto = texto + (char)rcv;
}
in.close();
return texto;

}[/code]

espero ter ajudado

abraços

Legal, obrigado, ajudou sim!!

Seguinte,
meu equipamento esta recebendo linhas de dados pela serial e criando esse arquivo TXT.
ate ai tudo bem.
Estou querendo que ele pegue essas linhas de informação, inclua os dados GPS e envie por GPRS para um servidor,
e ao mesmo tempo que apague as linhas que foram enviadas.
Conclui-se que o arquivo txt sera atualizado o tempo todo, funcionando como uma pilha (FIFO).
Se caso vc tiver algo que possa me ajudar, um link um tutorial, alguns exemplos ou ate uma
solução melhor fico grato.

Obrigado

Marco

[quote=marcobogo]Legal, obrigado, ajudou sim!!

Seguinte,
meu equipamento esta recebendo linhas de dados pela serial e criando esse arquivo TXT.
ate ai tudo bem.
Estou querendo que ele pegue essas linhas de informação, inclua os dados GPS e envie por GPRS para um servidor,
e ao mesmo tempo que apague as linhas que foram enviadas.
Conclui-se que o arquivo txt sera atualizado o tempo todo, funcionando como uma pilha (FIFO).
Se caso vc tiver algo que possa me ajudar, um link um tutorial, alguns exemplos ou ate uma
solução melhor fico grato.

Obrigado

Marco[/quote]

dexa eu ver se eu entendi, tu quer usar o arquivo como uma pilha?

Sim,
O meu equipamento recebe pela serial linhas de leitura de tempo em tempo,
assim o equipamento armazena em um txt essas linhas enquanto nao estiver
conectado.
A partir do momento que conectar ele envia essas linhas para um servidor que
por sua vez irá extrair os dados da linha e armazenar em um banco de dados.
as linhas devem ser enviadas na ordem em que chegaram, a primeira que entra
sera a primeira que sai.
E quando enviada a linha ela deve ser apagada do arquivo.

Nao sei se é a melor maneira de se fazer isso, mas estou partindo para esse caminho.
Se tiveres outra alternativa melhor por favor.

Grato

Marco.

[quote=marcobogo]Sim,
O meu equipamento recebe pela serial linhas de leitura de tempo em tempo,
assim o equipamento armazena em um txt essas linhas enquanto nao estiver
conectado.
A partir do momento que conectar ele envia essas linhas para um servidor que
por sua vez irá extrair os dados da linha e armazenar em um banco de dados.
as linhas devem ser enviadas na ordem em que chegaram, a primeira que entra
sera a primeira que sai.
E quando enviada a linha ela deve ser apagada do arquivo.

Nao sei se é a melor maneira de se fazer isso, mas estou partindo para esse caminho.
Se tiveres outra alternativa melhor por favor.

Grato

Marco.[/quote]

nao seria melhor utilizar uma pilha mesmo? Dentro da aplicação, ou não rola?

Pode ser,
O problema é que eu não tenho conhecimento de como fazer isso.
Vc tens alguma coisa para me ajudar?

Marco

[quote=marcobogo]Pode ser,
O problema é que eu não tenho conhecimento de como fazer isso.
Vc tens alguma coisa para me ajudar?

Marco[/quote]

java tem a API stack http://java.sun.com/j2se/1.4.2/docs/api/java/util/Stack.html
mas JME eu nao sei se consegue utiliza-la, da uma pesquisada ai no google, qq coisa implementa, procura por algoritmo de pilha, nao eh dificil

boa sorte 8)

Vou dar uma olhada,

Obrigado,

Marco

JME tem sim a API stack
acabei de confirmar, eh soh olhar ai a API e utilizar 8)

Blz,

Obrigado

Marco