vitor_neves88 Posted May 24, 2006 at 10:12 PM Report #29397 Posted May 24, 2006 at 10:12 PM 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!!
Trifasico Posted May 26, 2006 at 08:20 AM Report #29560 Posted May 26, 2006 at 08:20 AM 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 ...
freesumo Posted May 26, 2006 at 05:59 PM Report #29619 Posted May 26, 2006 at 05:59 PM Isso são poucos dados, vitor_neves88, estas a usar a USART? Posta o código que estas a utilizar, não precisa de ser o código todo só aquele que faz a configuração da USART(se a tiveres a usar) e o que controla a comunicação.
vitor_neves88 Posted May 27, 2006 at 10:32 AM Author Report #29690 Posted May 27, 2006 at 10:32 AM 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'; }
vitor_neves88 Posted May 29, 2006 at 05:45 PM Author Report #29982 Posted May 29, 2006 at 05:45 PM o codigo já funciona, mas estou com problemas nos ciclos e não estou a detectar o erro alguem me pode ajudar??
freesumo Posted May 31, 2006 at 04:39 AM Report #30296 Posted May 31, 2006 at 04:39 AM 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 😄
vitor_neves88 Posted May 31, 2006 at 10:40 PM Author Report #30490 Posted May 31, 2006 at 10:40 PM 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"); }
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now