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

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3328|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)串口接收數(shù)據(jù) 怎么接收一個(gè)判斷一個(gè)?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:261025 發(fā)表于 2021-11-25 21:07 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
遙控接收部分  不想接收完整的數(shù)據(jù)后再判斷接收的數(shù)據(jù)是否正確  想接收一個(gè)判斷一個(gè)  接收判斷的部分怎么寫(xiě)  要C語(yǔ)言的  我現(xiàn)在只能判斷第一個(gè)  往后就不會(huì)寫(xiě)了   比如接收123456  1到5需要判斷  6存到Temp里

void UARTInterrupt(void) interrupt 4
{
        if(RI)  
        {   RI=0;   
                Receive=SBUF;                 
                if(Receive=='1')
                {          Temp=Receive;
                }
        }
        else
        TI = 0;
}




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:624769 發(fā)表于 2021-11-25 22:51 | 只看該作者
建議存緩存,然后統(tǒng)一判斷, 如果非要收一個(gè)判斷一個(gè)的話, 接收的時(shí)候啥事都干不了了。

接收時(shí)判斷如下:

void UARTInterrupt(void) interrupt 4
{
        u8        i;
        if(RI)  
        {   
                RI=0;   
                Receive=SBUF;                 
                if(Receive=='1')                //如果第一個(gè)字節(jié)吻合'1'
                {         
                        i = 255;
                        while((--i > 0) && (!RI));
                        if(RI)
                        {
                                RI=0;   
                                Receive=SBUF;                 
                                if(Receive=='2')        //如果第二個(gè)字節(jié)吻合'2'
                                {
                                        i = 255;
                                        while((--i > 0) && (!RI));
                                        if(RI)
                                        {
                                                RI=0;   
                                                Receive=SBUF;                 
                                                if(Receive=='3')        //如果第三個(gè)字節(jié)吻合'3'
                                                {
                                                        i = 255;
                                                        while((--i > 0) && (!RI));
                                                        if(RI)
                                                        {
                                                                RI=0;   
                                                                Receive=SBUF;                 
                                                                if(Receive=='4')        //如果第四個(gè)字節(jié)吻合'4'
                                                                {
                                                                        i = 255;
                                                                        while((--i > 0) && (!RI));
                                                                        if(RI)
                                                                        {
                                                                                RI=0;   
                                                                                Receive=SBUF;                 
                                                                                if(Receive=='5')        //如果第五個(gè)字節(jié)吻合'5'
                                                                                {
                                                                                        i = 255;
                                                                                        while((--i > 0) && (!RI));
                                                                                        if(RI)
                                                                                        {
                                                                                                RI=0;   
                                                                                                My_Buf=SBUF;     //保存第六個(gè)字節(jié)到緩存并返回
                                                                                                Recive_Ok = 1;
                                                                                        }
                                                                                }
                                                                        }
                                                                }
                                                        }
                                                }
                                        }
                                }
                        }
                }
        }
        else
        TI = 0;
}


再你代碼的基礎(chǔ)上寫(xiě)的,i用來(lái)判斷超時(shí), i 的值取決于你的波特率,波特率越高i可以越小,反之i 可能需要增大。

最后,這種方法非常不建議?赡艿脑,還是推薦用緩沖池方式。
回復(fù)

使用道具 舉報(bào)

板凳
ID:401564 發(fā)表于 2021-11-25 23:32 | 只看該作者
你這是紅外遙控還是串口,紅外遙控是在外部中斷的,那是要接收完整數(shù)據(jù)的
如果是串口通訊,可以在上位機(jī)或者遙控程序中加入起始信號(hào)和停止信號(hào)收到起始信號(hào)開(kāi)始保存到數(shù)組中,收到結(jié)束信號(hào)之后開(kāi)始判斷接收的信息,不需要每次都檢測(cè),那串口不累壞了
你參考一下:
void Uart1_Isr() interrupt 4        //串口1中斷函數(shù),這里要參考數(shù)據(jù)手冊(cè)來(lái)編寫(xiě)代碼
{
        char *p,Uart_S[20];
        static unsigned char RX_Count=0x0;
        if(TI)                                          //如果是發(fā)送中斷觸發(fā),就處理發(fā)送中斷
                   {                          
                         TI=0;                           //發(fā)送中斷
                        busy=0;                          
                }  
        if(RI)
                {
                        RI=0;        //清除中斷接收標(biāo)示位                                                                                           
                        Uart_S[RX_Count]=SBUF;
                        if(SBUF==0xff)end_str++; //檢測(cè)結(jié)束符
                        else if (end_str>0)end_str--;       
                        if((Uart_S[RX_Count]==0xe8)&&(Uart_S[RX_Count-1]==0xc9))        //檢測(cè)開(kāi)始接收到"設(shè)"字                                                                  
                                   {
                                        RX_Count=1;
                                        Uart_S[0]=0xc9;
                                        Uart_S[1]=0xe8;                                                                       
                                }
                        RX_Count++;
                        if(RX_Count>=20)RX_Count=0;//防止數(shù)組溢出
                        if(end_str>2)
                                {                                       
                                        p=strstr(Uart_S,"設(shè)開(kāi)機(jī)");                                                                //查找指令
                                        if(NULL!=p)//如果接收到"設(shè)開(kāi)機(jī)"字符串,指針?lè)祷刂挡粸?quot;空"
                                                {
                                                        //處理部分                                                                                                                                                                       
                                                }                                
                                        }
                                        end_str=0;
                                        RX_Count=0;                                                       
                                        memset(&Uart_S,0,sizeof(Uart_S));        //串口接收數(shù)據(jù)歸零                                                 
                                }                                                       
                                                                                                                                                                                                                                                                                                                                                                                                                                     
                }                                       
}

回復(fù)

使用道具 舉報(bào)

地板
ID:311903 發(fā)表于 2021-11-26 08:22 | 只看該作者
對(duì)于數(shù)據(jù)接收,建立一個(gè)環(huán)形緩存,在接收數(shù)據(jù)的時(shí)候,把數(shù)據(jù)push進(jìn)緩存中,在外部(while大循環(huán)中)一直檢測(cè)緩存是否有數(shù)據(jù),有數(shù)據(jù)則讀取出來(lái),類似生產(chǎn)者消費(fèi)者模式
回復(fù)

使用道具 舉報(bào)

5#
ID:57657 發(fā)表于 2021-11-26 08:55 | 只看該作者
建立一個(gè)unsigned char數(shù)組,然后進(jìn)行FIFO緩存。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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