一、中断方式接发数据
上代码:
#define Max_BUFF_Len 50
unsigned char Usart1_Buffer[Max_BUFF_Len];
unsigned int Usart1_Rx=0;
unsigned int TxCounter=0;
void NVIC_Configuration(void);
void USART1_IRQHandler()
{ //进入中断
if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET) //检测中断请求(判断寄存器是否为非空,因为串口先将数据发送给寄存器,寄存器再将数据发送给缓冲区buffer,若寄存器为空,则无法发送给Usart_Buffer)
{
Usart1_Buffer[Usart1_Rx] = USART_ReceiveData(USART1); //接收串口1数据到buff缓冲区
Usart1_Rx++;
if(Usart1_Buffer[Usart1_Rx-1] == '+' || Usart1_Rx == Max_BUFF_Len) //先判断当前字符是不是尾标识,如果
// 接到尾标识是+号(或者等于最大接收数,则接收完毕)
{
if(Usart1_Buffer[0] == '-') //再判断头标识,若正确,则接受的数据为我们想要的数据,接下来对它发送
{
for(TxCounter=0;TxCounter<Max_BUFF_Len;TxCounter++)
{
USART_SendData(USART1 ,Usart1_Buffer[TxCounter]);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE )==RESET);//等待发送完成 (加分号!!!)
if(Usart1_Buffer[TxCounter]=='+')
{
Usart1_Rx=0;
break;
} //检测到结束符就提前跳出
二、轮询方式
while(1)
{
//判断接收寄存器是否非空
if(USART_GetFlagStatus(USART1,USART_IT_RXNE) != RESET)
{
// 接收数据
i = USART_ReceiveData(USART1);
//发送数据
USART_SendData(USART1,i)
//等待发送完成
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE )==RESET);
}
}
**注意:**1、上面程序可看出,无论是使用中断方式接收还是查询方式,首先要判断接收数据寄存器是否为空,非空才可以进行接收。 (因为串口先将数据发送给寄存器,寄存器再将数据发送给缓冲区buffer,若寄存器为空,则无数据发送给Usart_Buffer)
2、发送数据时一般要判断发送状态,等待发送完成后执行后面的程序
//发送数据
USART_SendData(USART1,i)
//等待发送完成
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE )==RESET);
一定要加分号!!!
轮询方式是让CPU一直查询接收数据状态(好比老板一直等货车进仓库),而中断则是CPU让帮手去等待(货车一到,中断通知CPU)
(以上分析若有理解错误之处还请前辈指点一二,晚辈万分感谢!)