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){}
}
最终能正确输出结果:
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。请问只是什么原因?如下图,请教各位高手解答,非常感谢:
一周热门 更多>