Nhận tín hiệu GPS qua uart bị lỗi.

cuongeuro

Trứng gà
Mình đang làm đề tại thu nhận sóng GPS từ molude sim548c ra LCD.
Chuẩn giao tiếp của GPS là UART.
Mình đã viết code nhưng gặp vấn đề sau, mọi người góp ý cho mình với.
+ Mình test bằng chương trình terminal, gỏ kí tự từ bàn phím để giả lập chuỗi GPS thì ok.
+ Khi kết nối pic với sim548c thì chỉ xuất ra LCD 1 lần duy nhất chuỗi $GPRMC. Mình chỉ cần tách chuỗi $GPRMC thôi.
+ Đây là chuổi GPS mình nhận được khi kết nối sim548c với máy tính thông qua terminal:

$GPRMC,163941.000,A,1046.6020,N,10639.9365,E,2.90,95.37,010611,,,A*51
$GPVTG,95.37,T,,M,2.90,N,5.4,K,A*3F
$GPGGA,163942.000,1046.6015,N,10639.9361,E,1,03,5.5,47.7,M,2.3,M,,0000*50
$GPGSA,A,2,10,17,28,,,,,,,,,,5.6,5.5,1.0*3C
$GPRMC,163942.000,A,1046.6015,N,10639.9361,E,1.62,72.50,010611,,,A*56
$GPVTG,72.50,T,,M,1.62,N,3.0,K,A*3B
$GPGGA,163943.000,1046.6011,N,10639.9373,E,1,03,8.6,49.4,M,2.3,M,,0000*55
$GPGSA,A,2,10,04,28,,,,,,,,,,8.7,8.6,1.0*3C
+ Chu trình cứ lặp lại như vậy với tốc độ boud là 4800.Mình giả sử chỉ lấy giờ phút giây thôi (163941).
+ Đây là code:
Code:
#include <htc.h>
#include <stdio.h>
#include "uart.h"
#include "lcd.h"

__CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & UNPROTECT & DUNPROTECT & BORDIS & IESODIS & FCMDIS & LVPDIS);

char buf[58];
void delay();
void  main()
//$GPRMC,183943.000,A,1046.6063,N,10639.9359,E,0.65,180.05,190511,,,A*63
{
    uart_init();
    lcd_init();
    char x; int i,j;
  
    while(1)
{
        i=0;
	x = uart_getc();
        while (x != 'R')             //confirm serial $GPRMC 
          {
	     x = uart_getc();
           }

   // nhan chuoi $GPRMC vao bien buf[] 
    	          for(i=0;i<10;i++)
       
		{ buf[i] = uart_getc();
		  uart_putc(buf[i]);
		}
   
//------TIME----------//
	lcd_gotoxy(0,0);
	lcd_puts("TIME:");
        lcd_putc(buf[3]);
	lcd_putc(buf[4]);
	lcd_putc(':');
	lcd_putc(buf[5]);
	lcd_putc(buf[6]);
	lcd_putc(':'); 
	lcd_putc(buf[7]);
	lcd_putc(buf[8]);

//------DATE----------//
//    lcd_puts("DATE:");
//	lcd_putc(buf[52]);
//	lcd_putc(buf[53]);
//	lcd_putc(':');
//	lcd_putc(buf[54]);
//	lcd_putc(buf[55]);
//	lcd_putc(':');
//	lcd_putc(buf[56]);
//	lcd_putc(buf[57]);

//------LONGITUDE-------//
//    lcd_puts("KD:");
//    lcd_putc(buf[16]);
//	lcd_putc(buf[17]);
//	lcd_puts("'");
//	lcd_putc(buf[18]);
//	lcd_putc(buf[19]);
//	lcd_putc(buf[20]);
//	lcd_putc(buf[21]);
//	lcd_putc(buf[22]);
//	lcd_putc(buf[23]);
//	lcd_putc(buf[24]);
//    lcd_putc(':');
//	lcd_putc(buf[26]);
//------LATITUDE-------//
//    lcd_puts("VD:");
//    lcd_putc(buf[28]);
//	lcd_putc(buf[29]);
//	lcd_puts("'");
//	lcd_putc(buf[30]);
//	lcd_putc(buf[31]);
//	lcd_putc(buf[32]);
//	lcd_putc(buf[33]);
//	lcd_putc(buf[34]);
//	lcd_putc(buf[35]);
//	lcd_putc(buf[36]);
//    lcd_putc(':');
//	lcd_putc(buf[38]);
   //__delay_ms(100);




}
}
 

nguyenphuocho

Trứng gà
Bạn tham khảo cái này xem sao nhé
Code:
#include <at89X51.H>
$baud = 9600
$crystal = 11059200
Config Lcd = 16 * 2



Config Lcdpin = Pin , Db4 = P0.2 , Db5 = P0.3 , Db6 = P0.4 , Db7 = P0.5 , E = P0.1 , Rs = P0.0



'$GPGGA,012211.83,4119.6171,N,07730.0636,W,1,03,3.6,00522,M,,,,*36

'GPS Time, Latitude, Longitude Display

'set up variables

Dim Gps As Byte , X As Byte , Lont(6) As Byte , Latt(6) As Byte
Dim Lat As Byte , Latmin As Byte , Latfrac As Byte , Latns As Byte
Dim Lon As Byte , Lonmin As Byte , Lonfrac As Byte , Lonew As Byte
Dim Timt(6) As Byte
Dim Hours As Byte , Mins As Byte , Secs As Byte


Home
Cls
Cursor Off

Looploop:
Home
Upperline
Startloop:

Gps = Waitkey()
If Gps &lt;&gt; "$" Then Goto Startloop

Gps = Waitkey()
If Gps &lt;&gt; "G" Then Goto Startloop

Gps = Waitkey()
If Gps &lt;&gt; "P" Then Goto Startloop

Gps = Waitkey()
If Gps &lt;&gt; "G" Then Goto Startloop

Gps = Waitkey()
If Gps &lt;&gt; "G" Then Goto Startloop

Gps = Waitkey()
If Gps &lt;&gt; "A" Then Goto Startloop

Gps = Waitkey()
If Gps &lt;&gt; "," Then Goto Startloop


For X = 1 To 6
   Gps = Waitkey()
   Lcd Chr(gps) ;
   Timt(x) = Gps
   If X = 2 Then Lcd ":";
   If X = 4 Then Lcd ":";
Next X


Timlop:
Gps = Waitkey()
If Gps = "," Then Goto Getlat
Goto Timlop


Getlat:
Lowerline
For X = 1 To 6
Getlat1:
   Gps = Waitkey()
   If Gps = "." Then Goto Getlat1
   Latt(x) = Gps
   Lcd Chr(gps);
Next X

Getlat2:
Gps = Waitkey()
If Gps &lt;&gt; "," Then Goto Getlat2
Gps = Waitkey()
Lcd Chr(gps) ; " ";
Latns = Gps
Gps = Waitkey()
Gps = Waitkey()

For X = 1 To 6
Getlon:
   Gps = Waitkey()
   If Gps = "." Then Goto Getlon
   Lont(x) = Gps
   Lcd Chr(gps);
Next X
Getlon1:
Gps = Waitkey()
If Gps &lt;&gt; "," Then Goto Getlon1
Gps = Waitkey()
Lcd Chr(gps);
Gps = Waitkey()
Gps = Waitkey()
Gps = Waitkey()
Locate 1 , 11
Lcd "Sat:"
Gps = Waitkey()
Lcd Chr(gps);
Gps = Waitkey()
Lcd Chr(gps);

Goto Looploop
 
Top