串口进行数据转发,RX收到1个字节后立即通过TX转发出去,测试下来的收发情况如下:
15:08:47.027 1234567890 1234567890
15:08:47.031 1234567890 123567890
15:08:47.220 1234567890 1234567890
15:08:47.224 1234567890 124567890
15:08:47.438 1234567890 1234567890
15:08:47.442 1234567890 124567890
15:08:47.610 1234567890 1234567890
15:08:47.614 1234567890 123567890
可以看出都是第二列数据的第三或第四个没接收到,分析后认为可能是发送占用时间过长导致来不及接收,但是尝试调低波特率后情况仍然相同,又测试注释掉while((USART2->SR&0X40)==0);后接收就会正常,想探究原因究竟何在?
[mw_shl_code=c,true]void uart2_init(u32 pclk2,u32 bound)
{
float temp;
u16 mantissa;
u16 fraction;
temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
mantissa=temp; //得到整数部分
fraction=(temp-mantissa)*16; //得到小数部分
mantissa<<=4;
mantissa+=fraction;
RCC->APB2ENR|=1<<2; //使能PORTA口时钟
RCC->APB1ENR|=1<<17; //使能串口时钟
GPIOA->CRL&=0XFFFF00FF;//IO状态设置
GPIOA->CRL|=0X00008B00;//IO状态设置
RCC->APB1RSTR|=1<<17; //复位串口2
RCC->APB1RSTR&=~(1<<17);//停止复位
//波特率设置
USART2->BRR=mantissa; // 波特率设置
//USART2->CR1|=0X200C; //1位停止,无校验位.
USART2->CR1|=0X360C; //1位停止,奇校验
#ifdef EN_USART1_RX //如果使能了接收
//使能接收中断
USART2->CR1|=1<<8; //PE中断使能
USART2->CR1|=1<<5; //接收缓冲区非空中断使能
MY_NVIC_Init(3,3,USART2_IRQChannel,2);//组2,最低优先级
#endif
}
void USART2_IRQHandler(void)
{
u8 res;
if(USART2->SR&(1<<5))//接收到数据
{
res=USART2->DR;
USART2->DR=res;//转发
while((USART2->SR&0X40)==0);//等待发送结束 注:加上这句后接受到的数据不完整!
return;
}
} [/mw_shl_code]
|