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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3399|回復: 21
收起左側

新手請教個關于單片機串口和pc通信的問題

[復制鏈接]
ID:70774 發表于 2014-12-20 12:05 | 顯示全部樓層 |閱讀模式
我用PC(串口調試助手)給單片機發送兩個字節的數據,我搞不清楚這兩個字節發送時的具體情況,于是寫了下面的程序校驗一下,我疑惑的是在if語句中如果把ES=1這句去掉,為什么一個字節都收不到了,程序如下
#include <reg52.h>
unsigned char flag,a;
void init();
void main()
{
init();
while(1)
{
if(flag==1)
{
ES=0;
flag=0;
SBUF=a;
while(!TI);
TI=0;
ES=1;//把這個去掉就一個字節都收不到了。
}
}
}
void ser() interrupt 4
{
RI=0;
flag=1;
a=SBUF;
}
void init()
{
TMOD=0x20;
TH1=0xf4;
TL1=0xf4;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
}
我對程序的理解是:我在PC上寫兩個字節的數據,一個一個發送,首先發送一個字節。那么單片機SBUF收到一個字節后會請求中斷,這時我把sbuf中的值取走,并且主程序中檢測標志位flag等于1,再把這個數據發送到PC,如果在主程序中最后一句ES=1保留,那么第二個發送的數據發送完時,在中斷中又去取數,取完后再發送到PC,但是如果我把這一句刪除掉,那么我理應收到第一個字節啊,第二字節由于沒有開中斷,就無法執行中斷,也無法取出第二個字節的數據,進而無法發送到PC啊,可是我一個字節都收不到了。。有大神解惑嗎?不太理解傳輸過程,我的理解是,單片機一直在執行主程序,只不過SBUF收到一個數據,CPU停下手頭的工作去執行取數據的命令(或者不取,主程序跟所取數據無關,一般通信也不會這么干吧),那么為什么一個字節都收不到呢,我覺得應該可以收到一個字節的數據啊

回復

使用道具 舉報

ID:67992 發表于 2014-12-20 16:29 | 顯示全部樓層
單片機上電復位時是不穩定的,理想情況當然如你所想那樣。上電不該運行的中斷服務程序自動運行了一次,導致flag=1,結果主程序里滿足if條件也運行了,發送a給串口,a的內容是自動運行讀取的內容,大多為0xff.
結果你又把ES關住了。你第一次輸入數據,對單片機來說是第二次了,當然沒反應了。
回復

使用道具 舉報

ID:67992 發表于 2014-12-20 16:33 | 顯示全部樓層
改成這樣試下:
#include <reg52.h>
unsigned char flag,a;
void init();
void main()
{
init();
while(1)
{
if(flag==1)
{
ES=0;
flag=0;
SBUF=a;
while(!TI);
TI=0;
//ES=1;//把這個去掉就一個字節都收不到了。
}
}
}
void ser() interrupt 4
{
RI=0;
a=SBUF;
if(a!=0xff)
flag=1;
}
void init()
{
TMOD=0x20;
TH1=0xf4;
TL1=0xf4;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
}
回復

使用道具 舉報

ID:18297 發表于 2014-12-20 16:37 | 顯示全部樓層
單片機 的ES是串行口中斷允許位。
如果ES=0,不會即使有數據發給單片機,也不會產生中斷。
這里ES=0,然后進行發送。(為了發送時禁止產生接受中斷)
而發送完后,再設置ES=1,允許串口中斷,可以接受數據并產生串口中斷,執行串口中斷程序。
回復

使用道具 舉報

ID:70774 發表于 2014-12-20 22:38 | 顯示全部樓層
dgahz 發表于 2014-12-20 16:33
改成這樣試下:
#include
unsigned char flag,a;

謝謝您的回答,可以加您的微信或者qq嗎?
回復

使用道具 舉報

ID:67992 發表于 2014-12-20 23:29 | 顯示全部樓層
我很少上Q,有什么問題發本壇我看到會的話會答復的,我初學單片機,喜歡分析,從中也可學到東西,原理性的東西我說的也不一定對,大家一起探討,理不辯不明。
回復

使用道具 舉報

ID:70774 發表于 2014-12-21 09:58 | 顯示全部樓層
dgahz 發表于 2014-12-20 23:29
我很少上Q,有什么問題發本壇我看到會的話會答復的,我初學單片機,喜歡分析,從中也可學到東西,原理性的東 ...

真實太感謝您了。以后有電路方面不懂的還需向您多多請教啊。感覺找到了志同道合的。對了下面還有一個問題,想問問您的看法。有時候我把程序燒錄到單片機中,打開串口助手,還沒點發送呢,它就直接發送了而且停不下來,這又是為什么呢?我也沒有按復位鍵。是不是因為燒錄時,也是通過RXD引腳燒錄進去的,這時已經在接收數據了,從而導致程序收到燒錄的影響?(不知道你所說的上電復位是什么意思,因為燒錄的時候就需要上電啊。)還有就是通信過程和定時器工作差不多,就是通信時,CPU不問事,等到串口中斷標志位置一,cPU才會去取數,當然也可以不開中斷,但是總要有某種方式來清空標志位把(比如位檢測,一直檢測是否中斷標志位是否置一,但是這樣會影響效率,占用CPU),要不然標志位一直是1,無法判斷是否又完成了一次數據的傳輸,一般來說單片機會用中斷的形式對SBUF里的值進行操作(取),畢竟通信的目的就是發送指令或者傳遞數據啊,這都是我自己的想法,不知道里面有沒有錯,希望您能解答!謝謝您。
回復

使用道具 舉報

ID:67992 發表于 2014-12-21 10:09 來自手機 | 顯示全部樓層
我調試中初始(燒錄完程序)發現RI有置1的現象,按道理應該不會有這個現象,只能猜想硬件須平穩過程,也有可能如你所說和燒錄共用了串口的原因。
回復

使用道具 舉報

ID:67992 發表于 2014-12-21 10:14 來自手機 | 顯示全部樓層
清標志接收一般在中斷吧,cPu可及時處理,發送給串口助手由cPu掌控,幾時發由編好的程序決定。
回復

使用道具 舉報

ID:67992 發表于 2014-12-21 10:23 來自手機 | 顯示全部樓層
程序運行不外乎兩個地方,中斷內和中斷外,中斷內處理一些cPu無法預知何時發生的事件,中斷外cpu以查詢指令的方式運行,當沒有查詢到某個指令時,即使和這個指令相關的事件已發生,cPu是蒙在鼓里的,它不可能去處理,如此時它在處理一些延時較長的其它事件,情況更糟。
回復

使用道具 舉報

ID:67992 發表于 2014-12-21 10:26 來自手機 | 顯示全部樓層
燒錄停不下來的程序貼上來我看看,應該不會有這樣的問題。
回復

使用道具 舉報

ID:70774 發表于 2014-12-21 10:40 | 顯示全部樓層
dgahz 發表于 2014-12-21 10:26
燒錄停不下來的程序貼上來我看看,應該不會有這樣的問題。

#include <reg52.h>
unsigned char flag,a,p,temp;
void init();
void main()
{

  flag=0;
  init();
  while(1)
   {  
    if(flag==1)
     {
       
                flag=0;
                SBUF=p;
                while(!TI);
                TI=0;
                ES=1; //這句去掉,一個字節都收不到了      
     }


       
         
}

}
void   dd() interrupt 4
{
        RI=0;
        p=SBUF;
        flag=1;
}

void init()
{
TMOD=0x20;
TH1=0xf4;
TL1=0xf4;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
}
只是把上面的ES=0去掉了,燒錄完,打開調試助手的“打開串口”,我沒點發送,嘩啦啦,FFFF就出現了,不斷在接收。
回復

使用道具 舉報

ID:67992 發表于 2014-12-21 10:54 | 顯示全部樓層
RI和TI是或的關系,看說明書有講到。只要兩者之一置1,都 會執行中斷服務函數,就會不斷發送和接收。SBUF沒數據就會填充FF.
回復

使用道具 舉報

ID:67992 發表于 2014-12-21 10:58 | 顯示全部樓層
去掉ES=0,TI置1也進中斷了。
回復

使用道具 舉報

ID:70774 發表于 2014-12-21 11:11 | 顯示全部樓層
dgahz 發表于 2014-12-21 10:58
去掉ES=0,TI置1也進中斷了。

但是我還沒有發送數據,整個程序應該還沒執行,當我發送一個數據之后,才應該陷入死循環啊。不知道為什么就直接陷入死循環了
回復

使用道具 舉報

ID:67992 發表于 2014-12-21 11:28 來自手機 | 顯示全部樓層
我之前不是說過了嗎,燒錄完單片機自己發送了FF一次,RI置1了,結果就有你說的現象了。
回復

使用道具 舉報

ID:67992 發表于 2014-12-21 11:32 來自手機 | 顯示全部樓層
燒錄完它自己進了一次中斷,原因不明。
回復

使用道具 舉報

ID:67992 發表于 2014-12-21 11:34 來自手機 | 顯示全部樓層
你沒輸數據,里面數據默認為FF。
回復

使用道具 舉報

ID:70774 發表于 2014-12-21 11:47 | 顯示全部樓層
dgahz 發表于 2014-12-21 11:34
你沒輸數據,里面數據默認為FF。

明白,謝謝
回復

使用道具 舉報

ID:241242 發表于 2017-11-17 19:10 | 顯示全部樓層
學習一下!
回復

使用道具 舉報

ID:250537 發表于 2017-11-17 20:12 | 顯示全部樓層
單片機 的ES是串行口中斷允許位。 如果ES=0,不會即使有數據發給單片機,也不會產生中斷。 這里ES=0,然后進行發送。(為了發送時禁止產生接受中斷) 而發送完后,再設置ES=1,允許串口中斷,可以接受數據并產生串口中斷,執行串口中斷程序。
回復

使用道具 舉報

ID:250542 發表于 2017-11-17 20:33 來自手機 | 顯示全部樓層
這里可以學習很多
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品一区免费 | 久久综合爱 | 午夜影院在线观看 | 91精品国产91久久久久青草 | 中文字幕一区二区三区精彩视频 | 亚洲最大福利网 | 国产精品国产三级国产aⅴ原创 | 欧美一级二级在线观看 | 一区二区免费在线 | 欧美精品一区二区三区在线播放 | 午夜精品一区二区三区在线播放 | 中文字幕精品视频在线观看 | 三级特黄特色视频 | 成人午夜激情 | 久在线视频 | 亚洲精品一区二区网址 | 91色视频在线观看 | 亚洲国产精品人人爽夜夜爽 | 日韩一区不卡 | 日韩精品久久久久 | 99精品视频在线观看 | 欧美黑人体内she精在线观看 | 毛片久久久 | 在线超碰 | 日韩高清国产一区在线 | 久久av网站 | 国内自拍真实伦在线观看 | 日韩欧美在线免费 | 精品videossex高潮汇编 | 国产精品免费一区二区三区四区 | 黄免费观看视频 | 久久久久成人精品亚洲国产 | 一区二区三区国产视频 | 久久久91精品国产一区二区三区 | 国产日韩精品一区 | 国产视频二区 | 久久久91精品国产一区二区三区 | 成人在线不卡 | 嫩草懂你的影院入口 | 香蕉一区二区 | 国产一区二区三区在线 |