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

QQ登錄

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

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

51串口多字節(jié)發(fā)送與接收問(wèn)題

  [復(fù)制鏈接]
回帖獎(jiǎng)勵(lì) 120 黑幣 回復(fù)本帖可獲得 10 黑幣獎(jiǎng)勵(lì)! 每人限 1 次
跳轉(zhuǎn)到指定樓層
樓主
ID:77578 發(fā)表于 2015-8-28 14:16 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
在寫(xiě)一個(gè)串口接受多字節(jié)的一個(gè)程序時(shí)遇到了一個(gè)問(wèn)題,我寫(xiě)程序使52單片機(jī)以9600波特率接受串口助手發(fā)送來(lái)的12個(gè)字節(jié),然后再發(fā)回去,但是在程序啟動(dòng)時(shí),單片機(jī)第一次收到數(shù)據(jù)并發(fā)回,發(fā)現(xiàn)在發(fā)回的數(shù)據(jù)中第一個(gè)字節(jié)變成了FF,而第12個(gè)字節(jié)丟失,第二次發(fā)送便正常了,這是為什么? 下面是我的程序
/*
串口發(fā)送多字節(jié)
for循環(huán)發(fā)送
*////////////////////////////////
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char flag,a,i,b;//串口接受標(biāo)識(shí),接受的數(shù)據(jù),
//uchar code table[]="I get";//定義發(fā)送數(shù)組
uchar table1[12]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
void lnit()//初始化
{
        TMOD=0x20;//設(shè)置工作方式
        TH1=0xfd;//設(shè)置初值
        TL1=0xfd;
        TR1=1;
        REN=1;
        SM0=0;
        SM1=1;
        EA=1;//開(kāi)總中斷
        ES=1;//開(kāi)串口中斷
}
void main()
{
        lnit();
        while(1)
        {
                if(flag==1)//當(dāng)接收到數(shù)據(jù)
                {
                        ES=0;//關(guān)閉串口中斷
                        for(i=0;i<12;i++)
                        {
                                SBUF=table1[ i];
                                while(!TI);
                                TI=0;
                        }
                        //SBUF=a;
                        //while(!TI);
                //        TI=0;
                        ES=1;
                        b=0;
                        flag=0;
                }
        }
}
void ser()interrupt 4
{
                table1=SBUF;
                while(!RI);
                RI=0;
                b++;
                if(b==12)
                        flag=1;
        
}

評(píng)分

參與人數(shù) 1黑幣 +10 收起 理由
螺旋丸 + 10

查看全部評(píng)分

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

使用道具 舉報(bào)

來(lái)自 2#
ID:18297 發(fā)表于 2017-10-9 14:43 | 只看該作者
本帖最后由 zjjhtony 于 2017-10-9 14:47 編輯

請(qǐng)看壓縮包 aking.rar (30.76 KB, 下載次數(shù): 59)



123.jpg (197.49 KB, 下載次數(shù): 86)

123.jpg

222.jpg (9.81 KB, 下載次數(shù): 92)

222.jpg

111.jpg (27.95 KB, 下載次數(shù): 92)

111.jpg

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

板凳
ID:77578 發(fā)表于 2015-8-28 20:27 | 只看該作者
沒(méi)人回復(fù),自頂
回復(fù)

使用道具 舉報(bào)

地板
ID:76227 發(fā)表于 2015-8-29 14:51 | 只看該作者

回帖獎(jiǎng)勵(lì) +10 黑幣

在中斷里面接收到數(shù)據(jù)之后馬上發(fā)送看看  不要設(shè)置flag標(biāo)志位  你看看結(jié)果是不是正確的
回復(fù)

使用道具 舉報(bào)

5#
ID:89092 發(fā)表于 2015-8-30 14:28 | 只看該作者

回帖獎(jiǎng)勵(lì) +10 黑幣

51串口常於power on第一次傳送時(shí)常會(huì)發(fā)生資料錯(cuò)誤, 所以, 建議power on時(shí), 可以要求51串口, 傳任意資料, 之後, 才開(kāi)始接收資料....
回復(fù)

使用道具 舉報(bào)

6#
ID:89101 發(fā)表于 2015-8-30 18:49 | 只看該作者

回帖獎(jiǎng)勵(lì) +10 黑幣

從調(diào)試方法上來(lái)說(shuō),先單個(gè)字節(jié)發(fā)送,然后在多個(gè)字節(jié)發(fā)送
回復(fù)

使用道具 舉報(bào)

7#
ID:89481 發(fā)表于 2015-9-6 11:53 | 只看該作者

回帖獎(jiǎng)勵(lì) +10 黑幣

在中斷里面接收到數(shù)據(jù)之后馬上發(fā)送看看  不要設(shè)置flag標(biāo)志位  你看看結(jié)果是不是正確的
回復(fù)

使用道具 舉報(bào)

8#
ID:89738 發(fā)表于 2015-9-9 21:02 | 只看該作者

回帖獎(jiǎng)勵(lì) +10 黑幣

這個(gè)問(wèn)題我也遇到過(guò),有時(shí)候也自己就正常了
回復(fù)

使用道具 舉報(bào)

9#
ID:89750 發(fā)表于 2015-9-9 22:05 | 只看該作者

回帖獎(jiǎng)勵(lì) +10 黑幣

是不是緩沖區(qū)里有上次發(fā)送的數(shù)據(jù)導(dǎo)致亂碼。。
回復(fù)

使用道具 舉報(bào)

10#
ID:89053 發(fā)表于 2015-9-10 10:52 | 只看該作者

回帖獎(jiǎng)勵(lì) +10 黑幣

發(fā)送的數(shù)據(jù)回傳么,接收到一個(gè)字節(jié)進(jìn)入接收中斷后,直接發(fā)送,
回復(fù)

使用道具 舉報(bào)

11#
ID:225054 發(fā)表于 2017-10-8 09:30 來(lái)自手機(jī) | 只看該作者
我感覺(jué)要先設(shè)置串口工作方式后在允許串口發(fā)送數(shù)據(jù)
回復(fù)

使用道具 舉報(bào)

12#
ID:219796 發(fā)表于 2017-10-8 18:47 來(lái)自手機(jī) | 只看該作者
init加flag=0試試
回復(fù)

使用道具 舉報(bào)

13#
ID:237965 發(fā)表于 2017-10-9 12:14 | 只看該作者
建議接收到數(shù)據(jù)后delay 一下,再發(fā)送數(shù)據(jù)。先調(diào)試發(fā)送一個(gè)BYTE成功后再調(diào)試發(fā)送接收多個(gè)BYTE。
回復(fù)

使用道具 舉報(bào)

14#
ID:111634 發(fā)表于 2017-10-9 15:21 | 只看該作者

回帖獎(jiǎng)勵(lì) +10 黑幣

老貼不回了
回復(fù)

使用道具 舉報(bào)

15#
ID:238024 發(fā)表于 2017-10-9 16:01 | 只看該作者
第一次單片機(jī)也是接收12個(gè)字節(jié), 只不過(guò)第一個(gè)字節(jié)是FF,樓主可以重點(diǎn)分析這個(gè)FF是從哪來(lái)的
回復(fù)

使用道具 舉報(bào)

16#
ID:238036 發(fā)表于 2017-10-9 16:08 | 只看該作者
同樣問(wèn)題同求
回復(fù)

使用道具 舉報(bào)

17#
ID:238225 發(fā)表于 2017-10-10 11:40 | 只看該作者
ser中斷有問(wèn)題,里面判斷RI==1就清RI=0,接收SBUF,退出中斷;如果RI==0直接退出
回復(fù)

使用道具 舉報(bào)

18#
ID:238225 發(fā)表于 2017-10-10 11:47 | 只看該作者
SER中斷有問(wèn)題,判斷到RI==0馬上退出;RI==1才接收SBUF,清RI
回復(fù)

使用道具 舉報(bào)

19#
ID:237939 發(fā)表于 2017-10-10 15:38 | 只看該作者
1:你的代碼沒(méi)有任何容錯(cuò)。你既然用0d開(kāi)頭,那你就要檢查一下0d,或者插入兩到三個(gè)無(wú)意義的數(shù)據(jù)作為頭。同時(shí)加入長(zhǎng)度域和校驗(yàn)值。
2:出現(xiàn)ff的可能有兩種情況,發(fā)送出錯(cuò)或接收出錯(cuò)。
起始位為邏輯0,那么不發(fā)送的時(shí)候最好是邏輯1.你開(kāi)始初始化pc機(jī)或者單片機(jī)的時(shí)候,pc機(jī)或單片機(jī)在初始化之前他的狀態(tài)不是rs232協(xié)議,單片機(jī)很多時(shí)候口是復(fù)用的,有可能開(kāi)始收到或發(fā)送的就會(huì)錯(cuò)。這個(gè)很好解釋。
3:你的代碼計(jì)數(shù)到12,所以多了個(gè)ff,自然少了最后一個(gè),這個(gè)很正常,這就是為啥我建議你加校驗(yàn)和頭,長(zhǎng)度的原因。
4:這種代碼風(fēng)格出錯(cuò)是正常的,不錯(cuò)才不正常。
回復(fù)

使用道具 舉報(bào)

20#
ID:237939 發(fā)表于 2017-10-10 15:42 | 只看該作者
4:在中斷里加while(!ri)這樣的語(yǔ)句,是巴不得系統(tǒng)死掉的寫(xiě)法。應(yīng)該用if(ri==0) {再查下為啥進(jìn)中斷居然不置位,然后清掉,return;} 這樣才是王道
回復(fù)

使用道具 舉報(bào)

21#
ID:94867 發(fā)表于 2017-12-27 19:09 | 只看該作者
謝謝講解
回復(fù)

使用道具 舉報(bào)

22#
ID:267947 發(fā)表于 2017-12-27 19:49 | 只看該作者
可能是中斷問(wèn)題
回復(fù)

使用道具 舉報(bào)

23#
ID:404720 發(fā)表于 2018-11-26 15:04 | 只看該作者
請(qǐng)問(wèn)現(xiàn)在解決了嗎?求
回復(fù)

使用道具 舉報(bào)

24#
ID:433533 發(fā)表于 2018-11-26 16:35 | 只看該作者
進(jìn)入中斷時(shí)候,先判斷RI是否等于1,然后在把sbuf的數(shù)據(jù)放入數(shù)組中
回復(fù)

使用道具 舉報(bào)

25#
ID:338173 發(fā)表于 2018-11-27 19:52 | 只看該作者
要有幀頭 幀尾 我寫(xiě)過(guò)兩個(gè)單片機(jī)藍(lán)牙通信的程序。你加上幀頭 幀尾就行了,再有校驗(yàn)位的話,基本萬(wàn)無(wú)一失。這個(gè)代碼雖然不難 但是想了好久 分享一下

QQ截圖20181127195125.jpg (38.71 KB, 下載次數(shù): 41)

QQ截圖20181127195125.jpg
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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