遇到smt32与openmv无法通信,或者数据对不上。
上面的是openmv端发给stm32端的数据
%c4 b‘ ’:是stm32打印接收到的数据
逐个排查:openmv与pc端串口助手正常发收。stm32与pc端也可以正常发,但是接收数据的时候不能正常接收。
利用LED灯debug。
确定问题出在stm32端的中断服务函数里。反复看中断服务函数,并没有明显的逻辑错误。
经过查找资料发现,因为数据打印用的是串口一,使用时会产生中断。同时单片机接受OpenMV发送的数据使用的是串口一,也会有中断,这时就会产生中断嵌套,导致接受数据错乱。
解决方案:直接不打印数据,等接受完数据之后再打印。
但是发现还是不能正常接收数据。
纯小白,搞了一整天,没错整整是一天,没整出个所以然来。
但是就在今天下午,莫名的就整出来了。通信问题终于是解决问题了。在此记录一下
但是为什么还没弄懂为什么。希望大佬指出!!!
uart = UART(1,115200) #定义串口1变量
uart.init(115200, bits=8, parity=None, stop=1)
def sending_data(cx,cy,cw,ch):
global uart;
data = bytearray([0x2c,0x12,cx,cy,cw,ch,0x5b])
uart.write(data);
while(True):
if detect_circle(): #识别圆
sending_data(YUAN_X,YUAN_Y,YUAN_R,YUAN_R) #发送数据
print(YUAN_X,YUAN_Y,YUAN_R,YUAN_R) #打印数据
if(uart.any()):
r=uart.read()
print("%c4",r) #打印stm32发来的数据
stm32端的代码
//USART1 中断服务函数
void USART1_IRQHandler(void)
{
u8 com_data;
u8 i;
static u8 RxCounter1=0;
static u16 RxBuffer1[10]={0};
static u8 RxState = 0;
if( USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET) //接收中断
{
USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清除中断标志位
com_data = USART_ReceiveData(USART1);
LED1=0; //打开LED灯
if(RxState==0&&com_data==0x2C) //判断帧头是否为0x2c
{
RxState=1;
RxBuffer1[RxCounter1++]=com_data;
LED1=1;
}
else if(RxState==1&&com_data==0x12) //判断帧头是否为0x12
{
LED1=0;
RxState=2;
RxBuffer1[RxCounter1++]=com_data;
}
else if(RxState==2)
{
RxBuffer1[RxCounter1++]=com_data;
if(RxCounter1>=10||com_data == 0x5B) //RxBuffer1接收满了,或者检测到帧尾0x5B
{
RxState=3;
Cx=RxBuffer1[RxCounter1-5];
Cy=RxBuffer1[RxCounter1-4];
Cw=RxBuffer1[RxCounter1-3];
Ch=RxBuffer1[RxCounter1-2];
LED1=1;
//printf("%d,%d,%d,%d\n",Cx,Cy,Ch,Cw);
}
}
else if(RxState==3) //检查是否接收到结束标志位
{
if(RxBuffer1[RxCounter1-1] == 0x5B)
{
USART_ITConfig(USART1,USART_IT_RXNE,DISABLE);//关闭中断
RxCounter1 = 0;
RxState = 0;
//LED1=0;
printf("%d,%d,%d,%d\n",Cx,Cy,Cw,Ch);
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
//printf("%d,%d,%d,%d\n",Cx,Cy,Cw,Ch);
}
else //接收错误
{
RxState = 0;
RxCounter1=0;
for(i=0;i<10;i++)
{
RxBuffer1[i]=0x00; //将接收数组清空
LED1=0;
}
}
}
else //接收异常
{
RxState = 0;
RxCounter1=0;
for(i=0;i<10;i++)
{
RxBuffer1[i]=0x00; //将接收数组清空
//LED1=0;
}
}
}
}
本人小白,欢迎大家指出错误。也希望能和大佬们多交流!!!