找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

小白求助 關于51單片機串口數據處理

[復制鏈接]
跳轉到指定樓層
樓主
ID:1082596 發(fā)表于 2023-6-7 17:23 | 只看該作者 |只看大圖 回帖獎勵 |正序瀏覽 |閱讀模式
判斷從串口接收到的兩個字節(jié),即4位16進制的數據,如果第一個字節(jié)對了led1亮然后判斷第二個,第二個字節(jié)對了led3亮。
但是令我很好奇的是某些數據是對的,另一些卻不能正確判斷
如fafb, e1d1 ,等,燈可以正常亮起。f開頭的字節(jié)都可以
但是數字開頭的字節(jié),比如5a7b,1111等就不行。


正常

以下是我的單片機程序(初學者,很拉,不同的地方很多)
#include <reg51.h>

#define uchar unsigned char
#define uint  unsigned int

sbit led0 = P0^0; //接收到數據時閃爍
sbit led1 = P0^1;
sbit led2 = P0^2;
sbit led3 = P0^3;
sbit led4 = P0^4;

uchar num1,num2;//讀取SBUF
void UART_init(){        TR1=0;
        TMOD =0x20;          //T1工作模式2  8位自動重裝
        TH1 = 0xfd;
        TL1 = 0xfd;         //0xfd波特率9600。
        ET1 = 0;
        TR1 = 1;                //啟動T1定時器
         
        PCON =0x00;         //若0x80 SMOD置1,波特率加倍
        REN=1;                 //看似無用實則不可缺失
        SCON = 0x50;                //串口允許接收
        EA  = 1;                //開總中斷
        ES  = 1;                //串口中斷打開
}
void main()
{        
        UART_init(); //串口初始化
        while(1)
        {
        }        
}


void UART() interrupt 4
{         
        while(!RI);        //檢測是否接收完成
                RI = 0;
                led0 = ~led0;
                num1 = SBUF;        
                P1 = ~num1;
        
                if(num1==0x5A)
                {   led1=0;  //第一個字節(jié)對了之后led1亮
                        while(!RI);
                        led2=0;
                        RI=0;
                        num2=SBUF;
                        if(num2==0xA5)
                        led3=0;                 //第二個字節(jié)對了之后led3亮
                }
                else {led1=1;led2=1;led3=1;}
        
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

6#
ID:1082596 發(fā)表于 2023-6-7 21:54 | 只看該作者
劉宇杰找實訓 發(fā)表于 2023-6-7 21:04
串口中斷函數接收第一個字節(jié)之后,開啟定時器計數。接受下一個字節(jié)的時候清空定時器計數。如此,當沒有數據 ...

謝謝解答
回復

使用道具 舉報

5#
ID:1082596 發(fā)表于 2023-6-7 21:53 | 只看該作者
我把接收到的字節(jié)數據賦給了P2,P2接了8個LED燈。注意到一個現象,從串口接收到的數據,最高位會被莫名其妙地置1。比如5A(01011010),會被認為是DA(11011010)。其他的數據也是如此。這可能就是為什么部分數據可以成功識別(最高位已經是1的,如fa,e1等),而剩下的不能成功(最高位不是1的,如5A)
可是我沒寫讓最高位 置一的程序
???
如下圖所示。接收到的是5A(01011010),顯示的卻是DA(11011010)
感謝各位大佬的解答

1.png (14.96 KB, 下載次數: 44)

1.png
回復

使用道具 舉報

地板
ID:1082659 發(fā)表于 2023-6-7 21:04 | 只看該作者
串口中斷函數接收第一個字節(jié)之后,開啟定時器計數。接受下一個字節(jié)的時候清空定時器計數。如此,當沒有數據接收后,計時器無法清零,當計時器計數超過設定的數值之后,觸發(fā)定時器溢出中斷,此時數據即接收完畢
回復

使用道具 舉報

板凳
ID:1082596 發(fā)表于 2023-6-7 20:06 | 只看該作者
xuyaqi 發(fā)表于 2023-6-7 18:27
在串口中斷里應該只處理數據接收,LED處理放在main循環(huán)里,不要因為LED處理影響數據接收。

判斷和LED處理已放進主循環(huán),并且僅判斷一個字節(jié)。
仍只有部分數據led1可正常亮起,如ff.fb等
請問這是什么原因呢?我該如何解決嘞。求大佬指點
這是修改后的程序
void main()
{       
        UART_init(); //串口初始化
        while(1)
        {  
                if(num1==0x5A)
                {   led1=0;  //第一個字節(jié)對了之后led1亮
                }
                else led1=1;
       
        }       
}

void UART() interrupt 4
{         
        while(!RI);        //檢測是否接收完成
                RI = 0;       
                num1 = SBUF;
                       
}
回復

使用道具 舉報

沙發(fā)
ID:94031 發(fā)表于 2023-6-7 18:27 | 只看該作者
在串口中斷里應該只處理數據接收,LED處理放在main循環(huán)里,不要因為LED處理影響數據接收。
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表