【STM32】STM32与OpenMV串口通信协议(可以用于蓝牙通信)
【STM32】STM32与OpenMV串口通信协议(可以用于蓝牙通信)
本文最后更新于335 天前,其中的信息可能已经过时,如有错误请发送邮件到273925452@qq.com

通信协议

1个数据

u8 Usart_RX_Buf;
u8 code;
 
 
 
 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) 
{
     if(huart->Instance == USART1)  
          {
                uint8_t i;
                static uint8_t RxCounter1=0;//数据缓冲区的索引
                static uint8_t RxBuffer1[5]={0};//存放数据的接收缓存区
                static uint8_t RxState = 0;    //接收标志位
            
        if(RxState==0&&Usart_RX_Buf==0x2C)  //0x2c帧头
                {
                    RxState=1;
                    RxBuffer1[RxCounter1++]=Usart_RX_Buf;//RxBuffer1[0]==0x2c RxCounter1==1
                }
        
                else if(RxState==1&&Usart_RX_Buf==0x12)  //0x12帧头
                {
                    RxState=2;
                    RxBuffer1[RxCounter1++]=Usart_RX_Buf;
                }
        
                else if(RxState==2)//开始接收有效数据
                {
                    RxBuffer1[RxCounter1++]=Usart_RX_Buf;//全部接收完,RxCounter1==5

                    if(RxCounter1>=5||Usart_RX_Buf == 0x5B)       //RxBuffer1接受满了,接收数据结束
                    {
                          RxState=3;
                        //RxBuffer1[2]是openmv发送的第一个数据的低八位,RxBuffer1[3]是openmv发送的第一个数据的高八位
                        code=(RxBuffer1[RxCounter1-2]<<8)+(RxBuffer1[RxCounter1-3]);//分为低八位和高八位,先发低后发高
                    
                    }
                }
        
                else if(RxState==3)        //检测是否接受到结束标志
                {
                        if(RxBuffer1[RxCounter1-1] == 0x5B)
                        {
                                    
//                                
//                                    RxFlag1 = 0;
                                    RxCounter1 = 0;
                                    RxState = 0;
                            HAL_UART_Receive_IT(&huart1,(uint8_t *)&Usart_RX_Buf,1);    
                        }
                        else   //接收错误
                        {
                                    RxState = 0;
                                    RxCounter1=0;
                                    for(i=0;i<5;i++)
                                    {
                                            RxBuffer1[i]=0x00;      //将存放数据数组清零
                                    }
                        }
                } 
    
                else   //接收异常
                {
                        RxState = 0;
                        RxCounter1=0;
                        for(i=0;i<5;i++)
                        {
                                RxBuffer1[i]=0x00;      //将存放数据数组清零
                        }
                }

        


        HAL_UART_Receive_IT(&huart1,(uint8_t *)&Usart_RX_Buf,1);    
     }    
 }

2个数据

 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) 
{
     if(huart->Instance == USART1)  
          {
                 uint8_t i;
                static uint8_t RxCounter1=0;//数据缓冲区的索引
                static uint8_t RxBuffer1[7]={0};//存放数据的接收缓存区
                static uint8_t RxState = 0;    //接收标志位
            
        if(RxState==0&&Usart_RX_Buf==0x2C)  //0x2c帧头
                {
                    RxState=1;
                    RxBuffer1[RxCounter1++]=Usart_RX_Buf;//RxBuffer1[0]==0x2c RxCounter1==1
                }
        
                else if(RxState==1&&Usart_RX_Buf==0x12)  //0x12帧头
                {
                    RxState=2;
                    RxBuffer1[RxCounter1++]=Usart_RX_Buf;
                }
        
                else if(RxState==2)//开始接收有效数据
                {
                    RxBuffer1[RxCounter1++]=Usart_RX_Buf;//全部接收完,RxCounter1==5

                    if(RxCounter1>=7||Usart_RX_Buf == 0x5B)       //RxBuffer1接受满了,接收数据结束
                    {
                          RxState=3;
                        //RxBuffer1[2]是openmv发送的第一个数据的低八位,RxBuffer1[3]是openmv发送的第一个数据的高八位
                        cx=(RxBuffer1[RxCounter1-4]<<8)+(RxBuffer1[RxCounter1-5]);//分为低八位和高八位,先发低后发高
                        cy=(RxBuffer1[RxCounter1-2]<<8)+(RxBuffer1[RxCounter1-3]);//分为低八位和高八位,先发低后发高                        
                    
                    }
                }
        
                else if(RxState==3)        //检测是否接受到结束标志
                {
                        if(RxBuffer1[RxCounter1-1] == 0x5B)
                        {
                                    
//                                
//                                    RxFlag1 = 0;
                                    RxCounter1 = 0;
                                    RxState = 0;
                            HAL_UART_Receive_IT(&huart1,(uint8_t *)&Usart_RX_Buf,1);    
                        }
                        else   //接收错误
                        {
                                    RxState = 0;
                                    RxCounter1=0;
                                    for(i=0;i<7;i++)
                                    {
                                            RxBuffer1[i]=0x00;      //将存放数据数组清零
                                    }
                        }
                } 
    
                else   //接收异常
                {
                        RxState = 0;
                        RxCounter1=0;
                        for(i=0;i<7;i++)
                        {
                                RxBuffer1[i]=0x00;      //将存放数据数组清零
                        }
                }

        


        HAL_UART_Receive_IT(&huart1,(uint8_t *)&Usart_RX_Buf,1);    
     }    
 }

控制RGB彩灯部分

void ROG_Contrl(uint8_t code)
{
    
    switch(code)
    {
        case 1://蓝色
    __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,254);//R
    __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_4,0);//G
    __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_3,0);//B
            break;
        
        case 2://绿色
    __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,180);//R
    __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_4,254);//G
    __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_3,0);//B
            break;
        
        case 4://黄色
    __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,0);//R
    __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_4,0);//G
    __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_3,254);//B        
        break;        
    }            
 }
   
 void LCD_Proc()
{
 if((uwTick - LCD) <100) return;
    LCD = uwTick;
    
//    sprintf((char *)str,"      code:");
    switch(code)
    {
        case 1:
            sprintf((char *)str,"      code:%d,Blue   ",code);
            
        break;
            
        case 2:
            sprintf((char *)str,"      code:%d,Green   ",code);
        break;
        
        case 4:
            sprintf((char *)str,"      code:%d,Yellow   ",code);
        break;        
    }
//    sprintf((char *)str,"      code:%d",code);
    LCD_DisplayStringLine(Line2,str);
    ROG_Contrl(code);


} 
💡商业转载请联系作者获得授权,非商业转载请注明出处。
协议(License):署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)。
使用这些免费资源的时候应遵守版权意识,切勿非法利用,售卖,尊重原创内容知识产权。未经允许严禁转载。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇