欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 7815|回復(fù): 14
收起左側(cè)

串口中斷和while循環(huán)哪個(gè)優(yōu)先級(jí)高一點(diǎn)

[復(fù)制鏈接]
ID:228342 發(fā)表于 2017-8-20 10:31 | 顯示全部樓層 |閱讀模式
為啥一有while循環(huán)  串口中斷就接不到數(shù)據(jù)了


QQ圖片20170820103003.png QQ圖片20170820103007.png


只要前進(jìn)  就停止不了了   只要一前進(jìn) 任何操作都執(zhí)行不了了


求大神幫助



完整程序代碼:
#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;                                  //串口接收開始標(biāo)志位
bit newLineReceived = 0;                 //串口一幀協(xié)議包接收完成

unsigned char inputString[50];  //接收數(shù)據(jù)協(xié)議

uchar f=1;//0為前進(jìn) 1為后退
uchar al=0;
uchar ar=0;
uchar l=10;                 //左輪速度 0~20內(nèi)調(diào)節(jié),控制輸出電壓,參數(shù)過低輪子不動(dòng),注意調(diào)試。
uchar r=10;                //右輪速度 0~20內(nèi)調(diào)節(jié),控制輸出電壓,參數(shù)過低輪子不動(dòng),注意調(diào)試。



/******************************************************************/
/* 串口中斷程序*/
/******************************************************************/

void UART_SER () interrupt 4
{
        unsigned char n;         //定義臨時(shí)變量
        static int num = 0;

        if(RI)                 //判斷是接收中斷產(chǎn)生
        {
                RI = 0;         //標(biāo)志位清零
                n = SBUF; //讀入緩沖區(qū)的值

                //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、藍(lán)牙初始化
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)//延時(shí)函數(shù)
{
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(){//原地左轉(zhuǎn)       
        P1=0x77;
}

void round_right(){//原地右轉(zhuǎn)
        P1=0xbb;       
}

void stop(){
        P1 = 0xff;           //關(guān)閉所有LED和風(fēng)扇
       
}


void run(uint r){//前進(jìn)
        while(r){
                P1=0x7b;         
        }       
}

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


main(){
        P1 = 0xff;           //關(guān)閉所有LED和風(fēng)扇
        WifiInit();

        //循環(huán)接收藍(lán)牙數(shù)據(jù)
        while(1){
                if (newLineReceived)
                   {
                        switch(inputString[1])

                        {
                                case '0':  run(0);break;//停止
                                case '1':  run(1);break;//前進(jìn)
                                case '2':  retreat();break;//后退
                                case '3':  round_left();break;//原地左轉(zhuǎn)
                                case '4':  round_right();break;//原地右轉(zhuǎn)
                                case '5':  turn_left();break;
                                case '6':  ;break;//開燈
                                default:P1 = 0xff;break;
                        }
               newLineReceived = 0;  
         
            }       
        }
       
       
}




回復(fù)

使用道具 舉報(bào)

ID:123289 發(fā)表于 2017-8-20 12:17 | 顯示全部樓層
語句無優(yōu)先級(jí)之分,看你把哪個(gè)寫在前面,哪個(gè)就先被執(zhí)行。

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:228342 發(fā)表于 2017-8-20 12:59 來自觸屏版 | 顯示全部樓層
yzwzfyz 發(fā)表于 2017-8-20 12:17
語句無優(yōu)先級(jí)之分,看你把哪個(gè)寫在前面,哪個(gè)就先被執(zhí)行。

不是語句 是串口中斷  串口中斷好像不能中斷while循環(huán)
回復(fù)

使用道具 舉報(bào)

ID:223770 發(fā)表于 2017-8-20 13:00 | 顯示全部樓層
一個(gè)中斷,一個(gè)主循環(huán),沒有比較價(jià)值啊

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:228342 發(fā)表于 2017-8-20 14:42 來自觸屏版 | 顯示全部樓層
常沉 發(fā)表于 2017-8-20 13:00
一個(gè)中斷,一個(gè)主循環(huán),沒有比較價(jià)值啊

可是while一循環(huán) 串口中斷里就沒法接受藍(lán)牙數(shù)據(jù)了是咋回事啊
回復(fù)

使用道具 舉報(bào)

ID:228347 發(fā)表于 2017-8-20 15:49 | 顯示全部樓層
問題出在你這個(gè)run函數(shù)里面,里面的while循環(huán)跳不出來,不能那么寫。
void run(uint r){//前進(jìn)
        while(r){
                P1=0x7b;         
        }        
}
前進(jìn)過程中來串口中斷,需要做其他動(dòng)作需要在這個(gè)while里面講你的r置0 跳出循環(huán)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:228342 發(fā)表于 2017-8-20 20:54 來自觸屏版 | 顯示全部樓層
oo0o_11 發(fā)表于 2017-8-20 15:49
問題出在你這個(gè)run函數(shù)里面,里面的while循環(huán)跳不出來,不能那么寫。
void run(uint r){//前進(jìn)
        w ...

可是怎么在外部中斷這個(gè)while啊
回復(fù)

使用道具 舉報(bào)

ID:123289 發(fā)表于 2017-8-21 01:12 | 顯示全部樓層
如果WHILE不在一個(gè)更高級(jí)或等級(jí)的中斷服務(wù)程序中,必被串口中斷打斷。
回復(fù)

使用道具 舉報(bào)

ID:228342 發(fā)表于 2017-8-21 10:04 來自觸屏版 | 顯示全部樓層
yzwzfyz 發(fā)表于 2017-8-21 01:12
如果WHILE不在一個(gè)更高級(jí)或等級(jí)的中斷服務(wù)程序中,必被串口中斷打斷。

可是打斷不了啊
回復(fù)

使用道具 舉報(bào)

ID:227393 發(fā)表于 2017-8-21 10:09 來自觸屏版 | 顯示全部樓層
中斷高
回復(fù)

使用道具 舉報(bào)

ID:228342 發(fā)表于 2017-8-21 10:22 | 顯示全部樓層
oo0o_11 發(fā)表于 2017-8-20 15:49
問題出在你這個(gè)run函數(shù)里面,里面的while循環(huán)跳不出來,不能那么寫。
void run(uint r){//前進(jìn)
        w ...

void run(){//前進(jìn)
        while(1){
                P1=0x7b;
                if(rw==0){
                        break;
                }         
        }       
}



case '0':  rw=0;break;//停止
case '1':  rw=1;run();break;//前進(jìn)

我改成這樣還是不行啊  只要一執(zhí)行ruin 其他的任何操作都執(zhí)行不了了
回復(fù)

使用道具 舉報(bào)

ID:228347 發(fā)表于 2017-8-21 11:13 來自觸屏版 | 顯示全部樓層
hkoos 發(fā)表于 2017-8-21 10:22
void run(){//前進(jìn)
        while(1){
                P1=0x7b;

這樣寫當(dāng)然不會(huì)跳出循環(huán)了,串口中斷是執(zhí)行了,但是程序一直還在run函數(shù)的while(1)里面。。。沒有執(zhí)行到case語句那里。兩種方法,把串口處理那部分語句寫進(jìn)run函數(shù)while里面;或者,你把所有的轉(zhuǎn)動(dòng)程序?qū)懺谝粋(gè)函數(shù)里面,設(shè)置同一個(gè)變量,不要有循環(huán),然后把這個(gè)函數(shù)放主函數(shù)while里面運(yùn)行,串口命令去改變這個(gè)變量就好了。
回復(fù)

使用道具 舉報(bào)

ID:228699 發(fā)表于 2017-8-21 21:26 | 顯示全部樓層
中斷高的,只是進(jìn)去了你這程序體現(xiàn)不出來,程序沒寫好。
回復(fù)

使用道具 舉報(bào)

ID:123289 發(fā)表于 2017-8-21 22:59 | 顯示全部樓層
樓主:你能證明打不斷嗎?(樓主9樓問題)。

進(jìn)入?yún)R編級(jí)調(diào)試:
在中斷處設(shè)斷點(diǎn),改單步運(yùn)行,執(zhí)行到中斷返回RETI后,看是不是回到你的程序中去了。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表