merhaba arkadaşlar ben gps ten bilgileri alıyorum usart üzerinden. Örnek bir kod buldum gelen bilgileri çözümleyebilecek ama bu kod sanki biraz işlemciyi gereksiz yere çok oyalayacakmış gibi geldi sizlerinde görüşünüzü almak istedim.Çok deneyimim olmadığı için alternatif bir seçenekte bulamadım.
//PA9 USART1_TX pa10_rx
// Variables
int received = 0;
char DataType[] = "GPXXX";
char NMEA[] = "$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
char receive;
// End Variables
void main()
{
UART1_Init(56000); // Initialize UART module at 56000 bps
Delay_ms(100); // Wait for UART module to stabilize
while(1) {
if (UART1_Data_Ready() == 1) {
receive = UART1_Read();
if (receive == '$') // Check if sentence begins.
{
received = 0;
do{
if (UART1_Data_Ready() == 1)
{
UART1_Read_Text(DataType, ",", 10); // Capture GPXXX word
received = 1;
}
} while(received == 0);
// If it is GPGGA Data, then acquire it.
if ((DataType[2] == 'G') && (DataType[3] == 'G') && (DataType[4] == 'A'))
{
received = 0;
do{
if (UART1_Data_Ready() == 1)
{
UART1_Read_Text(NMEA, "*", 100); // Stop at *XX checksum data
received = 1;
}
} while(received == 0);
}
receive = "x";
}
}
}
}
String kütüphanesinde bulunan "strtok" deyimini kullanabilirsin bu işlem için.
bkz: http://www.cplusplus.com/reference/cstring/strtok/?kw=strtok (http://www.cplusplus.com/reference/cstring/strtok/?kw=strtok)
Verileri kesme ile alıp izlemelisiniz. Bu kod uarttan beklenen data gelinceye kadar aynı yerde çakılır. Mcu başka birşey yapamaz. Uart bağlantısı kesilirse yine çakılır.
evet kesme ile almayı düşünüyorum şimdi araştırıyorum strstr() fonksiyonunu gördüm bu fonksiyonu kullanmayı düşünüyorum
kesme olursa yukarda ki kodda sorun çıkmaz değil mi ?
(http://s18.postimg.cc/91mzcnhph/Ads_sdfsdf.jpg) (http://postimg.cc/image/91mzcnhph/)
resimde görüldüğü gibi sadece b harfini gösteriyor anlamadım neden böyle olduğunu ?