#define R2_BUFF_SIZE 4096
struct com2_str
{
vu32 pIn ; //入指针
vu32 pOut ; //出指针
vu32 pCount; //计数
vu8 pAny ; //查询指针
char Buf[R2_BUFF_SIZE];
};
struct com2_str uart2;
// 向串口2缓冲队列加入一个字符
static void Uart2Add(struct com2_str *com ,char data)
{
if(com->pCount > 0 && com->pIn == com->pOut)
{
printf("COM2 BUFF FULL!\r\n");
return;
}
else
{
com->Buf[com->pIn] = data;
com->pIn = (com->pIn + 1)%R2_BUFF_SIZE;
com->pCount++;
}
}
//从串口2缓冲队列取队头字符
extern char GetUart2(struct com2_str *com)
{
char temp;
temp = com->Buf[com->pOut];
com->pOut = (com->pOut + 1)%R2_BUFF_SIZE;
com->pCount--;
return temp;
}
//串口2中断服务程序
extern void Uart2Isr(void)
{
if(USART_GetITStatus(USART2,USART_IT_RXNE) == SET)
{
USART_ClearITPendingBit(USART2, USART_IT_RXNE); //清标志
Uart2Add(&uart2 ,USART_ReceiveData(USART2));
}
}
void AynDataSwapFlag(void)
{
char temp;
if(uart2.pCount == 0 ) return ;
while(uart2.pCount != 0 )
{
temp = GetUart2(&uart2);
Uart1Putc(temp); //串口1输出
if(VALIAD_ECHO(temp))//如果是有效的字符串
{
Echo.Buf[GprsEcho.Len++] = temp; //将temp加到另一个缓冲区
if(IS_LF(temp)) /* 如果收到换行 */
{
GprsEcho.Buf[GprsEcho.Len] = '\0';
if(GprsEcho.Len >= 3)/* 注意仅收到回车换行不处理 */
ProDataSwapFlag(); /* 处理字符串 */
GprsEcho.Len = 0; /* 注意处理完后清空回显缓冲区 */
}
}
else
GprsEcho.Len = 0;
}
return;
}
现在的情况是,串口 在判断换行(if(IS_LF(temp))
)时有时候检测不到换行,所以也就判断不了,另外那边是肯定发过来了,这样处理是不是有bug? |