久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3272|回復: 4
打印 上一主題 下一主題
收起左側

單片機串口接收數據 怎么接收一個判斷一個?

[復制鏈接]
跳轉到指定樓層
樓主
ID:261025 發(fā)表于 2021-11-25 21:07 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
遙控接收部分  不想接收完整的數據后再判斷接收的數據是否正確  想接收一個判斷一個  接收判斷的部分怎么寫  要C語言的  我現在只能判斷第一個  往后就不會寫了   比如接收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ā)
ID:624769 發(fā)表于 2021-11-25 22:51 | 只看該作者
建議存緩存,然后統(tǒng)一判斷, 如果非要收一個判斷一個的話, 接收的時候啥事都干不了了。

接收時判斷如下:

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


再你代碼的基礎上寫的,i用來判斷超時, i 的值取決于你的波特率,波特率越高i可以越小,反之i 可能需要增大。

最后,這種方法非常不建議。可能的話,還是推薦用緩沖池方式。
回復

使用道具 舉報

板凳
ID:401564 發(fā)表于 2021-11-25 23:32 | 只看該作者
你這是紅外遙控還是串口,紅外遙控是在外部中斷的,那是要接收完整數據的
如果是串口通訊,可以在上位機或者遙控程序中加入起始信號和停止信號收到起始信號開始保存到數組中,收到結束信號之后開始判斷接收的信息,不需要每次都檢測,那串口不累壞了
你參考一下:
void Uart1_Isr() interrupt 4        //串口1中斷函數,這里要參考數據手冊來編寫代碼
{
        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;        //清除中斷接收標示位                                                                                           
                        Uart_S[RX_Count]=SBUF;
                        if(SBUF==0xff)end_str++; //檢測結束符
                        else if (end_str>0)end_str--;       
                        if((Uart_S[RX_Count]==0xe8)&&(Uart_S[RX_Count-1]==0xc9))        //檢測開始接收到"設"字                                                                  
                                   {
                                        RX_Count=1;
                                        Uart_S[0]=0xc9;
                                        Uart_S[1]=0xe8;                                                                       
                                }
                        RX_Count++;
                        if(RX_Count>=20)RX_Count=0;//防止數組溢出
                        if(end_str>2)
                                {                                       
                                        p=strstr(Uart_S,"設開機");                                                                //查找指令
                                        if(NULL!=p)//如果接收到"設開機"字符串,指針返回值不為"空"
                                                {
                                                        //處理部分                                                                                                                                                                       
                                                }                                
                                        }
                                        end_str=0;
                                        RX_Count=0;                                                       
                                        memset(&Uart_S,0,sizeof(Uart_S));        //串口接收數據歸零                                                 
                                }                                                       
                                                                                                                                                                                                                                                                                                                                                                                                                                     
                }                                       
}

回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91九色porny首页最多播放 | 亚洲欧美久久 | 日本精品久久 | 欧美人成在线视频 | 亚洲精品一区二区三区中文字幕 | 中文字幕一区二区三区在线观看 | 97天天干 | 国产探花在线精品一区二区 | 国产精品一区二区三区在线播放 | 日韩图区 | 亚洲视频在线看 | 日韩在线免费视频 | 午夜手机在线视频 | 伊人精品一区二区三区 | 国产第二页 | av片在线免费看 | 亚洲综合一区二区三区 | 中文字幕二区 | 日韩欧美高清dvd碟片 | 美女午夜影院 | 福利片在线看 | 亚洲免费视频网站 | 国产欧美在线视频 | 国产视频1区2区 | 国产精品免费一区二区 | 亚洲久在线 | 91亚洲国产成人精品一区二三 | 人人鲁人人莫人人爱精品 | 欧美中文一区 | 成人在线精品视频 | 久久亚洲一区二区三区四区 | 欧美v片 | 久久久久亚洲av毛片大全 | 日本欧美视频 | 欧美精品一区二区三区在线四季 | www亚洲成人| 午夜视频网 | 91精品一区 | 91电影在线播放 | 国产精品毛片一区二区在线看 | 国产精品久久久久久久久久久久久 |