程序调试问题

[复制链接]
1212|7
 楼主| djz1992 发表于 2016-3-9 15:46 | 显示全部楼层 |阅读模式
本帖最后由 djz1992 于 2016-3-9 16:15 编辑
  1. <div class="blockcode"><blockquote>while(UARTCharsAvail(UART0_BASE))
  2.         {
  3.                 //读串口接收的字符并回发
  4.                 Receive[i]=UARTCharGet(UART0_BASE);
  5.                 UARTCharPut(UART0_BASE,Receive[i]);
  6.                 i++;
  7.         }
  8.         i=0;
  9.         switch(Receive[0])
  10.         {
  11.                 case 1:RmsTran(&RMS_VA);UARTSend(UART0_BASE ,RMS_VA.Txd, 4);Receive[0]=0;break;
  12.                 case 2:RmsTran(&RMS_VB);UARTSend(UART0_BASE ,RMS_VB.Txd, 4);Receive[0]=0;break;
  13.                 case 3:RmsTran(&RMS_VC);UARTSend(UART0_BASE ,RMS_VC.Txd, 4);Receive[0]=0;break;
  14.                 case 4:Clock_Gain();Init_DS1302(clock_init);Receive[0]=0;break;
  15.                 case 5:Read_Date();UARTSend(UART0_BASE ,date_time, 7);Receive[0]=0;break;
  16.                 case 6:UARTSend(UART0_BASE ,Receive, 10);Receive[0]=0;break;
  17.                 default:break;
  18.         }


这段代码在单步运行的时候符合我的想法:
把收到的数据保存在Receive数组中,如果发0102,会执行:
receive【0】=1、回发01、receive【1】=02、回发02、case1,然后做其他事情。不管receive【1】是不是2,都不会执行case2。

可如果退出单步调试,程序跑起来,发0102,此时程序就会变成执行以下顺序:
receive【0】=01、回发01、case1、receive【1】=02、回发02、case2
如果我发010101,它就receive【0】=01、回发01、case1、receive【1】=01、回发01、case1


简而言之,理论上应该是发送ABC,执行ABC-A',现在成了A-A'B-B'C-C'
这是为什么呢?

如图,我给它发060708,case6的指令是把receive里数都回发,左侧查看寄存器receive【】的6、7、8保存的挺好但是回发的时候为什么中间参杂那么多的0?678不是在第一第二第三这三位上。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
dirtwillfly 发表于 2016-3-9 21:38 | 显示全部楼层
表示没看懂逻辑流程
baimiaocun2015 发表于 2016-3-9 22:45 | 显示全部楼层
这个我也没怎看懂的。
 楼主| djz1992 发表于 2016-3-10 09:06 | 显示全部楼层
本帖最后由 djz1992 于 2016-3-10 09:08 编辑
dirtwillfly 发表于 2016-3-9 21:38
表示没看懂逻辑流程

理论上和代码上都应该是先做完while再判断switch啊,while里是:保存第一字节,回发第一字节,保存第二字节,回发第二字节,保存第三,回发第三。。。直到都保存完都回发完,然后根据第一字节是几,执行switch里的case几
而我单步调试的时候给单片机发信息也是符合设想的的顺序的,但是程序跑起来,给他发信息,顺序就不对了,变成了:保存第一字节,回发第一字节,执行swtich,保存第二字节,回发第二字节,执行switch。。。这就是while没有执行完,就进行switch判断,然后再进了while,再switch判断
 楼主| djz1992 发表于 2016-3-10 09:08 | 显示全部楼层
baimiaocun2015 发表于 2016-3-9 22:45
这个我也没怎看懂的。

:Q
dirtwillfly 发表于 2016-3-10 09:22 | 显示全部楼层
djz1992 发表于 2016-3-10 09:06
理论上和代码上都应该是先做完while再判断switch啊,while里是:保存第一字节,回发第一字节,保存第二字 ...

你把优化选项都关了试试
 楼主| djz1992 发表于 2016-3-10 10:17 | 显示全部楼层
本帖最后由 djz1992 于 2016-3-10 10:23 编辑
dirtwillfly 发表于 2016-3-10 09:22
你把优化选项都关了试试

1、上面那个代码的接收是用的查询法,没用中断,我把那部分写在中断里,程序跑起来就可以实现设想的功能了。真奇怪。这么想来有可能真的是优化的问题,优化选项在哪里关闭?

2、另外我现在用了采样中断和串口中断,怎么设置中断的优先级呢?
  1. void UART0IntHandler(void)
  2. {
  3.         uint32_t ulStatus;
  4.         ulStatus = UARTIntStatus(UART0_BASE, true);//获取中断状态
  5.         UARTIntClear(UART0_BASE, ulStatus);//清除中断标志
  6.         //直到串口FIFO中没有数据时才退出循环
  7.         while(UARTCharsAvail(UART0_BASE))
  8.         {
  9.                 Receive[i]=UARTCharGet(UART0_BASE);
  10.                                 i++;
  11.         }
  12.         i=0;

  13. }





chuntian2016 发表于 2016-3-10 15:54 | 显示全部楼层
中间参杂的00大部分是硬件引起的,个你的程序没关系的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:人生苦短,冬日苦长,正是青葱,却无骄阳

115

主题

620

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部