Skip to main content
jameslenvo
Associate II
April 6, 2015
Question

STM32 with GPS

  • April 6, 2015
  • 6 replies
  • 1616 views
Posted on April 07, 2015 at 00:21

Hi there,

I'm trying to parse some GPS data, to do this I want to limit the NMEA string coming from my GPS. I've found online that I can send the following to the Rx pin of my GPS to tell it to just send the GPGGA line, but it doesn't seem to work. Here is the line: ''PMTK314,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0*2C<CR><LF>\r\n'' I'm sending it with my USART3 Tx function (send string function). If I add it in my interrupt, it malfunctions the output of the GPS to create data that is not worthy of anything. Notice I have two different sendstring functions, USART_SendString is for UART2 (Sending data only) and UART_SendString3 is for UART3 (Sending Data, UART3 also receives data) Here is my related code.

//void USART3_IRQHandler(void) {
//USART_SendString3(''PMTK314,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0*2C<
CR
><
LF
>\r\n'');
/*
if (( USART_CR1_RXNEIE) && (USART_CR1_TXEIE) != RESET){
USART_SendString3(''PMTK314,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0*2C<
CR
><
LF
>\r\n'');
rx = UART_read();
USART_SendString(&rx);
}
int main (void) {
Clock_init ();
GPIO_init ();
UART_init ();
// LCD_init ();
while (1) {
}
}

    This topic has been closed for replies.

    6 replies

    Tesla DeLorean
    Guru
    April 6, 2015
    Posted on April 07, 2015 at 00:38

    You understand that <CR><LF> are a description of the 13 and 10 characters, and not typed literally, right?

    That '' '' is C notation for the same.

    #include <
    stdio.h
    >
    int main(int argc, char **argv)
    {
    printf(''%d
    '','
    ');
    printf(''%d
    '','
    ');
    return(1);
    }

    There is a leading '$' on the PMTK314 command. Don't send multiple bytes to the USART in the interrupt.
    Tips, Buy me a coffee, or three.. PayPal VenmoUp vote any posts that you find helpful, it shows what's working..
    Tesla DeLorean
    Guru
    April 6, 2015
    Posted on April 07, 2015 at 00:51

    Your checksum is also wrong.

    This is the string you want to be sending

    ''$PMTK314,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0*2B\r\n''

    I think you need to review some basic documentation here.

    Tips, Buy me a coffee, or three.. PayPal VenmoUp vote any posts that you find helpful, it shows what's working..
    jameslenvo
    Associate II
    April 7, 2015
    Posted on April 07, 2015 at 03:42

    Wow thank you!! I totally misunderstood all that, but after your comments I did some googling and it works as I hoped. 

    jameslenvo
    Associate II
    April 7, 2015
    Posted on April 08, 2015 at 01:05

    Ok, sorry for the double post. I just fixed my LCD error. However, now I'm getting doubts my interrupt truly work. I tried to do some heavy lifting of parsing my code in my main loop and simply setting a flag in the interrupt to tell main to do the work, but it seems as though this never gets set? I understand I can't place delays in my ISR, so I thought setting a flag would be the best method.

    Below is my code :

    #include ''uart.h''
    #include <
    stdlib.h
    >
    #include <
    stdio.h
    >
    #include <
    string.h
    >
    volatile int flaggo = 0;
    int main (void) {
    char rx;
    Clock_init ();
    GPIO_init ();
    UART_init ();
    LCD_init ();
    USART_SendString3(''$PMTK314,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0*29
    
    '');
    while (1) {
    if (flaggo){
    rx = UART_read();
    USART_SendString(&rx);
    flaggo = 0;
    }
    }
    }
    void USART3_IRQHandler(void) {
    char rx;
    //while (( USART_CR1_RXNEIE) && (USART_CR1_TXEIE) != RESET){
    while ( (USART_CR1_RXNEIE) != RESET) {
    rx = UART_read();
    if ((rx == '
    ') || (rx == '
    ')) {
    flaggo = 1;
    //NVIC->ISER[0] |= NVIC_ICER_CLRENA_0;
    }
    }
    }

    Tesla DeLorean
    Guru
    April 8, 2015
    Tips, Buy me a coffee, or three.. PayPal VenmoUp vote any posts that you find helpful, it shows what's working..
    jameslenvo
    Associate II
    April 8, 2015
    Posted on April 08, 2015 at 03:28

    Hi Clive, thanks for the link. I've tried to implement that exact interrupt, but I still use RXNEIE and nothing gets to my main loop or any other function, do you happen to know how to disable the RXNEIE flag?