高级会员

- 积分
- 901
- 金钱
- 901
- 注册时间
- 2015-12-24
- 在线时间
- 197 小时
|
我看的是F103的程序,请大家按照以下顺序试试。
1、随便打一个字符串,不要以回车结尾,发送。
2、再打一个字符串,这次以回车结尾,发送。
按照程序的逻辑,如果我们把第一个字符串假定为st1,第二个为st2,那么此时串口反馈的应该就是st1 & st2两个字符串的连接。
3、啥也不用动,把st2再发送一次。
问题出现了,反馈的字符串一定是st2后面又接了一串。
如果第一次发的是ABCD,第二次发了EGF/r/n,那么第一次反馈是ABCDEFG,再发EFG/r/n,那么反馈就是EFGDEFG。
解决方法也很简单,在出错重置缓存时候,除了清空长度计数外,加一句RBUFF[0] = 0x00,把缓存首字节置为/0。另外,在串口服务函数的接收部分,每往缓存里面追加一字节数据时一定要在下一个字节追加一个/0,这样就没问题了。
修改完的串口中断服务函数如下。
void USART1_IRQHandler(void) //串口1中断服务程序
{
u8 Res;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
Res =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据
if((USART_RX_STA&0x8000)==0)//接收未完成
{
if(USART_RX_STA&0x4000)//接收到了0x0d
{
if(Res!=0x0a)
{
USART_RX_STA=0x0000; //接收错误,重新开始
}
else
{
USART_RX_STA|=0x8000; //接收完成了
*USART_RX_BUFP = 0x00;
}
USART_RX_BUFP = USART_RX_BUF;
}
else //还没收到0X0D
{
if(Res==0x0d)
{
USART_RX_STA|=0x4000;
}
else
{
*USART_RX_BUFP++ = Res;
USART_RX_STA++;
if((USART_RX_STA & 0x1FFF) > USART_REC_LEN - 1)
{
USART_RX_STA = 0x8000; //缓冲池已满,接收终止
USART_RX_BUFP = USART_RX_BUF;
}
}
}
}
}
}
初来此论坛,也不知道这个有没有人发过,如果有人发过了,还请无视就好。
|
|