打印

一个奇怪的问题

[复制链接]
1368|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()函数发出来看看

使用特权

评论回复
5
tianxiongweitxw|  楼主 | 2019-5-18 17:36 | 只看该作者
发送函数如下,请高手帮忙看看。
void HexUartSend(uchar valu)
{
        ES=0;                        //关中断???
        SBUF=valu;
        while (0==TI);                                                                                                //等待发送完成
        TI=0;                                                                                                                //发送标志位复位
        ES=1;
}

使用特权

评论回复
6
叶春勇| | 2019-5-18 18:55 | 只看该作者
你给的信息来看,你其他的地方可能有问题。
例如,把变量定义成 volatile 。
防止编译器优化掉你的语句。

使用特权

评论回复
7
tianxiongweitxw|  楼主 | 2019-5-18 20:42 | 只看该作者
本帖最后由 tianxiongweitxw 于 2019-5-18 20:52 编辑
叶春勇 发表于 2019-5-18 18:55
你给的信息来看,你其他的地方可能有问题。
例如,把变量定义成 volatile 。
防止编译器优化掉你的语句。 ...

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

使用特权

评论回复
8
tianxiongweitxw|  楼主 | 2019-5-18 21:00 | 只看该作者
tianxiongweitxw 发表于 2019-5-18 20:42
按你的建议试过了,问题依旧。现在总结起来,根据监控变量,前面不加HexUartSend()函数,CASE 01 也是执行 ...

VOLATILE,好像是用在高档CPU上的,我用有是STC的普通MCU

使用特权

评论回复
9
tianxiongweitxw|  楼主 | 2019-5-18 21:10 | 只看该作者
悬赏,50大洋

使用特权

评论回复
10
叶春勇| | 2019-5-18 21:40 | 只看该作者
把程序贴完整

使用特权

评论回复
11
tianxiongweitxw|  楼主 | 2019-5-18 22:48 | 只看该作者
已经解决了

使用特权

评论回复
12
cuiy| | 2019-5-19 14:54 | 只看该作者
查一下二者的设置是否一致!

使用特权

评论回复
13
一事无成就是我| | 2019-5-19 19:24 | 只看该作者
if((OrderMode==1)&&(order[5]==1))
{
    …………………………//程序
}
至于不能进去还是查你那两个条件是否成立,另外,低于4个if……else if……用switch替换效率高,低于则效率非常低

使用特权

评论回复
14
tianxiongweitxw|  楼主 | 2019-5-20 09:25 | 只看该作者
es被始化为1,解决了

使用特权

评论回复
15
hobbye501| | 2019-5-20 11:52 | 只看该作者
还是中断的问题吧

使用特权

评论回复
16
tianxiongweitxw|  楼主 | 2019-5-23 12:39 | 只看该作者
把ES初始化为1就解决了,但很不明白,之前一直没有初始化,其它地方的串口接收和发送都能正常,就是这里不行。

使用特权

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

本版积分规则

72

主题

520

帖子

0

粉丝