串口中断缓存,缓存输错!求解!

2019-08-13 19:04发布

1. 我手里有款激光传感器,需要STM32接收传感器数据。通过STM32给传感器发送指定命令后,激光传感器返回数据协议如下:
    起始帧以十六进制:0XA5,0X5A,0X05,0X00,0X00,0X40,0X81共7个字节作为数据其实判断。之后不断传回5个字节一个数据包的有用信息。
        2.为此,我通过串口2给传感器发送命令,并通过串口2中断接收传感器数据,并通过串口1与电脑通讯以判断数据正确性。首先采用串口2收一次就立即发送给串口1方式,在串口调试助手里能有效显示数据信息,代码和接受如下所示:
                                               /*main函数如下所示*/
int main(void)
 {
SystemInit();
delay_init(72);    
uart_init(115200);
NVIC_Configuration();
while(1)
{
RpCmd(RPLIDAR_CMD_FORCE_SCAN);//发送命令
delay_ms(1000); 
    for(m;m<128;m++)
    {printf("Buf[%d",m);
     printf("]=%02hhx ",USART2_RX_BUF[m]);
  }
                                               /***串口2中断函数如下:***/
void USART2_IRQHandler(void) {       
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  //????????
{
  USART_ClearITPendingBit(USART2,USART_IT_RXNE);
Res2 =USART_ReceiveData(USART2);//
USART_SendData(USART1,Res2);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){}
}
最终能正确输出结果:







友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
7条回答
coolzhangone
2019-08-13 20:13
续上

3.但是当我计划采用缓存接收时,却出现问题了,我是这么想的:定义一个接受标识符USART2_RX_STA,其最高位作为接收完成标志符,剩下7位用于计数,因此功能计数128个,用数组USART2_RX_BUF[128]缓存数据。并在中断函数中显示每次中断接收的数据,以及在main函数中for显示接收到的数组成员,如下所示:
 
                                                /***中断接收函数***/
void USART2_IRQHandler(void)  {
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) 
{
  USART_ClearITPendingBit(USART2,USART_IT_RXNE);
Res2 =USART_ReceiveData(USART2);//(USART2->DR); 
   if((USART2_RX_STA&0x80)==0) //缓存接收
{
USART2_RX_BUF[USART2_RX_STA&0x7F]=Res2;
printf("^^%d^^",USART2_RX_BUF[USART2_RX_STA]);
++USART2_RX_STA;
if(USART2_RX_STA==127) 
USART2_RX_STA|=0x80;
else USART2_RX_STA&=0x7F;
}
}

但是现在问题来了:在起始帧中,判断需要的7个字节只能正确显示头2个字节0XA5和0X5A。请问只是什么原因?如下图,请教各位高手解答,非常感谢:


一周热门 更多>