我使用带有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字符组成的垃圾数据。
我在这里犯了一些错误,但是已经两天了,我无法弄清楚我做错了什么(我是新手嵌入式程序员:))
请帮忙! 谢谢 卢卡
答案 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';
}