OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4581|回复: 6

自定义协议,为啥下位机没反应啊?求大佬看看

[复制链接]

10

主题

26

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2021-11-30
在线时间
20 小时
发表于 2021-12-14 18:27:01 | 显示全部楼层 |阅读模式
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2021-12-14 22:30:42 | 显示全部楼层
这种问题,仿真找问题会比较容易找到bug
回复

使用道具 举报

10

主题

26

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2021-11-30
在线时间
20 小时
 楼主| 发表于 2021-12-14 23:28:31 | 显示全部楼层
正点原子 发表于 2021-12-14 22:30
这种问题,仿真找问题会比较容易找到bug

原子哥,您看串口发送的有没问题?
回复

使用道具 举报

1

主题

385

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1023
金钱
1023
注册时间
2019-9-21
在线时间
269 小时
发表于 2021-12-15 10:02:00 | 显示全部楼层
仿真调试一下看看怎么样
回复

使用道具 举报

10

主题

26

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2021-11-30
在线时间
20 小时
 楼主| 发表于 2021-12-15 10:29:23 | 显示全部楼层
gjs13030247996 发表于 2021-12-15 10:02
仿真调试一下看看怎么样

不知道怎么弄,能帮帮帮看下吗
回复

使用道具 举报

10

主题

26

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2021-11-30
在线时间
20 小时
 楼主| 发表于 2021-12-15 11:31:57 | 显示全部楼层
gjs13030247996 发表于 2021-12-15 10:02
仿真调试一下看看怎么样

void USART1_IRQHandler(void)                       
{
        u8 rec_data ;
        u16 my_chk=0;
        u16 rec_chk=0;
  
        //HAL_UART_IRQHandler(&UART1_Handler);       
        #if SYSTEM_SUPPORT_OS                 //使用OS
        OSIntEnter();   
        #endif
        if((__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_RXNE)!=RESET))     //接收中断(接收到的数据必须是0x0d 0x0a结尾)
        {
               
      rec_data=USART1->DR;   
                 if(USART_RX_Count==0)
                 {
                                if(rec_data==0xC1)                                           //帧头C1
                                {
                               
                                   USART_RX_Count++;
                                         USART_RX_BUF[USART_RX_Count]=rec_data;
                                }       
                               
                 }
                         
                 else if(USART_RX_Count==1)
                 {
                                if(rec_data==0xD2)
                                                                                //帧头D2
                     {
                                    USART_RX_Count++;
                                          USART_RX_BUF[USART_RX_Count]=rec_data;                         
                                 }
                 
                     else
                                 {
                                 
                                    USART_RX_Count=0;
                                 }
                               
                 }
               
                  
                 else if(USART_RX_Count==2)                         
                 {
                                if(rec_data==0x01)                                         //功能字 0x01
                                                            
                     USART_RX_BUF[USART_RX_Count]=rec_data;
                                 USART_RX_Count++;
               
                 }
                       
                 else if(USART_RX_Count==3)                                   //获取数据长度1字节
                 {
                 
                    USART_RX_BUF[USART_RX_Count]=rec_data;
                    USART_Length=rec_data;
                    USART_RX_Count++;
                 
                 }
               
                 else if(  (3 <USART_RX_Count<USART_Length+4)&& (USART_Length<50)  )
               
                 {
                               
                                USART_RX_BUF[USART_RX_Count]=rec_data;
                                USART_RX_Count++;
               
                 }
                        else if(USART_RX_Count==USART_Length+4)                     //开始计算校验和
                         {
                            USART_RX_BUF[USART_RX_Count]=rec_data;
                           for(u8 i=0 ;i<USART_Length+4;i++)
                                 
                                   {
                                                 my_chk+= USART_RX_BUF;
                                         
                                         }
                                     
             rec_chk  =  rec_data;                               //接收到第一个字节校验和
                                         
             USART_RX_Count++;
                                 
                         }                 
               
                  else if(USART_RX_Count==USART_Length+5)
                        {       
                               
                                USART_RX_BUF[USART_RX_Count]=rec_data;
                                rec_chk=  (rec_chk <<8) + rec_data;                      //合并校验和  高位在前发送,地位在后发送
                           if( rec_chk!=my_chk)
                                         
                                 {
                                    USART_RX_Count=0;
                                 }         
                           else  
                                 {
                                          //校验和正确后 取前面8字节数据 ,分别为x轴坐标值,y轴坐标值,z轴坐标值,speed 值
                                          Compu_x=(short) ((USART_RX_BUF[4] <<8)+ USART_RX_BUF[5]);
                                          Compu_y= (short) ((USART_RX_BUF[8] <<8)+  USART_RX_BUF[9]);
                                    Compu_speed=(short)((USART_RX_BUF[10] <<8)+  USART_RX_BUF[11]);
                                          USART_RX_Count++;  
                                       
                                 }
                                         
                           }
                        }
                  
                  else if(USART_RX_Count==USART_Length+6)                    //帧结束1   0xE3
                        {
                     if( rec_data==0xE3)
                                        {
                                         
                                                USART_RX_BUF[USART_RX_Count]=rec_data;
                                          USART_RX_Count++;
                                        }
          else  
                                        {
                                                USART_RX_Count=0;
                            }
                        }
                   else if(USART_RX_Count==USART_Length+7)                  //帧结束2  0xF4
                         {
                         
                            if( rec_data==0xF4)
                                        {
                                         
                                                USART_RX_BUF[USART_RX_Count]=rec_data;
                                          USART_ReceiveOK=1;                                 
                                               
                                        }
                                                                                                        
                                                USART_RX_Count=0;
                                    USART_Length=0;
                         }
               
                  else
                  {
                 
                       USART_RX_Count=0;
                       USART_Length=0;
                  }
                HAL_UART_IRQHandler(&UART1_Handler);       
               
        }
       
还是没啥反应啊
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2021-12-16 02:00:57 | 显示全部楼层
ulik5 发表于 2021-12-15 10:29
不知道怎么弄,能帮帮帮看下吗

得学会仿真。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-17 11:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表