找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

为啥单片机串口解析时好时坏希望有大佬能解决下

查看数: 1747 | 评论数: 12 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2023-3-16 10:09

正文摘要:

#include "..\comm\STC32G.h" #include "stdio.h" #include "intrins.h" #include "string.h" typedef         unsigned char      &nb ...

回复

ID:1066795 发表于 2023-3-19 16:37
  1. if( M_Flag)
  2.                                         {  
  3.                                        
  4.                                                 PrintString1(RX1_Buffer);
  5.                                                 PrintString1("\n");
  6.                                                 M_index[M_index_num]=RX1_Buffer[3] ;
  7.                                                 M_index_num++;
  8.                                                 memset(RX1_Buffer,0,RX1_Cnt);
  9.                                                  M_Flag   =0;
  10.                                                 RX1_Cnt         =0;
  11.                                                 PrintString1(M_index);
  12.                                                 PrintString1("\n");
  13.                                         }
  14. void UART1_int (void) interrupt 4
  15. {
  16.                

  17. //               
  18. //                if(RI) // 中断产生
  19. //                                {
  20. //                                        RI=0 ; //清除中断标志
  21. //                                        RX1_Buffer[RX1_Cnt] = SBUF;
  22. //                                        RX1_Cnt++;
  23. //                                        if(RX1_Cnt >= UART1_BUF_LENGTH)   
  24. //                                                        {RX1_Cnt = 0;}
  25. //                                        }
  26. //                if((RX1_Buffer[RX1_Cnt-1]==0x2B)&&(RX1_Buffer[RX1_Cnt]==0x43))//头
  27. //                                                                {        Cnt_head  = RX1_Cnt-1;}
  28. //                if((RX1_Buffer[Cnt_head]==0x2B)&&(RX1_Buffer[Cnt_head+1]==0x43)&&(RX1_Buffer[RX1_Cnt-1]==0x0A)) //检测到头的情况下检测尾巴
  29. //                                {
  30. //                                                Cnt_len = RX1_Cnt-1 - Cnt_head;
  31. //                                          
  32. //                                                Uart_S = 1;
  33. //                                          RX1_Cnt = 0;
  34. //                                                Cnt_head =0;
  35. ////                               
  36. //                                }

  37.                          if(RI)//如果产生中断
  38.                                  {
  39.                                        
  40.                                         switch(state){
  41.                                                 case 1:
  42.                                                                                 if(SBUF == 0x4C){ //头
  43.                                                                                         RX1_Cnt=0;
  44.                                                                                         state = 2;
  45.                                                                                         RX1_Buffer[RX1_Cnt++] = SBUF;
  46.                                                                                 }
  47.                                                                                 else
  48.                                                                                 {
  49.                                                                                         state=1;
  50.                                                                                         RX1_Cnt=0;
  51.                                                                                        
  52.                                                                                 }
  53.                                                                                 break;
  54.                                                                                
  55.                                                 case 2:
  56.                                                                                 if(SBUF == 0x3A){ //头
  57.                                                                                         state = 3;
  58.                                                                                         RX1_Buffer[RX1_Cnt++] = SBUF;
  59.                                                                                 }
  60.                                                                                 else
  61.                                                                                 {
  62.                                                                                         state=1;
  63.                                                                                         RX1_Cnt=0;
  64.                                                                                        
  65.                                                                                 }
  66.                                                                                 break;
  67.                                        
  68.                                                  case 3:
  69.                                                                                         if(SBUF==0x2C){  //尾
  70.                                                                                                
  71.                                                                                                         RX1_Buffer[RX1_Cnt++] = SBUF;
  72.                                                                                                         M_Flag = 1;
  73.                                                                                                         state =1;
  74.                                                                                                        
  75.                                                                                         }
  76.                                                                                         else
  77.                                                                                         {
  78.                                                                                                        
  79.                                                                                                 RX1_Buffer[RX1_Cnt++] = SBUF;
  80.                                                                                                  state=3;
  81.                                                                                         }
  82.                                                                                         break;
  83.        
  84.                                                                                        
  85.                                                  default:
  86.                                                                                         state = 1;
  87.                                                                                  break;
  88.                                        
  89.                                         }
  90.                                          
  91.                                          RI = 0;
  92.                  }
  93.                        
  94.     if(TI)
  95.     {
  96.         TI = 0;
  97.         B_TX1_Busy = 0;
  98.     }
  99.                          
  100. }
复制代码


这个应该是可以解决指定头和位帧然后不定长数据解析了吧嘿嘿
ID:1066795 发表于 2023-3-17 11:13
lkc8210 发表于 2023-3-17 10:14
由于12行的关系
13行的RX1_Buffer[RX1_Cnt-1]为接收值后面的RX1_Buffer[RX1_Cnt]永远等于0

按照您这么说,这确实后面的那个RX1_Buffer[RX1_Cnt] 没有值
ID:161164 发表于 2023-3-17 10:14
yslsdas 发表于 2023-3-17 08:58
emm 抱歉实在是 逻辑理解不出来 RX1_Cnt-1 时为0x2B (+)RX1_Cnt 时 为 0x43 (C) 这里有什么逻辑问题,还 ...


由于12行的关系
13行的RX1_Buffer[RX1_Cnt-1]为接收值后面的RX1_Buffer[RX1_Cnt]永远等于0

ID:1066795 发表于 2023-3-17 08:59
lihuajie32 发表于 2023-3-16 20:56
不用大佬,小弟就可以,时好时坏,以硬件的角度看,没插好、插头怂了,软件看那是玄学!

线什么的应该没什么问题
ID:1066795 发表于 2023-3-17 08:58
人中狼 发表于 2023-3-16 22:08
if((RX1_Buffer[RX1_Cnt-1]==0x2B)&&(RX1_Buffer[RX1_Cnt]==0x43))
这里逻辑问题

emm 抱歉实在是 逻辑理解不出来 RX1_Cnt-1 时为0x2B (+)RX1_Cnt 时 为 0x43 (C) 这里有什么逻辑问题,还望不吝赐教
ID:384109 发表于 2023-3-16 22:08
if((RX1_Buffer[RX1_Cnt-1]==0x2B)&&(RX1_Buffer[RX1_Cnt]==0x43))
这里逻辑问题
ID:1066823 发表于 2023-3-16 20:56
不用大佬,小弟就可以,时好时坏,以硬件的角度看,没插好、插头怂了,软件看那是玄学!
ID:1066795 发表于 2023-3-16 18:34
人中狼 发表于 2023-3-16 15:42
中断里的接收判断错误了

能略微指点一下吗?
ID:384109 发表于 2023-3-16 15:42
中断里的接收判断错误了
ID:807182 发表于 2023-3-16 14:48
中断尽量快,不要处理数据,把数据放到其他地方判断
ID:1066795 发表于 2023-3-16 11:24
有大佬帮忙看看吗?

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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