找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7210|回复: 14
收起左侧

串口中断和while循环哪个优先级高一点

[复制链接]
ID:228342 发表于 2017-8-20 10:31 | 显示全部楼层 |阅读模式
为啥一有while循环  串口中断就接不到数据了


QQ图片20170820103003.png QQ图片20170820103007.png


只要前进  就停止不了了   只要一前进 任何操作都执行不了了


求大神帮助



完整程序代码:
#include<reg52.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
                                               
//小车轮子接线方式:in1=p1.2 in2=p1.3 in3=p1.6 in4=p1.7

sbit wleft0=P1^2;sbit wleft1=P1^3;//左轮
sbit wright0=P1^6;sbit wright1=P1^7;//右轮

sbit d0=P1^4;sbit d1=P1^5;//右轮


bit startBit = 0;                                  //串口接收开始标志位
bit newLineReceived = 0;                 //串口一帧协议包接收完成

unsigned char inputString[50];  //接收数据协议

uchar f=1;//0为前进 1为后退
uchar al=0;
uchar ar=0;
uchar l=10;                 //左轮速度 0~20内调节,控制输出电压,参数过低轮子不动,注意调试。
uchar r=10;                //右轮速度 0~20内调节,控制输出电压,参数过低轮子不动,注意调试。



/******************************************************************/
/* 串口中断程序*/
/******************************************************************/

void UART_SER () interrupt 4
{
        unsigned char n;         //定义临时变量
        static int num = 0;

        if(RI)                 //判断是接收中断产生
        {
                RI = 0;         //标志位清零
                n = SBUF; //读入缓冲区的值

                //control=n;
            if(n == '$')
            {
              startBit = 1;
                  num = 0;
            }
            if(startBit == 1)
            {
               inputString[num] = n;     
            }  
            if (n == '#')
            {
               newLineReceived = 1;
               startBit = 0;
            }
                num++;
                if(num >= 50)
                {
                        num = 0;
                        startBit = 0;
                        newLineReceived        = 0;
                }
        }

}


//WIFI、蓝牙初始化
void WifiInit(void)
{

           SCON = 0x50;         // SCON: 模式1, 8-bit UART, 使能接收
        TMOD |= 0x20;
        TH1=0xfd;                 //波特率9600 初值
        TL1=0xfd;
        TR1= 1;
        EA = 1;                    //开总中断
        ES= 1;                         //打开串口中断


}



void delay_ms(uint k)//延时函数
{
uint i,j;
        for(i=0;i<k;i++)
        {
                for(j=0;j<113;j++)
                {
                ;
                }
        }

}





uint a=0;
uint i=0;
void turn_left(){         //2.5v
        while(a<15){
                  wleft0=1;
                delay_ms(10);
                wleft0=0;
                delay_ms(10);
                a++;
        }
        if(wright1==1){
                wleft0=1;       
        }else{
                wleft0=0;
        }
   a=0;
}



void round_left(){//原地左转       
        P1=0x77;
}

void round_right(){//原地右转
        P1=0xbb;       
}

void stop(){
        P1 = 0xff;           //关闭所有LED和风扇
       
}


void run(uint r){//前进
        while(r){
                P1=0x7b;         
        }       
}

void retreat(){//后退
        P1=0xb7;;
}


main(){
        P1 = 0xff;           //关闭所有LED和风扇
        WifiInit();

        //循环接收蓝牙数据
        while(1){
                if (newLineReceived)
                   {
                        switch(inputString[1])

                        {
                                case '0':  run(0);break;//停止
                                case '1':  run(1);break;//前进
                                case '2':  retreat();break;//后退
                                case '3':  round_left();break;//原地左转
                                case '4':  round_right();break;//原地右转
                                case '5':  turn_left();break;
                                case '6':  ;break;//开灯
                                default:P1 = 0xff;break;
                        }
               newLineReceived = 0;  
         
            }       
        }
       
       
}




回复

使用道具 举报

ID:123289 发表于 2017-8-20 12:17 | 显示全部楼层
语句无优先级之分,看你把哪个写在前面,哪个就先被执行。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:228342 发表于 2017-8-20 12:59 来自手机 | 显示全部楼层
yzwzfyz 发表于 2017-8-20 12:17
语句无优先级之分,看你把哪个写在前面,哪个就先被执行。

不是语句 是串口中断  串口中断好像不能中断while循环
回复

使用道具 举报

ID:223770 发表于 2017-8-20 13:00 | 显示全部楼层
一个中断,一个主循环,没有比较价值啊

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:228342 发表于 2017-8-20 14:42 来自手机 | 显示全部楼层
常沉 发表于 2017-8-20 13:00
一个中断,一个主循环,没有比较价值啊

可是while一循环 串口中断里就没法接受蓝牙数据了是咋回事啊
回复

使用道具 举报

ID:228347 发表于 2017-8-20 15:49 | 显示全部楼层
问题出在你这个run函数里面,里面的while循环跳不出来,不能那么写。
void run(uint r){//前进
        while(r){
                P1=0x7b;         
        }        
}
前进过程中来串口中断,需要做其他动作需要在这个while里面讲你的r置0 跳出循环

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:228342 发表于 2017-8-20 20:54 来自手机 | 显示全部楼层
oo0o_11 发表于 2017-8-20 15:49
问题出在你这个run函数里面,里面的while循环跳不出来,不能那么写。
void run(uint r){//前进
        w ...

可是怎么在外部中断这个while啊
回复

使用道具 举报

ID:123289 发表于 2017-8-21 01:12 | 显示全部楼层
如果WHILE不在一个更高级或等级的中断服务程序中,必被串口中断打断。
回复

使用道具 举报

ID:228342 发表于 2017-8-21 10:04 来自手机 | 显示全部楼层
yzwzfyz 发表于 2017-8-21 01:12
如果WHILE不在一个更高级或等级的中断服务程序中,必被串口中断打断。

可是打断不了啊
回复

使用道具 举报

ID:227393 发表于 2017-8-21 10:09 来自手机 | 显示全部楼层
中断高
回复

使用道具 举报

ID:228342 发表于 2017-8-21 10:22 | 显示全部楼层
oo0o_11 发表于 2017-8-20 15:49
问题出在你这个run函数里面,里面的while循环跳不出来,不能那么写。
void run(uint r){//前进
        w ...

void run(){//前进
        while(1){
                P1=0x7b;
                if(rw==0){
                        break;
                }         
        }       
}



case '0':  rw=0;break;//停止
case '1':  rw=1;run();break;//前进

我改成这样还是不行啊  只要一执行ruin 其他的任何操作都执行不了了
回复

使用道具 举报

ID:228347 发表于 2017-8-21 11:13 来自手机 | 显示全部楼层
hkoos 发表于 2017-8-21 10:22
void run(){//前进
        while(1){
                P1=0x7b;

这样写当然不会跳出循环了,串口中断是执行了,但是程序一直还在run函数的while(1)里面。。。没有执行到case语句那里。两种方法,把串口处理那部分语句写进run函数while里面;或者,你把所有的转动程序写在一个函数里面,设置同一个变量,不要有循环,然后把这个函数放主函数while里面运行,串口命令去改变这个变量就好了。
回复

使用道具 举报

ID:228699 发表于 2017-8-21 21:26 | 显示全部楼层
中断高的,只是进去了你这程序体现不出来,程序没写好。
回复

使用道具 举报

ID:123289 发表于 2017-8-21 22:59 | 显示全部楼层
楼主:你能证明打不断吗?(楼主9楼问题)。

进入汇编级调试:
在中断处设断点,改单步运行,执行到中断返回RETI后,看是不是回到你的程序中去了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 单片机教程网

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