AVR USART没有按预期工作

时间:2016-04-08 11:23:11

标签: gps avr uart atmega

我使用带有GPS模块的ATMega32在LCD显示器上显示一些数据(经度和纬度)。 GPS模块每秒以9600 bps发送一串数据。 该字符串是一个NMEA语句,以$符号开头,我使用该字符同步接收器(AVR UART)。

这是我使用的代码:

// 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';   
}

我将一个char数组传递给GPS_read,然后在LCD上显示该字符串。 根据我选择显示数据的时间,我得到一些由$ G和\ n字符组成的垃圾数据。

我在这里犯了一些错误,但是已经两天了,我无法弄清楚我做错了什么(我是新手嵌入式程序员:))

请帮忙! 谢谢 卢卡

2 个答案:

答案 0 :(得分:0)

您是否检查过TX和RX的波特率是否正确?检查帧错误。

答案 1 :(得分:-1)

您的代码存在一些错误,请尝试以下操作:

您没有包含您的char数组声明,但我建议您使用索引器来跟踪您正在数组中读取和/或写入的元素。

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

至于你的功能,我会说你的USART_receive()函数没问题,但试试......

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';
}