Jump to content

Receber RS232 no PIC18F458


Recommended Posts

Pessoal estou com um pequeno problema, preciso de receber dados de um receptor gps num pic 18f458 no protocolo rs232 e não sei como fazer!

O que o GPS esta a enviar (pelo menos para o hiperterminal do win) é o seguinte:

$GPRMC,092444,V,3800.1979,N,00900.1496,W,,,281105,004.0,W*6B

O que eu queria era receber estes dados todos no pic para um array de ram para depois seleccionar os dados que me intressam!!

P.S. Eu já consigo enviar dados do pic para PC por RS232 logo as ligações ao pic estão bem feitas!!

Link to comment
Share on other sites

Tens de usar o UART da pic, que é um dispositivo autonomo que as PICs tem para fazer a comunicação RS232. Se elas não tivessem terias de gerar/receber o start bit, control bit, CRC, dados etc

Assim só tens de configurar os registos e praticamente mais nada.

Se estiveres a escrever em C, depois de iniciares o uart, gerlamente podes usar o printf, scanf, getc, etc ...

Link to comment
Share on other sites

O codigo onde eu estou agora é o seguinte:

  setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED);
   setup_comparator(NC_NC_NC_NC);

void read_RS232();  // funcao leitura
int i = 0; // numero do caracter em que vai max 60
int j = 0;
char string[62];  //comprimento total da msg
char latitude[13];
char longitude[13];


void main(){

while(1){

   output_high(pin_a1); //teste para ver se funciona//
   read_RS232();        // funcao de leitura
   output_low(pin_d1);  //teste de saida da funcao

   for (i=0; i<12; i++){
      latitude[i] = string[j+16];//16 inicio da latitude
      j++;
   }
   latitude[12] = '\0';
   j=0;
   for (i=0; i<12; i++){
      longitude[i] = string[j+28]; //inicio da longitude
      j++;
   }
   longitude[12] = '\0';
   j=0;

//fim do programa
//
}
}

// codigo para ler
void read_RS232(){

   for(i=0; i<61; i++){
       string[i] = getc();
   }
   string[61] = '\0';
   }
Link to comment
Share on other sites

Já funciona, óptimo, de qualquer modo vou postar aqui 2 link's que podem dar algum jeito.

Em Hi-Tech C, source code para usar a USART:

http://www.microchipc.com/sourcecode/PIC_Hi-Tech_C_PIC18Fxxx_serial_comms_sample.zip

E o AN774 da Microchip com source code em asm:

http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1824&appnote=en012073

Já agora diz o que que te faltava? Configurar a USART?

Cyas 😄

Link to comment
Share on other sites

já resolvi o problema!! utilizei outra função "gets" (agora lê a string completa!!)

vou deixar o codigo para quem necessitar:

#include "d:\programas de teste\leitura gps.h"
#include <string.h>




   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED);
   setup_comparator(NC_NC_NC_NC);

void read_RS232();  // função leitura
int i = 0;
int j = 0;
char string[61];  //comprimento total da msg
char latitude[13];
char longitude[13];


void main(){
      printf("inicio \r\n");//para teste

while(1){
   delay_ms(100);
   read_RS232();        // fç de leitura
   printf("saiu\r\n");  //teste

   //criar string latitude
   for (i=0; i<11; i++){
      latitude[i] = string[j+17];//16 inicio da latitude
      j++;
   }
   latitude[12] = '\0';
   j=0;
   //criar string longitude
   for (i=0; i<12; i++){
      longitude[i] = string[j+29]; //inicio da longitude
      j++;
   }
   longitude[12] = '\0';
   j=0;



//fim do programa


////////////////////////////// IMPRESSAO PARA CONFIRMAÇÃO ///////////
//imprimir latitude                                               ///
   printf("latitude  ");                                          ///
   for(i=0; i<11; i++){                                           ///
      printf("%c",latitude[i]);                                   ///
   }                                                              ///
//imprimir longitude                                              ///
   printf("\t longitude  ");                                      ///
   for(i=0; i<12; i++){                                           ///
      printf("%c",longitude[i]);                                  ///
   }
                                                              ///
   printf("\n\r");
                                              ///
  
   j=0;                                                           ///
/////////////////////////////////////////////////////////////////////
}
}



// codigo para ler

void read_RS232(){
   printf("entrou \n\r");
   gets(string);
   printf("\n\r");
   }
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.