历史上的今天
今天是:2024年09月17日(星期二)
2019年09月17日 | STM8S 带缓冲区 串口中断 使用心得
2019-09-17 来源:eefocus
#include "UART.H"
/*-------------------------串口初始化函数------------------------*/
/***********************************************************
* 函数名称:void UART2_Init(void)
*
* 功能描述:UART2初始化函数
*
* 参数列表:无
*
* 返回结果:无
***********************************************************/
void UART2_Init(void)
{
UART2_CR1=0x00;
UART2_CR2=0x00;
UART2_CR3=0x00;
UART2_BRR2=0x0B;
UART2_BRR1=0x08;
UART2_CR2=0x2c; //允许接收,发送,开接收中断
_asm("rim"); //开全局中断
}
/*-------------------------串口接收相关函数------------------------*/
unsigned char RNUM; //定义接收变量
u8 rx_buffer[RX_BUFFER_SIZE]; //接收缓冲区
#if RX_BUFFER_SIZE <= 256
u8 rx_wr_index = 0, rx_rd_index = 0, rx_counter; //接收写指针,接收读指针,接收字符个数
#else
u16 rx_wr_index = 0, rx_rd_index = 0, rx_counter; //接收写指针,接收读指针,接收字符个数
#endif
#if RX_BUFFER_SIZE < 256
u8 rx_counter; //接收字符个数
#else
u16 rx_counter; //接收字符个数
#endif
_Bool rx_buffer_overflow; //接收缓冲区溢出标志
/***********************************************************
* 函数名称:@far @interrupt void UART2_Rec_HandledInterrupt(void)
*
* 功能描述:接收中断函数
*
* 参数列表:无
*
* 返回结果:无
***********************************************************/
@far @interrupt void UART2_Rec_HandledInterrupt(void)
{
if (UART2_SR & 0X0F)
{
RNUM = UART2_SR;
RNUM = UART2_DR; //读取数据
}
else
{
RNUM = UART2_DR; //读取数据
}
rx_buffer[rx_wr_index++] = RNUM; //把数据写入接收缓冲区 接收写指针++
#if RX_BUFFER_SIZE == 256
if (++rx_counter == 0) rx_buffer_overflow = 1; //溢出标志置位
#else
if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index = 0; //如果写入指针等于 缓冲区大小 写入指针指向第一位
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter = 0;
rx_buffer_overflow = 1;
}
#endif
}
/***********************************************************
* 函数名称:char getchar(void)
*
* 功能描述:从接收缓冲区获取一字节数据
*
* 参数列表:无
*
* 返回结果:获取到的数据
***********************************************************/
char getchar(void)
{
char data;
while (rx_counter == 0); //如果接收数据个数为0 则等待
data = rx_buffer[rx_rd_index++];
#if RX_BUFFER_SIZE != 256
if (rx_rd_index == RX_BUFFER_SIZE) rx_rd_index = 0;
#endif
_asm("sim"); //关总中断
--rx_counter;
_asm("rim"); //开总中断
return data;
}
/***********************************************************
* 函数名称:int getStr(char *Buf,int count)
*
* 功能描述:从接收缓冲区获取一帧数据
*
* 参数列表:*Buf 存储收到的数据 数组
* count 要获取的数据长度
*
* 返回结果:返回获取到的数据长度
***********************************************************/
int getStr(char *Buf,int count)
{
int i = 0;
for (i=0; i Buf[i] = getchar(); } Buf[i] = '




