2016-04-08 27 views
1

Bir LCD ekranda (boylam ve enlem) bazı verileri görüntülemek için bir GPS modülüne sahip bir ATMega32 kullanıyorum. GPS modülü, saniyede 9600 bps'de bir veri dizesi gönderir. Dize, $ işareti ile başlayan bir NMEA cümlesidir ve bu karakteri alıcının (AVR UART) senkronize edilmesi için kullanıyorum. Ben GPS_read bir char array geçmek ve daha sonra LCD ekranda dize görüntülemekAVR USART beklendiği gibi çalışmaz

// GPS.h 

void GPS_read(char *sentence)   
{ 
    while ((*sentence = USART_receive()) != '$') 
    ; 
    USART_receive_string(++sentence); 
} 



// USART.h 

unsigned char USART_receive(void) 
{ 
    while (!(UCSRA & (1<<RXC))) 
    ; 
    return UDR; 
} 

void USART_receive_string(char *string) 
{ 
    do 
    { 
    *string = USART_receive(); 
    } while (*string++ != '\n');        // NMEA sentences are <CR><LF> terminated 
    *string = '\0'; 
} 

:

bu

kullandığım koddur. Verileri görüntülemek için seçtiğim zamanlamaya bağlı olarak, bir $ G ve bir \ n karakterinden oluşan bazı çöp verileri alıyorum.

Burada bazı hata yapıyorum, ama iki gün oldu ve ben

yardım lütfen (ben bir acemi gömülü programcı değilim :)) yanlış yapıyorum anlamaya olamaz! teşekkürler Luca

cevap

0

TX ve RX baud hızınızın doğru olduğunu kontrol ettiniz mi? Çerçeve hatalarını da kontrol edin. Eğer karakter dizi bildirimi dahil etmedik

ama, okumak için öğesi takip etmek için indexleyici kullanmak tavsiye ve/veya oluşturma: koduyla birkaç hataları var

-1

, bu deneyin dizininize yazarak. Ben senin USART_receive() fonksiyonu iyi, ama denemek söyleyebilirim Fonksiyonlarınızdan için

unsigned char Sentence[*Insert array size here*]; 
unsigned char Indexer = 0; 

gibi ...

void GPS_read(char *sentence) 
{ 
    unsigned char Data = USART_receive(); // Read initial value 
    while (Data != '$')      // while Data is not a '$' ... 
     Data = USART_receive();    // ... Read the USART again until it is 

    sentence[Indexer++] = Data; 
    USART_receive_string(sentence);   
} 

void USART_receive_string(char *string) 
{ 
    unsigned char Data = USART_receive(); 

    while (Data != '\n') 
    { 
     *string[Indexer++] = Data; 
     Data = USART_receive(); 
    } 
    *string[Indexer] = '\n'; 
} 
+0

'* cümle [Indexer ++]'? - Ben öyle düşünmüyorum. – JimmyB

+0

"Kodunuzda birkaç hata var" - Bu hatalar nelerdir? – JimmyB

+0

Neden? * cümle, char diziliminin adresini işaret eder, Index bir indeksleyici olarak kullanılır, Data değeri dizinin o belirli elemanına kaydedilirse, Indexer'ı dizideki bir sonraki öğeye bir 'nokta' ile artar USART_receive_string() işlevi için. Neyi kaçırıyorum? –

İlgili konular