Go Down

Topic: Duvida para ler uma trama (Read 2 times) previous topic - next topic

tretas

Boas,

Estou a ver a tua função e a coisas que não percebo :( pois não sei usar ponteiros muitos menos em arrays.

Ja agora como é que a posso chamar através da função loop ?

Cpts


Zé tretas

Arduino Mega 2560
Arduino Nano
Arduino UNO Rev3
Raspberry PI Model B
EasyPIC v4

bubulindo

Code: [Select]


void loop(){
   char trama[18];
   
   if ( 0 == receive(trama)) {
      Serial.print("ERRO");
   }else{
      //o teu programa.

   }
}

#define RX_FRAME_SIZE    18

unsigned char receive(char * str){
unsigned char temp=0;

if (Serial.available()> RX_FRAME_SIZE) {//temos bytes suficientes...
   while(Serial.read() != 0xBB); //encontrar o inicio da trama.
     if (Serial.read() != 0xCC) {
         return 0;
     } else { //inicio da trama
        for (temp = 0; temp<RX_FRAME_SIZE-2; temp++) {
            str[temp] = Serial.read();
        }
return temp; //faltou-me isto.
}

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

tretas

Boas estou a testar o teu codigo e estou com problemas

Code: [Select]
while(Serial.read() != 0xBB); //encontrar o inicio da trama.

penso que seja nesta linha pois deve demorar muito tempo e se não enviar todos 1seg uma trama a carta de E/S ele reseta
Arduino Mega 2560
Arduino Nano
Arduino UNO Rev3
Raspberry PI Model B
EasyPIC v4

bubulindo

O meu código não envia nada... apenas recebe.

Se tu envias e ele responde, os dados ficam no buffer e depois esse código deve encontrar os dados uqe pretendes.

Já meteste um serial.print para veres se recebes realmente alguma coisa após enviares o comando?
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

HugoPT

#9
Feb 09, 2013, 10:30 pm Last Edit: Feb 09, 2013, 11:20 pm by HugoPT Reason: 1
Do que percebi tu entao envias lhe uma trama de 18 Bytes e depois ele devolve -te outros 18 bytes correcto.
Se assim é tens de criar uma funçao para enviar os 18 bytes e outra para receber os 18 bytes.
Para enviares podes usar assim:
Code: [Select]
unsigned char txBuffer[17];//Variavel com todos os elementos que queres enviar
txBuffer[0] = 0xbb;//Pelo que entendi este e sempre o startByte
txBuffer[1] = 0xcc;//Segundo byte
//... carregas os restantes com o que queres

depois para enviares no programa passas o vector para o procedimento e o numero de bytes que contem

sendBytes(txBuffer,17);
o procedimento é este:

void sendBytes(unsigned char * bufferToSend , uint8_t lenght)// Isto recebe um vector de char que conteem a informaçao que queres enviar
{
for(uint8_t i = 0; i<= lengh; i++)
   {
   Serial.write(bufferToSend[i]);
   }
}

Se declarares a variavel txBuffer como global podes fugir ao uso dos ponteiros se nao te sentires a vontade com eles, no entanto é bom estudares ponteiros.

Para receberes do modulo tens de ficar a espera do startByte 0xbb e quando o receberes entao carregas tudo o que tens no buffer para um outro vector rxBuffer.

Code: [Select]
void receivedData()
{
unsigned char temp = 0;

 if(Serial.available > 0){
   temp = Serial.read();
   if (temp == 0xbb)//Comprova que recebeste o startByte e estas pronto para receber os restantes 17 bytes, o que tens de esperar que eles entrem no buffer da Serial Port
       {
       while(Serial.available() <16);//Espera pelos 17 bytes restantes, nao sai desta linha ate que eles entrem
       for(uint8_t i = 0; i<= 16; i++)rxBuffer[i] = Serial.read();//Carrega os bytes para cada posiçao no vector
       }
       
   }


}

Nao testei o codigo mas a teoria será algo assim +-
Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

Go Up