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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 16817|回復: 24
收起左側

51串口多字節發送與接收問題

  [復制鏈接]
回帖獎勵 120 黑幣 回復本帖可獲得 10 黑幣獎勵! 每人限 1 次
ID:77578 發表于 2015-8-28 14:16 | 顯示全部樓層 |閱讀模式
在寫一個串口接受多字節的一個程序時遇到了一個問題,我寫程序使52單片機以9600波特率接受串口助手發送來的12個字節,然后再發回去,但是在程序啟動時,單片機第一次收到數據并發回,發現在發回的數據中第一個字節變成了FF,而第12個字節丟失,第二次發送便正常了,這是為什么? {DS6TCZUQ$QLZ0$C1)))0]9.png 下面是我的程序
/*
串口發送多字節
for循環發送
*////////////////////////////////
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char flag,a,i,b;//串口接受標識,接受的數據,
//uchar code table[]="I get";//定義發送數組
uchar table1[12]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
void lnit()//初始化
{
        TMOD=0x20;//設置工作方式
        TH1=0xfd;//設置初值
        TL1=0xfd;
        TR1=1;
        REN=1;
        SM0=0;
        SM1=1;
        EA=1;//開總中斷
        ES=1;//開串口中斷
}
void main()
{
        lnit();
        while(1)
        {
                if(flag==1)//當接收到數據
                {
                        ES=0;//關閉串口中斷
                        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;
        
}

評分

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

查看全部評分

回復

使用道具 舉報

ID:18297 發表于 2017-10-9 14:43 | 顯示全部樓層
本帖最后由 zjjhtony 于 2017-10-9 14:47 編輯

請看壓縮包 aking.rar (30.76 KB, 下載次數: 59)



123.jpg
222.jpg
111.jpg

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:77578 發表于 2015-8-28 20:27 | 顯示全部樓層
沒人回復,自頂
回復

使用道具 舉報

ID:76227 發表于 2015-8-29 14:51 | 顯示全部樓層

回帖獎勵 +10 黑幣

在中斷里面接收到數據之后馬上發送看看  不要設置flag標志位  你看看結果是不是正確的
回復

使用道具 舉報

ID:89092 發表于 2015-8-30 14:28 | 顯示全部樓層

回帖獎勵 +10 黑幣

51串口常於power on第一次傳送時常會發生資料錯誤, 所以, 建議power on時, 可以要求51串口, 傳任意資料, 之後, 才開始接收資料....
回復

使用道具 舉報

ID:89101 發表于 2015-8-30 18:49 | 顯示全部樓層

回帖獎勵 +10 黑幣

從調試方法上來說,先單個字節發送,然后在多個字節發送
回復

使用道具 舉報

ID:89481 發表于 2015-9-6 11:53 | 顯示全部樓層

回帖獎勵 +10 黑幣

在中斷里面接收到數據之后馬上發送看看  不要設置flag標志位  你看看結果是不是正確的
回復

使用道具 舉報

ID:89738 發表于 2015-9-9 21:02 | 顯示全部樓層

回帖獎勵 +10 黑幣

這個問題我也遇到過,有時候也自己就正常了
回復

使用道具 舉報

ID:89750 發表于 2015-9-9 22:05 | 顯示全部樓層

回帖獎勵 +10 黑幣

是不是緩沖區里有上次發送的數據導致亂碼。。
回復

使用道具 舉報

ID:89053 發表于 2015-9-10 10:52 | 顯示全部樓層

回帖獎勵 +10 黑幣

發送的數據回傳么,接收到一個字節進入接收中斷后,直接發送,
回復

使用道具 舉報

ID:225054 發表于 2017-10-8 09:30 來自觸屏版 | 顯示全部樓層
我感覺要先設置串口工作方式后在允許串口發送數據
回復

使用道具 舉報

ID:219796 發表于 2017-10-8 18:47 來自觸屏版 | 顯示全部樓層
init加flag=0試試
回復

使用道具 舉報

ID:237965 發表于 2017-10-9 12:14 | 顯示全部樓層
建議接收到數據后delay 一下,再發送數據。先調試發送一個BYTE成功后再調試發送接收多個BYTE。
回復

使用道具 舉報

ID:111634 發表于 2017-10-9 15:21 | 顯示全部樓層

回帖獎勵 +10 黑幣

老貼不回了
回復

使用道具 舉報

ID:238024 發表于 2017-10-9 16:01 | 顯示全部樓層
第一次單片機也是接收12個字節, 只不過第一個字節是FF,樓主可以重點分析這個FF是從哪來的
回復

使用道具 舉報

ID:238036 發表于 2017-10-9 16:08 | 顯示全部樓層
同樣問題同求
回復

使用道具 舉報

ID:238225 發表于 2017-10-10 11:40 | 顯示全部樓層
ser中斷有問題,里面判斷RI==1就清RI=0,接收SBUF,退出中斷;如果RI==0直接退出
回復

使用道具 舉報

ID:238225 發表于 2017-10-10 11:47 | 顯示全部樓層
SER中斷有問題,判斷到RI==0馬上退出;RI==1才接收SBUF,清RI
回復

使用道具 舉報

ID:237939 發表于 2017-10-10 15:38 | 顯示全部樓層
1:你的代碼沒有任何容錯。你既然用0d開頭,那你就要檢查一下0d,或者插入兩到三個無意義的數據作為頭。同時加入長度域和校驗值。
2:出現ff的可能有兩種情況,發送出錯或接收出錯。
起始位為邏輯0,那么不發送的時候最好是邏輯1.你開始初始化pc機或者單片機的時候,pc機或單片機在初始化之前他的狀態不是rs232協議,單片機很多時候口是復用的,有可能開始收到或發送的就會錯。這個很好解釋。
3:你的代碼計數到12,所以多了個ff,自然少了最后一個,這個很正常,這就是為啥我建議你加校驗和頭,長度的原因。
4:這種代碼風格出錯是正常的,不錯才不正常。
回復

使用道具 舉報

ID:237939 發表于 2017-10-10 15:42 | 顯示全部樓層
4:在中斷里加while(!ri)這樣的語句,是巴不得系統死掉的寫法。應該用if(ri==0) {再查下為啥進中斷居然不置位,然后清掉,return;} 這樣才是王道
回復

使用道具 舉報

ID:94867 發表于 2017-12-27 19:09 | 顯示全部樓層
謝謝講解
回復

使用道具 舉報

ID:267947 發表于 2017-12-27 19:49 | 顯示全部樓層
可能是中斷問題
回復

使用道具 舉報

ID:404720 發表于 2018-11-26 15:04 | 顯示全部樓層
請問現在解決了嗎?求
回復

使用道具 舉報

ID:433533 發表于 2018-11-26 16:35 | 顯示全部樓層
進入中斷時候,先判斷RI是否等于1,然后在把sbuf的數據放入數組中
回復

使用道具 舉報

ID:338173 發表于 2018-11-27 19:52 | 顯示全部樓層
要有幀頭 幀尾 我寫過兩個單片機藍牙通信的程序。你加上幀頭 幀尾就行了,再有校驗位的話,基本萬無一失。這個代碼雖然不難 但是想了好久 分享一下
QQ截圖20181127195125.jpg
回復

使用道具 舉報

26#
無效樓層,該帖已經被刪除
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

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