赞
踩
OpenMV与STM32单片机通信,使用MIDI协议。
OpenMV发送数据给单片机时,单片机只能收到4个字节,偶尔会丢失一部分数据。
接受代码如下:
- if( USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET) //接收中断
- {
-
- USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清除中断标志
- com_data = USART_ReceiveData(USART1); //串口1接收数据
-
- if(RxState==0&&com_data==0x2C) //0x2C帧头开始数据接收处理
- {
- RxState=1;
- RxBuffer1[RxCounter1++]=com_data;//RxBuffer1[0]==0x2C RxCounter1==1
- USART_ClearFlag(USART1,USART_FLAG_TC);
- printf("1 \r\n");
- }
-
- else if(RxState==1&&com_data==0x12) //0x12帧头
- {
- RxState=2;
- RxBuffer1[RxCounter1++]=com_data;//RxBuffer1[0]==0x12 RxCounter1==2
- printf("2 \r\n");
- }
-
- else if(RxState==2)//开始接收有效数据
- {
- RxBuffer1[RxCounter1++]=com_data;//全部接收完,RxCounter1==6
- printf("%d \r\n",RxCounter1);
-
- if(RxCounter1>=6||com_data == 0x5B)//RxBuffer1接受满了或者接收数据结束
-
- {
- RxState=3;
- RxFlag1=1;
- Cr=RxBuffer1[2]; //RxBuffer1[2]是openmv发送的第一个有效数据
- Cg=RxBuffer1[3];
- Cb=RxBuffer1[4];
-
- }
- }
-
- else if(RxState==3) //检测是否接受到结束标志
- {
- if(RxBuffer1[5] == 0x5B)
-
- {
- USART_ITConfig(USART1,USART_IT_RXNE,DISABLE);//关闭DTSABLE中断
-
- //ws281x_colorWipe(ws281x_color(0,0,0), 1); //执行程序
-
- USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
- }
- else //接收错误
- {
- RxState = 0;
- RxCounter1=0;
- for(i=0;i<6;i++)
- {
- RxBuffer1[i]=0x00; //将存放数据数组清零,重新开始计数
- }
-
- printf("No \r\n");
- }
- }
-
- else //接收异常
- {
- RxState = 0;
- RxCounter1=0;
- for(i=0;i<6;i++)
- {
- RxBuffer1[i]=0x00; //将存放数据数组清零
- }
- printf("errno \r\n");
- }
-
- }
发送数据为一帧,有帧头,数据,帧尾。
为检查发送的数据是啥,我在接受到帧头后立即打印出来了。
数据就乱码了。
因为数据打印用的是串口一,使用时会产生中断。同时单片机接受OpenMV发送的数据使用的是串口二,也会有中断,这时就会产生中断嵌套,导致接受数据错乱。
以目的为导向,能接受数据就行。
(1)直接不打印数据,等接受完数据之后再打印。(这时下一帧会错乱,要是实时性不高的程序可将就)
(2)使用中断控制器NVIC
串口配置:
- NVIC_InitTypeDef NVIC_InitStructure;
-
- NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;//串口一
- NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级1
- NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;//子优先级0
- NVIC_Init(&NVIC_InitStructure);
主函数配置:
- //设置NVIC中断分组2: 2位抢占优先级,2位响应优先级
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
设定好子优先级和抢占优先级即可。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。