打印
[程序源码]

各位大佬请帮我寻找一个bug。。

[复制链接]
1402|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
各位大佬好!
       我C语言功底很弱,昨日随便写了一个非常简单的小玩意,但是BUG满天飞,无奈之下来当伸手党。。。请各位不吝赐教!

功能:1、系统运行后等待PC机通过UART传输一组字符串,与系统预设字符串进行比较(此处预设为“I have gifts”   事实证明我并没有天赋
          2、如果是输入正确的”I have gifts“,则MCU会打印出“输入正确”
          3、如果输入错误,则打印出“再次输入”字样,然后再次通过串口重新输入字符,超过3次打印“输入错误”然后结束运行

注意:      
          1、字符串的长度是规定好的,也就是说我现在通过串口必须发”I have gifts“一样长度的
          2、忽略某些长度上的bug,比如输入”I have giftssssssssssssssssssssssssssssssssssssss“仍然会判断正确等      

当前问题:
         1、输入正确的指令后,系统会正确运行。
         2、输入错误的指令后,系统会正确运行。
         3、如果第一次输入错误的指令,会提示重新输入,但是第二次及第三次输入正确的指令后仍然判断是错误。
我的程序如下:
#include "common.h"
#include "rtc.h"
#include "uart.h"
#include "sysinit.h"
int main (void)
{
    uint8_t UART_RX_BUF[]={0};//接收数组,UART接收到的数据直接放入该数组中
    uint8_t t;
    uint8_t times=3;
    uint8_t rx_buf[]="I have gifts";//预设数组
    uint8_t flag=2;
    sysinit();
   
    SIM->PINSEL1 |= SIM_PINSEL1_UART1PS_MASK;
    UART_ConfigType sConfig;
    sConfig.u32SysClkHz = BUS_CLK_HZ;
    sConfig.u32Baudrate = UART_PRINT_BITRATE;
   
   printf("\n系统已经运行\n");
   
   printf("\n请输入12位预设数组\n") ;
     
loop: times--; //times为了保证函数可以从goto loop中跳出而不是死循环,从3开始递减
   printf("\n以下为输入内容\n");
   
   UART_ReceiveWait(UART1,UART_RX_BUF,12);//将UART接收到的内容放入此数组中
    delay_ms(500);
   UART_SendWait(UART1,UART_RX_BUF,12);//将收到的内容发送出去
     
   printf("\n以下为判断\n");
   
   for(t=0;t<12;t++)
   {
     if(UART_RX_BUF[t] == rx_buf[t])//判断接收到的数据是否和预设相同
     {
        flag=1;
     }
    else
   {
     if(times == 0)//判断goto loop 执行次数,若goto loop执行次数耗尽则直接置位flag
     {
       flag=0;
     }
     else//若goto loop执行次数没有耗尽,则执行goto loop
     {
       printf("\n请再次尝试输入\n");
      for(t=0;t<12;t++)
      {UART_RX_BUF[t]=0;//清空接收数组内容
       goto loop;       //跳转
     }
   }   
   }
   switch(flag)
   {
     case 1:  printf("\n输入正确\n");flag=2;break;


     case 0:  printf("\n输入错误\n");flag=2;break;
     
     default : break;
   }
   
   printf("\n系统运行完毕\n");
    while(1);
}

以下是出错图:

大家请看:第一次输入的是:“I have giftt”所以错了
                 第二次到第三次输入的“I have gifts“但是收到的并不是这个,发生了偏移,乃至第三次收到的“s”都跑前面了。。


我隐隐约约感觉是数组可能存在某种越界。。。。。但是奈何才疏学浅,请各位大佬指点一二,谢谢!!






相关帖子

沙发
mcu5i51| | 2017-2-25 16:04 | 只看该作者
用上了printf 再加上一个scanf也行吧

使用特权

评论回复
板凳
h_8816002|  楼主 | 2017-2-25 16:17 | 只看该作者
本帖最后由 h_8816002 于 2017-2-25 16:20 编辑

已自我解决强烈建议大家不要使用goto loop什么的。。
经过精简优化,上述问题已成功解决,然而我并不知道错误出在哪里。。。。。。。。。哪位大佬看出了端倪请指教一下
附上优化后的代码:
int main (void)
{
    //uint8_t tx_buf[]="panda" ;
    //uint8_t tx2_buf[]="monkey";
    uint8_t UART_RX_BUF[]={0};
    uint8_t t;
    uint8_t times=3;
    uint8_t rx_buf[]="I have gifts";
    //uint8_t s=0;
    //uint8_t flag=2;

    sysinit();
   
    SIM->PINSEL1 |= SIM_PINSEL1_UART1PS_MASK;
    UART_ConfigType sConfig;
    sConfig.u32SysClkHz = BUS_CLK_HZ;
    sConfig.u32Baudrate = 115200;
   
   UART_Init(UART1,&sConfig);
   
    printf("\n系统已经运行\n");        
   
   printf("\n请输入12位密钥:\n") ;
     

  for(times=0;times<3;times++)
  { printf("\n以下为输入内容:\n");
   
   UART_ReceiveWait(UART1,UART_RX_BUF,12);
   
   for(t=0;t<12;t++)
   {printf("UART_RX_BUF[t]=%c\n",UART_RX_BUF[t]);}
   
   
   printf("\n状态提示:\n");
   
   if(strcmp(UART_RX_BUF,rx_buf) == 0)
   {break;}
   else
   {printf("请重试!\n");}
  }
   if(times == 3)
   {
   printf("未能成功进入,系统结束运行\n");
   }
   else if(times<3)
   {
   printf("已成功进入系统");
   }
}

使用特权

评论回复
地板
BTBoy| | 2017-2-25 19:35 | 只看该作者
你这样定义 “ uint8_t UART_RX_BUF[]={0} ”,这个数组的size只有一个byte~

使用特权

评论回复
5
icecut| | 2017-2-26 12:09 | 只看该作者
建议你去21ic 公开课看我的 stm32入门到精通,对串口你遇到的问题讲的很详细.点我签名学习也行
你这个依然有问题...你说后面加 s 不影响,那多输入三个 s,然后再输入正确的....

第一个代码很简单,就是你每次判断之前没有把结果初始化成错误的.所以上次正确,以后就正确了.第二个程序你换了一个方法没标记了.所以没这个 bug.你代码真的需要多多练习

使用特权

评论回复
6
h_8816002|  楼主 | 2017-2-26 21:43 | 只看该作者
icecut 发表于 2017-2-26 12:09
建议你去21ic 公开课看我的 stm32入门到精通,对串口你遇到的问题讲的很详细.点我签名学习也行
你这个依然有 ...

好的!谢谢您

使用特权

评论回复
7
h_8816002|  楼主 | 2017-2-27 10:57 | 只看该作者
icecut 发表于 2017-2-26 12:09
建议你去21ic 公开课看我的 stm32入门到精通,对串口你遇到的问题讲的很详细.点我签名学习也行
你这个依然有 ...

小I大佬,请问您有没有IAR下的STM32的工程模版呢?我想在IAR上学STM32,但是我自己移植的有问题,core_cm4.h啊stdio.h这些连片的错误,编译不了。我用的mdk总是会出现莫名其妙的bug。谢谢

使用特权

评论回复
8
icecut| | 2017-2-27 16:37 | 只看该作者
h_8816002 发表于 2017-2-27 10:57
小I大佬,请问您有没有IAR下的STM32的工程模版呢?我想在IAR上学STM32,但是我自己移植的有问题 ...

stm32cubeMx 自动生成代码,工程....全自动

使用特权

评论回复
9
h_8816002|  楼主 | 2017-2-27 22:31 | 只看该作者
icecut 发表于 2017-2-27 16:37
stm32cubeMx 自动生成代码,工程....全自动

大佬,这软件太害人,像我这种纯粹的菜鸟,要是太依赖这软件,以后可怎么办。。。不过我好像已经依赖上他了

使用特权

评论回复
10
icecut| | 2017-2-28 21:53 | 只看该作者
h_8816002 发表于 2017-2-27 22:31
大佬,这软件太害人,像我这种纯粹的菜鸟,要是太依赖这软件,以后可怎么办。。。 ...

跟我视频学,很快就称为高手了....真的.

使用特权

评论回复
11
h_8816002|  楼主 | 2017-3-1 09:55 | 只看该作者
icecut 发表于 2017-2-28 21:53
跟我视频学,很快就称为高手了....真的.

小I大佬,我已经买了,已经准备跟随你的脚步出任CEO,迎娶白富美走上人生巅峰了!希望大佬以后多出一些视频,就和USB那种实用性强的

使用特权

评论回复
12
icecut| | 2017-3-1 10:10 | 只看该作者
h_8816002 发表于 2017-3-1 09:55
小I大佬,我已经买了,已经准备跟随你的脚步出任CEO,迎娶白富美走上人生巅峰了!希望大佬以后多 ...

usb 的确像黑马一样,销售超过我想象.
我觉得其他课程应该更好.因为我想教给大家套路,usb 仅仅是一个实践,然后大家水平飞速提高.
后面我也考虑一下多给大家搞点可以实践的东西吧.
usb 还有一块配套板卡.所以我投入要大许多

使用特权

评论回复
13
h_8816002|  楼主 | 2017-3-1 12:00 | 只看该作者
icecut 发表于 2017-3-1 10:10
usb 的确像黑马一样,销售超过我想象.
我觉得其他课程应该更好.因为我想教给大家套路,usb 仅仅是一个实践, ...

无条件支持小I大佬哈哈哈

使用特权

评论回复
14
WANYCL| | 2017-3-2 09:32 | 只看该作者
你用数据头货数据尾方式判断也可以的,防止出错

使用特权

评论回复
15
2151DZ| | 2017-3-2 10:54 | 只看该作者
看 不到啊

使用特权

评论回复
16
2151DZ| | 2017-3-2 10:54 | 只看该作者
看不好  到 请 发到我的邮箱

使用特权

评论回复
17
2151DZ| | 2017-3-2 10:55 | 只看该作者
你有STC15系列 的视频吗    PWM这个IO 口是怎么用的

使用特权

评论回复
18
2151DZ| | 2017-3-2 10:56 | 只看该作者
能给我说一下吗 谢谢 各位大侠

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

143

帖子

5

粉丝