⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart0_drv.c

📁 通过串口向GPS模块不停的发送设置命令
💻 C
字号:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include "avr.h"
#include "UART0_drv.h"
/**********************************************************************/
/* These are the global variables                                     */
/**********************************************************************/
//UART related buffers and variables
u08 UART0_RxBuf[UART0_RX_BUFFER_SIZE];
volatile	u08 UART0_RxHead;
volatile	u08 UART0_RxTail;

u08 UART0_TxBuf[UART0_TX_BUFFER_SIZE];
volatile	u08 UART0_TxHead;
volatile	u08 UART0_TxTail;
//--------------------------------------------------------------------------------------
void init_UART0( void )
{
//	UBRR = BAUDRATE; /* set the baud rate */
	UBRRL = LOBYT(F_CPU/16/BAUD-1);
	UBRRH = HIBYT(F_CPU/16/BAUD-1);
	/* enable UART receiver and transmitter, and
	receive interrupt */
	UCSRA = 0;
	UCSRB = ( (1<<RXCIE) | (1<<RXEN) | (1<<TXEN) );
	UCSRC = ( (1<<UCSZ1) | (1<<UCSZ0));
    /* flush receive buffer */
	UART0_RxTail = 0;
	UART0_RxHead = 0;
	UART0_TxTail = 0;
	UART0_TxHead = 0;
}
//--------------------------------------------------------------------------------------
SIGNAL (SIG_USART_RECV)
{
	unsigned char data;
	unsigned char tmphead;
	data = UDR; /* read the received data */
	/* calculate buffer index */
	tmphead = ( UART0_RxHead + 1 ) & UART0_RX_BUFFER_MASK;
	UART0_RxHead = tmphead; /* store new index */
	if ( tmphead == UART0_RxTail )
	{
	   /* ERROR! Receive buffer overflow */
	}
	UART0_RxBuf[tmphead] = data; /* store received data in buffer */
}
//--------------------------------------------------------------------------------------
SIGNAL (SIG_USART_DATA)
{
	unsigned char tmptail;

	/* check if all data is transmitted */
	if ( UART0_TxHead != UART0_TxTail )
	{
		/* calculate buffer index */
		tmptail = ( UART0_TxTail + 1 ) & UART0_TX_BUFFER_MASK;
		UART0_TxTail = tmptail; /* store new index */
		UDR = UART0_TxBuf[tmptail]; /* start transmition */
	}
	else
	{
		UCSRB &= ~(1<<UDRIE); /* disable UDRE interrupt */
	//	UCSR0B |= (1<<TXCIE0); /* enable TXCIE interrupt */
	}
}

//--------------------------------------------------------------------------------------
unsigned char UART0_ReceiveByte( void )
{
	unsigned char tmptail;
	while ( UART0_RxHead == UART0_RxTail ) /* wait for incomming data */
		;
	tmptail = ( UART0_RxTail + 1 ) & UART0_RX_BUFFER_MASK;/* calculate buffer index */
	UART0_RxTail = tmptail; /* store new index */
	return UART0_RxBuf[tmptail]; /* return data */
}
//--------------------------------------------------------------------------------------
void UART0_TransmitByte( unsigned char data )
{
	unsigned char tmphead;
	/* calculate buffer index */
	tmphead = ( UART0_TxHead + 1 ) & UART0_TX_BUFFER_MASK; 
		/* wait for free space in buffer */
	while ( tmphead == UART0_TxTail )		;
	UART0_TxBuf[tmphead] = data; /* store data in buffer */
	UART0_TxHead = tmphead; /* store new index */
	UCSRB |= (1<<UDRIE); /* enable UDRE interrupt */
}

unsigned char UART0_DataInReceiveBuffer( void )
{
	return ( UART0_RxHead != UART0_RxTail ); 
		/* return 0 (FALSE) if the receive buffer is empty */
}
 
//end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -