Ethernet e leitura de strings

Olá amigos do forum, não sei se alguém já teve essa necessidade, eu estou montando um SI e um SC usando arduino e Java EE, ja consegui fazer a comunição pra aplicação Java EE controlar varias placas de arduino (cada placa representa uma sala) todavia, pra gerar uma maior complexidade no projeto, optei por dividir os circuitos das salas em parte da frente e parte de tráz, onde cada um desses cirucuitos está ligado a uma porta do arduino. Ai começam meu problemas, não estou conseguindo tratar a mensagem codificada que envio para o arduino através do socket java, eu mando um codigo assim por exemplo, “0F” onde a string na primeira posição (char no caso) representa o estado do circuito e ‘F’, qual o circuito em questão, todavia não sei como fazer para client.read() ler isso e armazenar numa string , a primeira vez que envio o sinal ele le, mas em seguida ele le, mais n le só o novo codigo, e como se o que enviei anteriormente continuasse armazenado, ai ate tentei limpar o client.flush() mas n da certo, n sei se estou usando alguma função de maneira equivocada, enfim…Alguem sabe como posso tratar as mensagens enviadas para o arduino de um socket. Desde já agradeço.

Coloca aqui o código que estás a usar... nós não somos adivinhos.

Desde já agradeço amigo.

#include<Ethernet.h>
#include<SPI.h>
#include<String.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };  //endereco mac 
IPAddress ip( 10, 1, 1, 18 ) ;    
EthernetServer server(90);  
int frente = 9; 
int meio = 10;
int atras = 11;
char codigo[2]; //string for fetching data from address
char msg[2];

void setup()
{

	Serial.begin(9600);
	Ethernet.begin(mac, ip);    //setando o ip e o mac para o arduino ser reconhecido na rede
	server.begin();        // levantando o servidor
	Serial.print("server is at\n");
	pinMode(frente, OUTPUT);
	pinMode(meio, OUTPUT);
	pinMode(atras, OUTPUT);  

}

void loop()
{
	EthernetClient client = server.available();    

	if (client)
	{   
                int i = 0;
		while(client.connected()) 
		{      
                        
			if (client.available())
			{				
				msg[0] = client.read();
                                msg[1] = client.read();
                                char grupo = msg[0];
                                char  estado = msg[1];
                                Serial.println(grupo);
                                
                                switch(grupo){

				case '1': //Frente
					Serial.println("Entrei no 10");
                                        if (estado == '1')
					{
						digitalWrite(frente, HIGH);
						//Serial.println("Ligando");
						client.println("1");
					}
					else
					{
						digitalWrite(frente, LOW);
						//Serial.println("Apagando");
						client.println("0");
					}
					break;

				case '2': //Meio
					Serial.println("Entrei no 20");
                                        if (estado == '1')
					{
						digitalWrite(meio, HIGH);
						//Serial.println("Ligando");
						client.println("1");
					}
					else
					{
						digitalWrite(meio, LOW);
						//Serial.println("Apagando");
						client.println("0");
					}
					break;

				case '3': //Atras
					Serial.println("Entrei no 30");
                                        if (estado == '1')
					{
						digitalWrite(atras, HIGH);
						//Serial.println("Ligando");
						client.println("1");
					}
					else
					{
						digitalWrite(atras, LOW);
						//Serial.println("Apagando");
						client.println("0");
					}
					break;
				}
				delay(1); 

			}
			client.flush();
		}
		client.stop();    //finaliza a conexao
	}
}

E o que é que tu vês aqui

Serial.println(grupo); ?? Saí algo?

Não estarás a enviar carriage returns?

bubulindo:
E o que é que tu vês aqui

Serial.println(grupo); ?? Saí algo?

Não estarás a enviar carriage returns?

Saia caracter a caracter que eu mandava, sendo que não do jeito que eu queria…Meu codigo ate funcionou, todavia tem alguns erros que eu mesmo já identifiquei, ele le a string toda, mas na hora de energizar ele liga uma saida q n existe…da uma olhada…tem erros, dentre eles não fechar a conexao, mas so funcionou assim, quando eu fecho a conexao ele so reconhece o primeiro comando e fecha, ai o meu socket da erro de servidor inacansável…de uma olhada por favor, e desculpa a demora em responder…

#include<Ethernet.h>
#include<SPI.h>
#include<String.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };  //endereco mac 
IPAddress ip( 10, 1, 1, 18 ) ;    //enderecoo IP
EthernetServer server(90);  //criando um objeto do tipo servidor, onde 90 e a porta de comunicacao
int frente = 9; //Define a saida digital 9
int meio = 10;
int atras = 11;

void setup()
{

	Serial.begin(9600);
	Ethernet.begin(mac, ip);    //setando o ip e o mac para o arduino ser reconhecido na rede
	server.begin();        // levantando o servidor
	Serial.print("server is at");
	pinMode(frente, OUTPUT);
	pinMode(meio, OUTPUT);
	pinMode(atras, OUTPUT);  

}

void loop()
{
	EthernetClient client = server.available();    //servidor esperando uma requisicao, apos a requisicao ser encontrada a funcao retorna um objeto do tipo client 
        String a = "";
	if (client)
	{    //testa se o existe
                
		if(client.connected()) 
		{       
            
                        //testa se o cliente esta conectado
			while (client.available())
			{      
                                  
				char c = client.read();
                                a += c;
                                
				delay(500); // da um tempo para  o cliente receber os caracteres 

			}
                        Serial.println(a);
                        switch(a[0]){
                                
				case '3': //Frente
					Serial.println("Entrei no 10");
                                        if (a[1] == '1')
					{
						digitalWrite(frente, HIGH);
						//Serial.println("Ligando");
						client.println("1");
					}
					else
					{
						digitalWrite(frente, LOW);
						//Serial.println("Apagando");
						client.println("0");
					}
					break;

				case '6': //Meio
					Serial.println("Entrei no 20");
                                        if (a[1] == '1')
					{
						digitalWrite(meio, HIGH);
						//Serial.println("Ligando");
						client.println("1");
					}
					else
					{
						digitalWrite(meio, LOW);
						//Serial.println("Apagando");
						client.println("0");
					}
					break;

				case '9': //Atras
					Serial.println("Entrei no 30");
                                        if (a[1] == '1')
					{
						digitalWrite(atras, HIGH);
						//Serial.println("Ligando");
						client.println("1");
					}
					else
					{
						digitalWrite(atras, LOW);
						//Serial.println("Apagando");
						client.println("0");
					}
					break;
				}
                        
			//client.flush();
		}
		//client.stop();    //finaliza a conexao
	}
}

Aquele delay(500) não devia estar ali...

Estás a enviar ascii?

bubulindo:
Aquele delay(500) não devia estar ali…

Estás a enviar ascii?

Sim, no java to mandando uma string 31 para ligar ou 31 delisgar, mas é uma string ASCII, no caso do delay, tive q ajustar para dar tempo do dado ser recebido, diminuindo esse delay o led n liga…acredito eu por causa justamente do tempo de leitura…

Mas o led liga ou não?

Claro... imagina que envias o número "3" em ASCII... o arduino vai tentar ligar o pino 51. Ora vê aqui:

http://www.asciitable.com/

Conselho, deixa a String de lado... vê como se usam arrays em C e como se converte de ASCII para inteiro e depois olha de novo para o teu programa. ;)

bubulindo: Mas o led liga ou não?

Claro... imagina que envias o número "3" em ASCII... o arduino vai tentar ligar o pino 51. Ora vê aqui:

http://www.asciitable.com/

Conselho, deixa a String de lado... vê como se usam arrays em C e como se converte de ASCII para inteiro e depois olha de novo para o teu programa. ;)

Tipo, o led da porta 9 fica esperando de fato eu receber o comando via socket e funciona normalmente, o que está me intrigando e o led da porta 10 ligar assim que ennvio o codigo para o arduino e permanecer nesse estado como se estivesse em curto as portas (o que não está pois ja testei outros codigo e fucionam normalmente de maneira individual)....eu mando a string "31" e leio o caracter 3 (a[0]) e identifico o circuito e o 1(a[1]) para identificar o estado...nao uso a string toda gerada....por isso ele n tenta ligar a porta 31 digamos...pois eu uso a mesma apenas como codigo ele inteira so tem significado pra mim que conheço....para o arduino e uso ela como um vetor de fato, onde cada posição representa uma condiçao....

Não podes usar nada na porta 10.

Olha aqui:

http://forum.arduino.cc/index.php/topic,20114.0.html

o pino 10 é usado para o shield ethernet.

bubulindo: Não podes usar nada na porta 10.

Olha aqui:

http://forum.arduino.cc/index.php/topic,20114.0.html

o pino 10 é usado para o shield ethernet.

Vlw cara, acabei descobrindo na tentativa e erro...rs