『壹』 單片機串口通信的問題
單片機串口通信的問題,其實你只有一個問題,就是:
P0=0XF0;
S2BUF=0xfc;
P0=S2BUF; //為什麼這里P0是0x00 ?
你覺得P0應該等於0xfc對不對?之所以出乎你的預料,是因為S2BUF寄存器地址是一個,實際是兩個寄存器,一個只讀,一個只寫。S2BUF=0xfc是寫發送緩沖寄存器S2BUF,P0=S2BUF是讀接收緩沖寄存器S2BUF,在沒有接收的字元時,接收緩沖寄存器S2BUF是未知的,現在恰好是0,P0當然等於0X00。
『貳』 單片機串口通信問題
P3=0xff的作用其實很簡單,就是為了更好的完成「讀--修改--寫」這個過程,其實對於P3口是沒有必要的,對於P0口這樣做是應該的。
『叄』 單片機串口問題!
規律實際上是:'0'-49,'1'-50,'2'-51,...
你發送前將發送的數值減去'0'即可;
你可以一次發兩個數,第一個數是計數值,第二個數是任意數,然後一次顯示即可。
0~65535數據可以分成4個位元組分別順序發送。
『肆』 單片機串口通信時而正常,時而不正常,硬體沒問題,應該是時序問題,一般會有什麼時序問題呢
問題原因可能是如下幾個方面:
1、是否使用的是USB轉串口的轉換線?這種方式目前出問題太多了,系統正常運行狀態下還好點,如果單片機設備頻繁上下電問題就特別多,而且好像沒有太好的解決方法。
2、通訊雙方的協議是否不匹配?波特率不說了,還有比如是否都是1個起始位+8個數據位+1個停止位,二者應一致。
3、PC機一端問題。這種可能性不大,如果使用的是串口調試助手之類的軟體就更不會有問題。
4、單片機一端軟體可能有問題。而且問題出在接收時的可能性較大。具體的:
a、在軟體流程中是否有對REN控制位修改的指令?如果有需要檢查當REN=0時的相關語句。
b、應特別關注TI的清零操作。接收時RI有效後將數據讀入內存、清RI標志,即可退出接收操作;而發送時【最後1個位元組送入SBUF後,發送操作並未完成】,【必須等待這次發送完成後TI置位,然後清0】,才能根本上保證下次操作的正確性的情況。
c、如果串口收發未使用中斷方式,需要檢查主程序流程中是否有較長時間的延時程序,會不會造成數據接收遺漏的情況。以9600波特率為例,1個位元組的發送或接收需要差不多1ms的時間,延時操作如果有超過1ms的就可能會造成數據丟失。
d、其它中斷處理軟體是否會長時間佔用CPU資源,使得串口數據的接收出現數據丟失情況?串口如果採用了中斷,其中斷級別是否是高級別?
5、設備運行環境。是否有外部強電磁干擾?比如電機的起停。處理方法就說不清了。
『伍』 關於單片機串口接收的問題
哈哈,這簡單!如果是單片機串口接收,當接收到數據之後,硬體會自動將數據存入SBUF,然後置位RI
開啟中斷,進入中斷服務程序,如果在中斷中不復位RI,退出中斷程序後,下次再接收到
新的數據後就不會再次觸發中斷。
『陸』 單片機串口調試問題
用串口調試助手的話,有一個「十六進制接收」和「十六進制發送」的選項,你打上勾,就可以看到你用「a
=
9」發送的十六進制數9了,否則串口調試助手會按ASC碼來顯示,0x9的ASC碼是顯示不出來任何東西的。
你用「a='9'」發送的十六進制數是0x39,串口調試助手按ASC碼來顯示就是數字元號9。。
『柒』 51單片機串口通信問題1
第一,要進入中斷服務程序必然是發生了相應的中斷,void ser() inturrupt 4是串口中斷服務程序,ES=1是開啟串口中斷,所以只有當串口接收或發送數據成功後才進入中斷服務程序。定時器中斷沒有開啟,所以定時器溢出時不會產生中斷,況且也沒有相應的中斷服務程序供它使用。定時器裝載初值是為了設定串口通訊速率。
第二,串口接收到數據產生中斷這個就是硬體層面的問題,寫軟體暫時可以不用考慮這個問題。至於誰發送給單片機的數據就要看單片機串口和誰連接的了,SUBF中肯定是你串口接收到的數據,此數據表示什麼就要看你通訊協議里是怎麼規定的了。
『捌』 單片機和串口設備通訊設計時要注意的幾個問題
1、不要忘了把兩個單片機的地也連上,因為這是單端信號,必須連地。同時信號線不要超過1 米(如果你使用3V的電壓,還要短些)。 2、首先,你要設定一個主機,可以主動發送信號,比如發送『?』,然後從機接到信號後返回'>',便可實現握手,隨後可以實現通信。這種握手模式是很多單片機在串列編程中使用了,可以拿來參考。 最後,不要忘了使能SCON中的 REN位,主機和從機的波特率和格式一定要一致。實驗時候先從較低的波特率試驗,比如2400-9600。
『玖』 PC機與單片機之間的串口通信的程序
http://hi..com/bluebasket/blog/item/835033097c7117ab2fddd46f.html
Keil軟體模擬的串口調試技巧
在單片機系統中,串口(UART,通用非同步收發介面)是一個非常重要的組成部分。通常使用單片機串口通過RS232/RS485電平轉換晶元與上位機連接,以進行上位機與下位機的數據交換、參數設置、組成網路以及各種外部設備的連接等。RS232/RS485串列介面匯流排具有成本低、簡單可靠、容易使用等特點,加上其歷史悠久,所以目前應用仍然非常廣泛;特別對於數據量不是很大的場合,串口通信仍然是很好的選擇,有著廣闊的使用前景。 在單片機編程中,串口佔了很重要的地位。傳統方式串口程序的調試,往往是利用專用的單片機硬體模擬器。在編寫好程序後,利用模擬器來設置斷點,觀察變數和程序的流程,逐步對程序進行調試,修正錯誤。使用硬體模擬器的確是很有效的方法,但是也有一些缺點:
很多模擬器不能做到完全硬體模擬,因而會造成模擬時正常,而實際運行時出現錯誤的情況;也有模擬不能通過,但是實際運行正常的情況。
對於一些較新的晶元或者是表面貼裝的晶元,要麼沒有合適的模擬器或模擬頭;要麼就是硬體模擬器非常昂貴,且不容易買到。
有時由於設備內部結構空間的限制,模擬頭不方便接入。
有的模擬器屬
於簡單的在線模擬型,模擬時有很多限制。例如速度不高,實時性或穩定性不好,對斷點有限制等,造成模擬起來不太方便。
1 調試前的准備工作
下面介紹一種利用Keil的軟體模擬功能來實現51單片機串口調試用戶程序的方法。使用這種方法,無需任何硬體模擬器,甚至都不需要用戶電路板。所需的只是:
① 硬體。1台普通計算機(需要帶有2個標准串口)和1根串口線(兩頭都是母頭,連線關系如圖1所示)。
② 串口軟體可以是自己編寫的專用調試或上下位機通信軟體,也可以是通用的串口軟體(如串口助手、串口調試等),主要用來收發數據。如果沒有合適的串口調試軟體,則可使用筆者編寫的一個免費的串口小工具TurboCom。除了與其他軟體一樣的數據收發功能外,它還有定時輪流發送自定義數據幀和自動應答(接收到指定數據幀後,自動返回相應的數據幀)這兩個很有用的功能,特別適合於老化測試。
如果沒有串口線,用虛擬串口可以把物理通道連同,在網上下個這樣的軟體就OK了。
2 基本調試命令介紹
這個串口調試方法主要是利用了Keil強大的軟體模擬功能。在新版本(高於6.0)的Keil軟體中,增強了軟體的模擬能力,可以利用軟體模擬更多的單片機功能。在這些功能中,其中有一個很重要的功能就是利用計算機的串口來模擬單片機的串口(這不同於很多軟體在模擬時使用的激勵文件方式,可以直接與其他串口進行通信,更加方便、靈活)。首先要介紹模擬時需要使用的兩個命令:ASSIGN和MODE。
2.1 ASSIGN命令
將單片機的串口綁定到計算機的串口。基本使用方式為:
ASSIGN channeloutreg
其中: channel代表計算機的串口,可以是COM1、COM2、COM3或COM4;而inreg和outreg代表單片機的串口。對於只有一個串口的普通單片機,即SIN和SOUT;對於有兩個或者多個串口的單片機,即SnIN和SnOUT(n=0,1,…即單片機的串口號)。
圖1 串口連線示意圖
例如:
ASSIGN COM1SOUT
將計算機的串口1綁定到單片機的串口(針對只有一個串口的單片機)。
ASSIGN COM2S0OUT
將計算機的串口2綁定到單片機的串口0(針對有多個串口的單片機,注意串口號的位置)。
需要注意的是,參數的括弧是不能省略的,而outreg則是沒有括弧的。
2.2 MODE命令
設置被綁定計算機串口的參數。基本使用方式為:
MODE COMx baudrate, parity, databits, stopbits
其中: COMx(x = 1,2,…)代表計算機的串口號;baudrate代表串口的波特率;parity代表校驗方式;databits代表數據位長度;stopbits代錶停止位長度。
例如:
MODE COM1 9600, n, 8, 1
設置串口1。波特率為9 600,無校驗位,8位數據,1位停止位。
MODE COM2 19200, 1, 8, 1
設置串口2。波特率為19 200,奇校驗,8位數據,1位停止位。
使用以上兩個命令,就能夠將計算機的串口模擬成單片機的串口了。在進行軟體模擬時,所有發送到被綁定的計算機串口上的數據都會轉發到Keil模擬的單片機串口上,用戶程序可以通過中斷處理程序或查詢方式接收到這些數據;同樣,單片機程序中發送到單片機串口上的數據也會通過被綁定的計算機串口發送出來,可以被其他軟體所接收。利用這個特點,就可以方便地模擬、調試單片機的串口部分程序。要注意的是,這兩個命令需要一起使用。
2.3 模擬步驟
首先,用串口線將計算機的兩個串口連接起來(或者是兩台計算機上的兩個串口)。這兩個串口一個用來模擬單片機串口,另一個給調試程序使用。這個由用戶自己分配,沒有特殊要求。
其次,編寫好用戶程序,並編譯通過。
然後,設置工程文件(Project)的相關參數,如圖2和圖3所示。主要是選擇軟體模擬模式(Use Simulator)以及晶振參數。
圖2 模擬參數設置
為了不必每次進入模擬狀態後,都需要輸入串口參數設置命令,可以建立一個初始化文件。初始化文件是一個普通的文本文件,內容就是模擬時需要的命令,按照順序一行輸入一條。如圖2所示,建立了一個debug.ini的初始化文件。這樣,當每次進入模擬調試狀態時,Keil就會自動載入 debug.ini的內容進行初始化。
圖3 晶振參數設置
為了正確
模擬串口,在軟體模擬調試時,在用戶的Keil工程文件的屬性中,還需要設置實際使用的晶振頻率。這個參數非常重要,直接影響通信的波特率,可以按照實際使用的參數進行設置。要注意,這個參數的單位是MHz。
設置好參數後,就可以進行模擬了。單擊工具欄的圖標按此在新窗口瀏覽圖片進入Debug(模擬調試)狀態,在Output window窗口中的command文本框(一般是在左下角)中輸入上面介紹的命令。例如,將PC機的串口1設置為單片機的串口:
mode com1 9600,0,8,1
assign com1 Sout
然後設置斷點,一般是在關鍵地方或與串口相關聯的地方設置。再單擊圖標運行(Run)用戶程序,使用戶程序運轉起來(不然是接收不到串口數據的)。這時再使用串口調試軟體或用戶調試軟體,發送通信命令或者數據包,看用戶程序是否進入斷點,以及相關的變數是否正確。還可以有意發送帶有錯誤數據的數據包,以觀察用戶程序的異常處理部分是否正常。一旦發現程序中的錯誤,可以馬上停止模擬調試,立即修改代碼,然後再次重復上面的步驟進行模擬。因為不需要與用戶目標板聯機,也不用下載代碼到用戶板上,所以速度非常高。以上這些步驟和使用硬體模擬器的基本一樣,只不過現在使用的是軟體模擬。
需要注意的是:模擬時單片機串口實際的波特率由MODE命令來指定,單片機程序中的TMOD、SCON等參數是不影響串口模擬狀態的(也就是說這些參數不影響模擬的波特率,即使它們是錯誤的)。但是中斷的使能位(如ES、EA等)還是起作用的,如果ES或EA被禁止,那麼就不會進入串口中斷。
因為這種方法是利用計算機的串口來模擬單片機的串口,而模擬是通過Keil軟體來轉換串口上的數據,不是直接轉發數據的,所以在實際模擬時,處理速度會比實際單片機運行時稍微低一點。比方說模擬狀態時1 s只能發送/接收10個數據幀,但在單片機硬體上運行時可能1 s就可以接收/發送50個數據幀。這與使用的計算機的速度有關,但對模擬來說,是沒有任何影響的。
對於多串口的單片機,從理論上來說,可以一次綁定多個串口,只要計算機有足夠多的串口。基本上,使用這種方法需要佔用計算機的串口數量是單片機綁定串口的2倍。一個串口被Keil佔用,用來模擬單片機的串口;另外一個串口被計算機佔用,用來給單片機的串口收發數據。
3 小結
這里介紹的方法對C51和匯編語言都是適合的。它最大的好處就是簡單、方便,容易使用,不需要使用任何電路,也沒有特殊的要求;甚至可以在硬體電路製作好之前就將串口部分的程序編寫、調試完畢。筆者使用這種方法已經很長時間了,事實證明這種方法確實非常有效。其實對於51單片機,Keil的模擬功能實在是太強大了,只要充分掌握其特點,能夠熟練利用它,就可以解決工作中的大部分問題。很多工作都可以使用軟體模擬來完成,根本無需任何硬體模擬器;只有一些新的外部器件的時序、介面的調試才有可能需要用到硬體模擬器。目前介紹Keil軟體模擬這方面的參考書籍很少,有些講的還是老版本的用法,不過沒有關系,Keil的幫助文件寫得很詳細、很清楚,只要認真看明白就會使用了。使用熟練後,就會發現Keil的功能相當強。
對於串口編程,51單片機有Keil這個功能強大的開發軟體,給我們帶來了極大的便利;而在其他單片機軟體的開發中,目前還沒有這么強大的開發工具和方便的調試手段。這里有個變通的辦法,就是可以先在Keil中編寫並調試好串口程序,然後將程序移植到其他單片機平台中(筆者在PIC18單片機開發中就使用了這種方法,收到了很好的效果。當然這是指在使用C語言開發單片機程序時,匯編語言是沒有可移植性的)。至於如何能夠減小程序移植的工作量,使得程序具有更好的通用性,以最小的代價就可以平滑地移植到其他單片機平台上,也是一個非常值得探討的問題。
『拾』 單片機串口問題
首先,PC發給串口"hhsbhh"字元串,其實是一個一個字元發送的。其次,單片機收到並保存到緩存區時也是一個一個字元來接收和保存的。那麼再提取出來時,自然是可以一個一個字元進行提取的了;但具體的就看你有什麼別的要求沒有,如是按原來順序提取,還是間隔一個提取等等;