一个奇怪的问题

[复制链接]
1661|15
 楼主| tianxiongweitxw 发表于 2019-5-17 22:31 | 显示全部楼层 |阅读模式
本帖最后由 tianxiongweitxw 于 2019-5-18 21:35 编辑

一个奇怪的问题,前面加任何一个串口输出语句  HexUartSend(order[h]);CASE里面的串口输出就正常了,不加就不行。整个程序是在定时器0中断,中断时间10MS,串口波特率115200

  HexUartSend(order[h]);//这里加任何一个串口输出语句,下面的串口就可以正常输出,不加下面的串口就输出不了。
if(OrderMode==1)
          {
           switch(order[5])
                     {
                   case 0x01: {
                                 for(h=0;h<15;h++)         //返回接收到的数据,供手机校验
                                    {
                                           HexUartSend(order[h]);
                                 }         
                                 Monitor=1;//监控变量                          
                                Learn_Mode=1;
                                OrderMode=0;
                                 i=0;
                                 break;
                                  }
                         }
                  }
管理
更多操作 评论编
叶春勇 发表于 2019-5-18 09:05 | 显示全部楼层
你的波特率是多少,你的定时器中断时间是多少?
根据计算,你要发15字节,对于波特率9600来说,要15*9/9600=0.014s,14ms
定时器中断处理来得及吗。
以后写程序,别往定时器中断塞东西。
 楼主| tianxiongweitxw 发表于 2019-5-18 10:17 | 显示全部楼层
本帖最后由 tianxiongweitxw 于 2019-5-18 10:20 编辑

波特率115200,定时器中断10ms,完全够,关键是前面有串口输出语句,后面就正常,说明不是中断时间不够的问题
叶春勇 发表于 2019-5-18 10:44 | 显示全部楼层
HexUartSend()函数发出来看看
 楼主| tianxiongweitxw 发表于 2019-5-18 17:36 | 显示全部楼层
发送函数如下,请高手帮忙看看。
void HexUartSend(uchar valu)
{
        ES=0;                        //关中断???
        SBUF=valu;
        while (0==TI);                                                                                                //等待发送完成
        TI=0;                                                                                                                //发送标志位复位
        ES=1;
}
叶春勇 发表于 2019-5-18 18:55 | 显示全部楼层
你给的信息来看,你其他的地方可能有问题。
例如,把变量定义成 volatile 。
防止编译器优化掉你的语句。
 楼主| tianxiongweitxw 发表于 2019-5-18 20:42 | 显示全部楼层
本帖最后由 tianxiongweitxw 于 2019-5-18 20:52 编辑
叶春勇 发表于 2019-5-18 18:55
你给的信息来看,你其他的地方可能有问题。
例如,把变量定义成 volatile 。
防止编译器优化掉你的语句。 ...

按你的建议试过了,问题依旧。现在总结起来,根据监控变量,前面不加HexUartSend()函数,CASE 01 也是执行了的,只是里面的串口函数不执行;前面加了HexUartSend()函数,CASE里面的串口输出就可以执行,仔细分析HexUartSend()函数,没有什么特别, 问题超出了常理。

 楼主| tianxiongweitxw 发表于 2019-5-18 21:00 | 显示全部楼层
tianxiongweitxw 发表于 2019-5-18 20:42
按你的建议试过了,问题依旧。现在总结起来,根据监控变量,前面不加HexUartSend()函数,CASE 01 也是执行 ...

VOLATILE,好像是用在高档CPU上的,我用有是STC的普通MCU
 楼主| tianxiongweitxw 发表于 2019-5-18 21:10 | 显示全部楼层
悬赏,50大洋
叶春勇 发表于 2019-5-18 21:40 | 显示全部楼层
把程序贴完整
 楼主| tianxiongweitxw 发表于 2019-5-18 22:48 | 显示全部楼层
已经解决了
cuiy 发表于 2019-5-19 14:54 | 显示全部楼层
查一下二者的设置是否一致!
一事无成就是我 发表于 2019-5-19 19:24 | 显示全部楼层
if((OrderMode==1)&&(order[5]==1))
{
    …………………………//程序
}
至于不能进去还是查你那两个条件是否成立,另外,低于4个if……else if……用switch替换效率高,低于则效率非常低
 楼主| tianxiongweitxw 发表于 2019-5-20 09:25 | 显示全部楼层
es被始化为1,解决了
hobbye501 发表于 2019-5-20 11:52 | 显示全部楼层
还是中断的问题吧
 楼主| tianxiongweitxw 发表于 2019-5-23 12:39 | 显示全部楼层
把ES初始化为1就解决了,但很不明白,之前一直没有初始化,其它地方的串口接收和发送都能正常,就是这里不行。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

73

主题

521

帖子

0

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