首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

一个非常好的串口程序[转帖]

一个非常好的串口程序[转帖]





#i nclude <iom128v.h>
#i nclude <macros.h>
#i nclude "uart.h"


/* USART Buffer Defines */
#define USART_RX_BUFFER_SIZE 16 /* 1,2,4,8,16,32,64,128 or 256 bytes */
#define USART_RX_BUFFER_MASK ( USART_RX_BUFFER_SIZE - 1 )
#define USART_TX_BUFFER_SIZE 16 /* 1,2,4,8,16,32,64,128 or 256 bytes */
#define USART_TX_BUFFER_MASK ( USART_TX_BUFFER_SIZE - 1 )


#if ( USART_RX_BUFFER_SIZE & USART_RX_BUFFER_MASK )
#error RX buffer size is not a power of 2
#endif


/* Static Variables */
static unsigned char USART_RxBuf[USART_RX_BUFFER_SIZE];
static volatile unsigned char USART_RxHead;
static volatile unsigned char USART_RxTail;
static unsigned char USART_TxBuf[USART_TX_BUFFER_SIZE];
static volatile unsigned char USART_TxHead;
static volatile unsigned char USART_TxTail;


/* 串口初始化 */
void InitUSART(INT8U  baudrate)
{
INT8U x;
UBRR0L = baudrate;
UCSR0B = ( (1<<RXCIE0) | (1<<RXEN0) | (1<<TXEN0) );/*RX Complete
Interrupt Enable, Receiver Enable and Transmitter Enable*/
x = 0; /* flush receive buffer */
USART_RxTail = x;
USART_RxHead = x;
USART_TxTail = x;
USART_TxHead = x;
}


/* 接收中断 */
void USART_RX_interrupt( void )
{
unsigned char data;
unsigned char tmphead;
data = UDR0; /* read the received data */
tmphead = ( USART_RxHead + 1 ) & USART_RX_BUFFER_MASK;/* calculate
buffer index */
USART_RxHead = tmphead; /* store new index */
if ( tmphead == USART_RxTail )
{
return;/* ERROR! Receive buffer overflow, you can use
flux cortorl */
}
USART_RxBuf[tmphead] = data; /* store received data in buffer */
}


/* 发送中断 */
void USART_TX_interrupt( void )
{
unsigned char tmptail;


if ( USART_TxHead != USART_TxTail )/* check if all data is
transmitted */
{
tmptail = ( USART_TxTail + 1 ) & USART_TX_BUFFER_MASK;/*
calculate buffer index */
USART_TxTail = tmptail; /* store new index */
UDR0 = USART_TxBuf[tmptail]; /* start transmition */
}
else
{
UCSR0B &= ~(1<<UDRIE0); /* disable UDRE interrupt */
}
}


/* 读取数据函数 */
unsigned char ReceiveByte( void )
{
unsigned char tmptail;


while ( USART_RxHead == USART_RxTail ) /* wait for incomming data */
;
tmptail = ( USART_RxTail + 1 ) & USART_RX_BUFFER_MASK;/* calculate
buffer index */
USART_RxTail = tmptail; /* store new index */
return USART_RxBuf[tmptail]; /* return data */
}


/* 发送数据函数 */
void TransmitByte( unsigned char data )
{
unsigned char tmphead;


tmphead = ( USART_TxHead + 1 ) & USART_TX_BUFFER_MASK; /* calculate
buffer index */


while ( tmphead == USART_TxTail )/* wait for free space in buffer */
;
USART_TxBuf[tmphead] = data; /* store data in buffer */
USART_TxHead = tmphead; /* store new index */
UCSR0B |= (1<<UDRIE0); /* enable UDRE interrupt */
}


/* 查询是否有数据 */
unsigned char DataInReceiveBuffer( void )
{
return ( USART_RxHead != USART_RxTail ); /* return 0 (FALSE) if the
receive buffer is empty */
}


/* 中断中只做很少的事情,通常我是在接收中断中post一个信号量,触发别的任务读数据
*/

返回列表