[mw_shl_code=c,true]#include "MAX232.h"
uchar USART2_TxBuffer[30];
uchar USART2_TxHeadIndex=0;
uchar USART2_TxTailIndex=0;
uchar USART2_TxBusy=0;
uchar USART2_Reserve=0;
void MAX232_USART2_Init()
{
GPIO_InitTypeDef GPIO_InitUSART2;
NVIC_InitTypeDef NVIC_InitUSART2;
USART_InitTypeDef USART_InitUSART2;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
USART_DeInit(USART2);
GPIO_InitUSART2.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitUSART2.GPIO_Pin=GPIO_Pin_2;
GPIO_InitUSART2.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitUSART2);
GPIO_InitUSART2.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitUSART2.GPIO_Pin=GPIO_Pin_3;
GPIO_Init(GPIOA,&GPIO_InitUSART2);
USART_InitUSART2.USART_BaudRate=9600;
USART_InitUSART2.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitUSART2.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
USART_InitUSART2.USART_Parity=USART_Parity_No;
USART_InitUSART2.USART_StopBits=USART_StopBits_1;
USART_InitUSART2.USART_WordLength=USART_WordLength_8b;
NVIC_InitUSART2.NVIC_IRQChannel=USART2_IRQn;
NVIC_InitUSART2.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitUSART2.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitUSART2.NVIC_IRQChannelSubPriority=0;
NVIC_Init(&NVIC_InitUSART2);
USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
USART_ITConfig(USART2,USART_IT_TC,ENABLE);
USART_Init(USART2,&USART_InitUSART2);
USART_Cmd(USART2,ENABLE);
USART_GetFlagStatus(USART2, USART_FLAG_TC);
}
void USART2_SendByte(uchar Byte)
{
while(USART2_Reserve>29); //当缓冲区放满时程序就会在这里死循环
if(USART2_TxBusy==0 && (USART2_TxHeadIndex==USART2_TxTailIndex))
{
USART_SendData(USART2,Byte);
USART2_TxBusy=1;
}
else
{
USART2_TxBuffer[USART2_TxTailIndex]=Byte;
USART2_Reserve++;
if(++USART2_TxTailIndex>=30)
USART2_TxTailIndex=0;
}
}
void USART2_IRQHandler()
{
if(USART_GetFlagStatus(USART2,USART_FLAG_RXNE))
{
USART_ClearFlag(USART2,USART_FLAG_RXNE);
printf("MAX232Õy3£ÔËDD
");
}
if(USART_GetFlagStatus(USART2,USART_FLAG_TC))
{
USART_ClearFlag(USART2,USART_FLAG_TC);
if(USART2_Reserve!=0)
{
USART2_TxBusy=1;
USART_SendData(USART2,USART2_TxBuffer[USART2_TxHeadIndex]);
USART2_Reserve--;
if(++USART2_TxHeadIndex>=30)
USART2_TxHeadIndex=0;
}
USART2_TxBusy=0;
}
}
[/mw_shl_code]
随手写的程序已贴出,大伙们帮小弟看看……
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
这样给你说吧, 假设USART2跟打印的USART1是一样的波特率,那么就是说
你收了一个字节, 然后要发送十几个字节(USART1打印), 能在不漏掉的情况下接收所有USART2的数据?能不死循环么?
[mw_shl_code=c,true]int fputc(int ch, FILE *f)
{
USART2_SendByte((uchar)ch);
return ch;
}
void USART2_SendByte(uchar Byte)
{
while(USART2_Reserve>29);
if(USART2_TxBusy==0 && (USART2_TxHeadIndex==USART2_TxTailIndex))
{
USART_SendData(USART2,Byte);
USART2_TxBusy=1;
}
else
{
USART2_TxBuffer[USART2_TxTailIndex]=Byte;
USART2_Reserve++;
if(++USART2_TxTailIndex>=30)
USART2_TxTailIndex=0;
}
}
void USART2_IRQHandler()
{
if(USART_GetFlagStatus(USART2,USART_FLAG_RXNE))
{
USART_ClearFlag(USART2,USART_FLAG_RXNE);
printf("MAX232Õy3£ÔËDD ");
}
if(USART_GetFlagStatus(USART2,USART_FLAG_TC))
{
USART_ClearFlag(USART2,USART_FLAG_TC);
USART2_TxBusy=0;
if(USART2_Reserve!=0)
{
USART2_TxBusy=1;
USART_SendData(USART2,USART2_TxBuffer[USART2_TxHeadIndex]);
USART2_Reserve--;
if(++USART2_TxHeadIndex>=30)
USART2_TxHeadIndex=0;
}
}
}[/mw_shl_code]
谢谢,问题找到了,情况是这样的…(代码贴出了printf重定向)
我把发送函数放进了USART2中断内部了,如果缓冲区满了,会循环等待缓冲区数据减少,但是这个循环在USART2中断内…所以死循环了…
现在做了个标志位,把发送函数放main里问题解决了。
是循环队列啊,兄嘚
一周热门 更多>