您的位置 首页 芯闻

AVR 单片机UART以查询、中止方法发送数据

/***************************************************************************************************

/****************************************************************************************************************

* AVR 单片机UART查询中止方法发送数据

* 阐明:测验环境 硬件M16、开发渠道IAR for AVR V5.11B

****************************************************************************************************************/

//———————-初始化——————————————————————-

void Uart_init(long int baud)
{
baud=mclk/16/baud-1; //波特率最大为65K
UCSRB=0x00;
UCSRA=0x00; //操控寄存器清零
UCSRC=(0< UBRRL=baud;
UBRRH=baud>>8; //设置波特率
UCSRB=(1< SREG|=(1<<7); //大局中止敞开
}

//———————查询方法 发送–start———————————————————-

/***********************************************************
*名 称:
*功 能:从串口UART0发送一字节

*进口参数:sendB:发送的单个字节

*说 明:

***********************************************************/
void Uart_sendB(uchar sendB)
{
while(!(UCSRA&(1<UDR=sendB; //发送数据
while(!(UCSRA&(1<UCSRA|=1<}

/***********************************************************
*名 称:
*功 能:从串口UART0发送一字符串

*进口参数:*sendpt:字符串首地址
*说 明:

***********************************************************/

void Uart_sentstr(uchar *sendpt)
{
while(*sendpt)//字符串未完毕则持续发送
{
Uart_sendB(*sendpt++);
}
}

/***********************************************************
*名 称:
*功 能:从串口UART0发送一组字节数据
*进口参数:*p:待发的首个字节数据,len 发送个数
*说 明:

***********************************************************/

void Uart_sentstr_Array(uchar *p,uchar len)
{
uchar i;
for(i=0;i{
Uart_sendB(*p++);
}
}

//——————————————–end——————————————————–

//——————————————–中止方法发送– start—–硬件M164P—————————————-

/******************************************************
**由宏界说TXRX_FIFO操控此段代码的编译
**用于高效收发数据,收发均不堵塞CPU运转。

**函数口中包含了两种中止发送方法,可挑选 缓冲空中止 || 发送完毕中止。
******************************************************/
//#if(TXRX_FIFO==1)
#define TXRXBUF_SIZE 64
uchar TXRX_BUFF[TXRXBUF_SIZE];
volatile uint UART_OutLen=0;
volatile uint TXRX_IndexR=0;
volatile uint TXRX_IndexW=0;

/***********************************************************
*名 称:Uart_IntSentBuf
*功 能:从串口UART0发送一组字节数据
*进口参数:*p:待发的首个字节数据,len 发送个数
*出口参数:回来1:发送成功
* 回来0:发送失利
*说 明:在发送过程中,不堵塞CPU的运转。 函数口中包含了两种中止发送方法,可挑选
***********************************************************/
UINT8 Uart_IntSentBuf(UINT8 *p,UINT8 len)
{
UINT8 i;

if (len <= (TXRXBUF_SIZE-UART_OutLen))//缓存区空间不小于发送字节数
{

//————方法一 缓冲空中止————————————–
if(!(UCSR0B&(1< {
UART_OutLen=TXRX_IndexR=TXRX_IndexW=0;
}
else
{
UCSR0B &= ~(1< }

for ( i=0;i {
UART_OutLen++;//发送字节数
UART_RxTx[TXRX_IndexW]=*p++;//移入FIFO数据
if(++TXRX_IndexW >= TXRXBUF_SIZE)
{
TXRX_IndexW=0;//FIFO回头
}
}

if(UCSR0A&(1< UCSR0A|=(1< UCSR0B |= (1< //———————-end 方法一 ————————————
/*

//————方法二 发送完毕中止————————————–
if(!(UCSR0B&(1< {
UART_OutLen=TXRX_IndexR=TXRX_IndexW=0;
for ( i=0;i {
UART_OutLen++;//发送字节数
UART_RxTx[TXRX_IndexW]=*p++;//移入FIFO数据
if(++TXRX_IndexW >= TXRXBUF_SIZE)
{
TXRX_IndexW=0;//FIFO回头
}
}
if(UCSR0A&(1< UCSR0A|=1< UCSR0B |= (1< UDR0=UART_RxTx[TXRX_IndexR];
–UART_OutLen;
++TXRX_IndexR;
}
else
{
UCSR0B &= ~(1< for ( i=0;i {
UART_OutLen++;//发送字节数
UART_RxTx[TXRX_IndexW]=*p++;//移入FIFO数据
if(++TXRX_IndexW >= TXRXBUF_SIZE)
{
TXRX_IndexW=0;//FIFO回头
}
}
UCSR0B |= (1< }

//———————-end 方法二 ————————————

*/

return 1;
}
else
return 0;

}

//————方法一 缓冲空中止————————————–
#pragma vector = USART0_UDRE_vect
__interrupt void UsartUDRE(void) //串口缓冲器空中止函数声明
{
if(UART_OutLen>0)
{
UDR0=UART_RxTx[TXRX_IndexR];
–UART_OutLen;
if(++TXRX_IndexR >= TXRXBUF_SIZE)
{
TXRX_IndexR=0;//FIFO回头
}
}
else //发送完毕
{
//UART_OutLen=TXRX_IndexR=TXRX_IndexW=0;
UCSR0B &= ~(1< }

}

//———————-end 方法一 ————————————

/*

//————方法二 发送完毕中止————————————–
#pragma vector = USART0_TX_vect
__interrupt void UsartTx(void) //串口发送完毕中止函数声明
{
if(UART_OutLen>0)
{
UDR0=UART_RxTx[TXRX_IndexR];
–UART_OutLen;
if(++TXRX_IndexR >= TXRXBUF_SIZE)
{
TXRX_IndexR=0;//FIFO回头
}
}
else //发送完毕
{
//UART_OutLen=TXRX_IndexR=TXRX_IndexW=0;
UCSR0B &= ~(1< }
}

//———————-end 方法二 ————————————

*/

#endif

//—————————————————-end———————————————————————

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/xinwen/266971.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部