串口通訊RS232C詳細(xì)說明_第1頁
串口通訊RS232C詳細(xì)說明_第2頁
串口通訊RS232C詳細(xì)說明_第3頁
串口通訊RS232C詳細(xì)說明_第4頁
串口通訊RS232C詳細(xì)說明_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

串口通訊RS232C詳細(xì)說明串口通訊—RS-232-C詳解(一)

2003-4-19

電子工程師網(wǎng)站串行通信接口標(biāo)準(zhǔn)經(jīng)過使用和發(fā)展,目前已經(jīng)有幾種。但都是在RS-232標(biāo)準(zhǔn)的基礎(chǔ)上經(jīng)過改進(jìn)而形成的。所以,以RS-232C為主來討論。RS-323C標(biāo)準(zhǔn)是美國EIA(電子工業(yè)聯(lián)合會)與BELL等公司一起開發(fā)的1969年公布的通信協(xié)議。它適合于數(shù)據(jù)傳輸速率在0~20000b/s范圍內(nèi)的通信。這個標(biāo)準(zhǔn)對串行通信接口的有關(guān)問題,如信號線功能、電器特性都作了明確規(guī)定。由于通行設(shè)備廠商都生產(chǎn)與RS-232C制式兼容的通信設(shè)備,因此,它作為一種標(biāo)準(zhǔn),目前已在微機(jī)通信接口中廣泛采用。在討論RS-232C接口標(biāo)準(zhǔn)的內(nèi)容之前,先說明兩點(diǎn):首先,RS-232-C標(biāo)準(zhǔn)最初是遠(yuǎn)程通信連接數(shù)據(jù)終端設(shè)備DTE(DataTerminalEquipment)與數(shù)據(jù)通信設(shè)備DCE(DataCommunicationEquipment)而制定的。因此這個標(biāo)準(zhǔn)的制定,并未考慮計算機(jī)系統(tǒng)的應(yīng)用要求。但目前它又廣泛地被借來用于計算機(jī)(更準(zhǔn)確的說,是計算機(jī)接口)與終端或外設(shè)之間的近端連接標(biāo)準(zhǔn)。顯然,這個標(biāo)準(zhǔn)的有些規(guī)定及和計算機(jī)系統(tǒng)是不一致的,甚至是相矛盾的。有了對這種背景的了解,我們對RS-232C標(biāo)準(zhǔn)與計算機(jī)不兼容的地方就不難理解了其次,RS-232C標(biāo)準(zhǔn)中所提到的“發(fā)送”和“接收”,都是站在DTE立場上,而不是站在DCE的立場來定義的。由于在計算機(jī)系統(tǒng)中,往往是CPU和I/O設(shè)備之間傳送信息,兩者都是DTE,因此雙方都能發(fā)送和接收。一、RS-232-CRS-232C標(biāo)準(zhǔn)(協(xié)議)的全稱是EIA-RS-232C標(biāo)準(zhǔn),其中EIA(ElectronicIndustryAssociation)代表美國電子工業(yè)協(xié)會,RS(ecommededstandard)代表推薦標(biāo)準(zhǔn),232是標(biāo)識號,C代表RS232的最新一次修改(1969),在這之前,有RS232B、RS232A。。它規(guī)定連接電纜和機(jī)械、電氣特性、信號功能及傳送過程。常用物理標(biāo)準(zhǔn)還有有EIA�RS-232-C、EIA�RS-422-A、EIA�RS-423A、EIA�RS-485。這里只介紹EIA�RS-232-C(簡稱232,RS232)。例如,目前在IBMPC機(jī)上的COM1、COM2接口,就是RS-232C接口。1.電氣特性EIA-RS-232C對電器特性、邏輯電平和各種信號線功能都作了規(guī)定。在TxD和RxD上:邏輯1(MARK)=-3V~-15V

邏輯0(SPACE)=+3~+15V

在RTS、CTS、DSR、DTR和DCD等控制線上:

信號有效(接通,ON狀態(tài),正電壓)=+3V~+15V

信號無效(斷開,OFF狀態(tài),負(fù)電壓)=-3V~-15V

圖22、、連接器的機(jī)械特性:連接器:由于RS-232C并未定義連接器的物理特性,因此,出現(xiàn)了DB-25、DB-15和DB-9各種類型的連接器,其引腳的定義也各不相同。下面分別介紹兩種連接器。(1)DB-25:PC和XT機(jī)采用DB-25型連接器。DB-25連接器定義了25根信號線,分為4組:①異步通信的9個電壓信號(含信號地SG)2,3,4,5,6,7,8,20,22②20mA電流環(huán)信號9個(12,13,14,15,16,17,19,23,24)③空6個(9,10,11,18,21,25)④保護(hù)地(PE)1個,作為設(shè)備接地端(1腳)DB-25型連接器的外形及信號線分配如圖3所示。注意,20mA電流環(huán)信號僅IBMPC和IBMPC/XT機(jī)提供,至AT機(jī)及以后,已不支持。圖3(2)DB-9連接器在AT機(jī)及以后,不支持20mA電流環(huán)接口,使用DB-9連接器,作為提供多功能I/O卡或主板上COM1和COM2兩個串行接口的連接器。它只提供異步通信的9個信號。DB-25型連接器的引腳分配與DB-25型引腳信號完全不同。因此,若與配接DB-25型連接器的DCE設(shè)備連接,必須使用專門的電纜線。電纜長度:在通信速率低于20kb/s時,RS-232C所直接連接的最大物理距離為15m(50英尺)。最大直接傳輸距離說明:RS-232C標(biāo)準(zhǔn)規(guī)定,若不使用MODEM,在碼元畸變小于4%的情況下,DTE和DCE之間最大傳輸距離為15m(50英尺)??梢娺@個最大的距離是在碼元畸變小于4%的前提下給出的。為了保證碼元畸變小于4%的要求,接口標(biāo)準(zhǔn)在電氣特性中規(guī)定,驅(qū)動器的負(fù)載電容應(yīng)小于2500pF。3、RS-232C的接口信號RS-232C規(guī)標(biāo)準(zhǔn)接口有25條線,4條數(shù)據(jù)線、11條控制線、3條定時線、7條備用和未定義線,常用的只有9根,它們是(1)聯(lián)絡(luò)控制信號線:數(shù)據(jù)裝置準(zhǔn)備好(Datasetready-DSR)——有效時(ON)狀態(tài),表明MODEM處于可以使用的狀態(tài)。數(shù)據(jù)終端準(zhǔn)備好(Datasetready-DTR)——有效時(ON)狀態(tài),表明數(shù)據(jù)終端可以使用。這兩個信號有時連到電源上,一上電就立即有效。這兩個設(shè)備狀態(tài)信號有效,只表示設(shè)備本身可用,并不說明通信鏈路可以開始進(jìn)行通信了,能否開始進(jìn)行通信要由下面的控制信號決定。請求發(fā)送(Requesttosend-RTS)——用來表示DTE請求DCE發(fā)送數(shù)據(jù),即當(dāng)終端要發(fā)送數(shù)據(jù)時,使該信號有效(ON狀態(tài)),向MODEM請求發(fā)送。它用來控制MODEM是否要進(jìn)入發(fā)送狀態(tài)。允許發(fā)送(Cleartosend-CTS)——用來表示DCE準(zhǔn)備好接收DTE發(fā)來的數(shù)據(jù),是對請求發(fā)送信號RTS的響應(yīng)信號。當(dāng)MODEM已準(zhǔn)備好接收終端傳來的數(shù)據(jù),并向前發(fā)送時,使該信號有效,通知終端開始沿發(fā)送數(shù)據(jù)線TxD發(fā)送數(shù)據(jù)。這對RTS/CTS請求應(yīng)答聯(lián)絡(luò)信號是用于半雙工MODEM系統(tǒng)中發(fā)送方式和接收方式之間的切換。在全雙工系統(tǒng)中作發(fā)送方式和接收方式之間的切換。在全雙工系統(tǒng)中,因配置雙向通道,故不需要RTS/CTS聯(lián)絡(luò)信號,使其變高。接收線信號檢出(ReceivedLinedetection-RLSD)——用來表示DCE已接通通信鏈路,告知DTE準(zhǔn)備接收數(shù)據(jù)。當(dāng)本地的MODEM收到由通信鏈路另一端(遠(yuǎn)地)的MODEM送來的載波信號時,使RLSD信號有效,通知終端準(zhǔn)備接收,并且由MODEM將接收下來的載波信號解調(diào)成數(shù)字兩數(shù)據(jù)后,沿接收數(shù)據(jù)線RxD送到終端。此線也叫做數(shù)據(jù)載波檢出(DataCarrierdectection-DCD)線。振鈴指示(Ringing-RI)——當(dāng)MODEM收到交換臺送來的振鈴呼叫信號時,使該信號有效(ON狀態(tài)),通知終端,已被呼叫。(2)數(shù)據(jù)發(fā)送與接收線:發(fā)送數(shù)據(jù)(Transmitteddata-TxD)——通過TxD終端將串行數(shù)據(jù)發(fā)送到MODEM,(DTE→DCE)。接收數(shù)據(jù)(Receiveddata-RxD)——通過RxD線終端接收從MODEM發(fā)來的串行數(shù)據(jù),(DCE→DTE)。(3)地線有兩根線SG、PG——信號地和保護(hù)地信號線,無方向。上述控制信號線何時有效,何時無效的順序表示了接口信號的傳送過程。例如,只有當(dāng)DSR和DTR都處于有效(ON)狀態(tài)時,才能在DTE和DCE之間進(jìn)行傳送操作。若DTE要發(fā)送數(shù)據(jù),則預(yù)先將DTR線置成有效(ON)狀態(tài),等CTS線上收到有效(ON)狀態(tài)的回答后,才能在TxD線上發(fā)送串行數(shù)據(jù)。這種順序的規(guī)定對半雙工的通信線路特別有用,因?yàn)榘腚p工的通信才能確定DCE已由接收方向改為發(fā)送方向,這時線路才能開始發(fā)送。2個數(shù)據(jù)信號:發(fā)送TXD;接收RXD。1個信號地線:SG。6個控制信號:DSR��數(shù)傳機(jī)(即modem)準(zhǔn)備好,DataSetReady.DTR��數(shù)據(jù)終端(DTE,即微機(jī)接口電路,如Intel8250/8251,16550)準(zhǔn)備好,DataTerminalReady。RTS��DTE請求DCE發(fā)送(RequestToSend)。CTS��DCE允許DTE發(fā)送(ClearToSend),該信號是對RTS信號的回答。DCD��數(shù)據(jù)載波檢出,DataCarrierDetection當(dāng)本地DCE設(shè)備(Modem)收到對方的DCE設(shè)備送來的載波信號時,使DCD有效,通知DTE準(zhǔn)備接收,并且由DCE將接收到的載波信號解調(diào)為數(shù)字信號,經(jīng)RXD線送給DTE。RI��振鈴信號Ringing當(dāng)DCE收到交換機(jī)送來的振鈴呼叫信號時,使該信號有效,通知DTE已被呼叫。

串口通訊—RS-232-C詳解(二)

2003-4-19

電子工程師網(wǎng)站一、遠(yuǎn)距離通信第1和第2中情況是屬于遠(yuǎn)距離通信(傳輸距離大于15m的通信)的例子,故一般要加調(diào)制解調(diào)器MODEM,因此使用的信號線較多。注意:在以下各圖中,DTE信號為RS-232-C信號,DTE與計算機(jī)間的電平轉(zhuǎn)換電路未畫出。1、采用Modem(DCE)和電話網(wǎng)通信時的信號連接:若在雙方MODEM之間采用普通電話交換線進(jìn)行通信,除了需要2~8號信號線外還要增加RI(22號)和DTR(20號)兩個信號線進(jìn)行聯(lián)絡(luò),如圖1所示。圖1DSR、DTR:數(shù)傳機(jī)(DCE)準(zhǔn)備好、數(shù)據(jù)終端(DTE)準(zhǔn)備好,只表示設(shè)備本身可用。首先,通過電話機(jī)拔號呼叫對方,電話交換臺向?qū)Ψ桨l(fā)出拔號呼叫信號,當(dāng)對方DCE收到該信號后,使RI(振鈴信號)有效,通知DTE,已被呼叫。當(dāng)對方“摘機(jī)”后,兩方建立了通信鏈路。若計算機(jī)要發(fā)送數(shù)據(jù)至對方,首先通過接口電路(DTE)發(fā)出RTS(請求發(fā)送)信號。此時,若DCE(Modem)允許傳送,則向DTE回答CTS(允許發(fā)送)信號。一般可直接將RTS/CTS接高電平,即只要通信鏈路已建立,就可傳送信號。(RTS/CTS可只用于半雙工系統(tǒng)中作發(fā)送方式和接收方式的切換。當(dāng)DTE獲得CTS信號后,通過TXD線向DCE發(fā)出串行信號,DCE(Modem)將這些數(shù)字信號調(diào)制成模擬信號(又稱載波信號),傳向?qū)Ψ?。計算機(jī)向DTE“數(shù)據(jù)輸出寄存器”傳送新的數(shù)據(jù)前,應(yīng)檢查Modem狀態(tài)和數(shù)據(jù)輸出寄存器為空。當(dāng)對方的DCE收到載波信號后,向?qū)Ψ降腄TE發(fā)出DCD信號(數(shù)據(jù)載波檢出),通知其DTE準(zhǔn)備接收,同時,將載波信號解調(diào)為數(shù)據(jù)信號,從RXD線上送給DTE,DTE通過串行接收移位寄存器對接收到的位流進(jìn)行移位,當(dāng)收到1個字符的全部位流后,把該字符的數(shù)據(jù)位送到數(shù)據(jù)輸入寄存器,CPU可以從數(shù)據(jù)輸入寄存器讀取字符。2、采用專用電話線通信:在通信雙方的MODEM之間采用電話線進(jìn)行通信,則只要使用2~8號信號線進(jìn)行聯(lián)絡(luò)與控制。不需要電話機(jī)、振鈴信號RI和DTR信號,其信號線的連接如圖2那樣。圖2二、近距離通信:當(dāng)通信距離較近時,可不需要Modem,通信雙方可以直接連接,這種情況下,只需使用少數(shù)幾根信號線。最簡單的情況,在通信中根本不需要RS-232C的控制聯(lián)絡(luò)信號,只需三根線(發(fā)送線、接收線、信號地線)便可實(shí)現(xiàn)全雙工異步串行通信,即是這里要討論的第一種情況。無Modem時,最大通信距離按如下方式計算:RS-232C標(biāo)準(zhǔn)規(guī)定:當(dāng)誤碼率小于4%時,要求導(dǎo)線的電容值應(yīng)小于2500PF。對于普通導(dǎo)線,其電容值約為170PF/M。則允許距離L=2500PF/(170PF/M)=15M這一距離的計算,是偏于保守的,實(shí)際應(yīng)用中,當(dāng)使用9600bps,普通雙絞屏蔽線時,距離可達(dá)30~35米。1、零Modem的最簡連線(3線制)圖3是零MODEM方式的最簡單連接(即三線連接),圖中的2號線與3號線交叉連接是因?yàn)樵谥边B方式時,把通信雙方都當(dāng)作數(shù)據(jù)終端設(shè)備看待,雙方都可發(fā)也可收。在這種方式下,通信雙方的任何一方,只要請求發(fā)送RTS有效和數(shù)據(jù)終端準(zhǔn)備好DTR有效就能開始發(fā)送和接收。圖3(1)RTS與CTS互聯(lián):只要請求發(fā)送,立即得到允許(2)DTR與DSR互聯(lián):只要本端準(zhǔn)備好,認(rèn)為本端立即可以接收(DSR、數(shù)傳機(jī)準(zhǔn)備好)。2、零Modem標(biāo)準(zhǔn)連接:如果想在直接連接時,而又考慮到RS-232C的聯(lián)絡(luò)控制信號,則采用零MODEM方式的標(biāo)準(zhǔn)連接方法,其通信雙方信號線安排如下1-2-3-4-5順序所演示的那樣。無Modem的標(biāo)準(zhǔn)聯(lián)線(7線制)如圖所示:從中可以看出,RS-232C接口標(biāo)準(zhǔn)定義的所有信號線都用到了,并且是按照DTE和DCE之間信息交換協(xié)議的要求進(jìn)行連接的,只不過是把DTE自己發(fā)出的信號線送過來,當(dāng)作對方DCE發(fā)來的信號,因此,又把這種連接稱為雙叉環(huán)回接口。雙方的握手信號關(guān)系如下(注:甲方乙方并未在圖中標(biāo)出):(1)當(dāng)甲方的DTE準(zhǔn)備好,發(fā)出DTR信號,該信號直接聯(lián)至乙方的RI(振鈴信號)和DSR(數(shù)傳機(jī)準(zhǔn)備好)。即只要甲方準(zhǔn)備好,乙方立即產(chǎn)生呼叫(RI)有效,并同時準(zhǔn)備好(DSR)。盡管此時乙方并不存在DCE(數(shù)傳機(jī))。(2)甲方的RTS和CTS相連,并與乙方的DCD互連。即:一旦甲方請求發(fā)送(RTS),便立即得到允許(CTS),同時,使乙方的DCD有效,即檢測到載波信號。(3)甲方的TXD與乙方的RXD相連,一發(fā)一收。

1

2

3

4

RS-232接口定義及連線RS-232接口又稱之為RS-232口、串口、異步口或一個COM(通信)口。"RS-232"是其最明確的名稱。在計算機(jī)世界中,大量的接口是串口或異步口,但并不一定符合RS-232標(biāo)準(zhǔn),但我們也通常認(rèn)為它是RS-232口。嚴(yán)格地講RS-232接口是DTE(數(shù)據(jù)終端設(shè)備)和DCE(數(shù)據(jù)通信設(shè)備)之間的一個接口,DTE包括計算機(jī)、終端、串口打印機(jī)等設(shè)備。DCE通常只有調(diào)制解調(diào)器(MODEM)和某些交換機(jī)COM口是DCE。標(biāo)準(zhǔn)指出DTE應(yīng)該擁有一個插頭(針輸出),DCE擁有一個插座(孔輸出)。這經(jīng)常被制造商忽視(如:WYSE終端就是孔輸出DTE串口)但影響不大,只要搞清楚DCE、DTE就行了,然后按照標(biāo)準(zhǔn)接線圖接線就不會錯了。(DTE、DCE引腳定義相同)RS-232接口引腳定義

串口、并口連接線大全在電腦的使用中往往會遇到各種各樣的連接線。這些連接線外觀上好像都差不多,但內(nèi)部結(jié)構(gòu)完全不同并且不能混用。如果在使用中這些連接線壞了,往往很多使用者都不知道應(yīng)該怎么辦,下面就給出這些常見的連接線的連線方法以便于修理或查找故障。在介紹之前先對一些市場常用名詞做出解釋。現(xiàn)在所有的接頭都可以分為公頭和母頭兩大類。公頭:泛指所有針式的接頭。母頭:泛指所有插槽式的接頭。所有接頭的針腳有統(tǒng)一規(guī)定,在接頭上都印好了的,連接時要注意查看。在接線時沒有提及的針腳都懸空不管。下面給出串口,并口各針腳功能表以供高級用戶維護(hù)電纜或接頭時使用。

串口中斷服務(wù)函數(shù)集//串口中斷服務(wù)程序,僅需做簡單調(diào)用即可完成串口輸入輸出的處理

//出入均設(shè)有緩沖區(qū),大小可任意設(shè)置。

//可供使用的函數(shù)名:

//chargetbyte(void);從接收緩沖區(qū)取一個byte,如不想等待則在調(diào)用前檢測inbufsign是否為1。

//getline(charidata*line,unsignedcharn);獲取一行數(shù)據(jù)回車結(jié)束,必須定義最大輸入字符數(shù)

//putbyte(charc);放入一個字節(jié)到發(fā)送緩沖區(qū)

//putbytes(unsignedchar*outplace,j);放一串?dāng)?shù)據(jù)到發(fā)送緩沖區(qū),自定義長度

//putstring(unsignedcharcode*puts);發(fā)送一個定義在程序存儲區(qū)的字符串到串口

//puthex(unsignedcharc);發(fā)送一個字節(jié)的hex碼,分成兩個字節(jié)發(fā)。

//putchar(ucharc,ucharj);輸出一個無符號字符數(shù)的十進(jìn)制表示,必須標(biāo)示小數(shù)點(diǎn)的位置,自動刪除前面無用的零

//putint(uintui,ucharj);輸出一個無符號整型數(shù)的十進(jìn)制表示,必須標(biāo)示小數(shù)點(diǎn)的位置,自動刪除前面無用的零

//delay(unsignedchard);延時nx100ns

//putinbuf(ucharc);人工輸入一個字符到輸入緩沖區(qū)

//CR;發(fā)送一個回車換行

//*************************************************************************

#include<w77e58.h>

#defineucharunsignedchar

#defineuintunsignedint

#defineOLEN32/*sizeofserialtransmissionbuffer*/

idataunsignedcharoutbuf[OLEN];/*storagefortransmissionbuffer*/

unsignedcharidata*outlast=outbuf;//最后由中斷傳輸出去的字節(jié)位置

unsignedcharidata*putlast=outbuf;//最后放入發(fā)送緩沖區(qū)的字節(jié)位置

#defineILEN12/*sizeofserialreceivingbuffer*/

idataunsignedcharinbuf[ILEN];

unsignedcharidata*inlast=inbuf;//最后由中斷進(jìn)入接收緩沖區(qū)的字節(jié)位置

unsignedcharidata*getlast=inbuf;//最后取走的字節(jié)位置

bitoutbufsign0;//最后一個數(shù)據(jù)覵BUF發(fā)完標(biāo)志發(fā)完=0

bitoutbufsign;//輸出緩沖區(qū)非空標(biāo)志有=1

bitinbufsign;//接收緩沖區(qū)非空標(biāo)志有=1

bitinbufful;//輸入緩沖區(qū)滿標(biāo)志滿=1

#defineCRputstring("\r\n")//CR=回車換行</P><P>//*****************************

//延時nx100ns

voiddelay(unsignedchard)//在源程序開頭定義是否用w77e58或22。1184M晶振

{unsignedcharj;

do{d--;</P><P>//110592&89c52

#ifndefcpuw77e58

#ifndefxtal221184

j=21;//k=38cpu80320100usk=21cpu8052

#else

j=42;

#endif

#else

#ifndefxtal221184

j=38;

#else

j=76;

#endif

#endif

do{j--;}while(j!=0);

}while(d!=0);

}

//*****************************

//放入一個字節(jié)到發(fā)送緩沖區(qū)</P><P>putbyte(charc)

{uchari,j;

ES=0;/*暫停串行中斷,以免數(shù)據(jù)比較時出錯?*/

//if(outlast=putlast)

while((((outlast-putlast)==2)&&(outlast>putlast))||((outlast<putlast)&&(OLEN-(putlast-outlast)==2)))

{ES=1;c++;c--;ES=0;

//i=(0-TH1);

//do{i--;j=39;do{j--;}while(j!=0);}while(i!=0);//i=39

}

*putlast=c;//放字節(jié)進(jìn)入緩沖區(qū)

putlast++;//發(fā)送緩沖區(qū)指針加一

if(putlast==outbuf+OLEN)putlast=outbuf;//指針到了頂部換到底部

outbufsign=1;

if(!outbufsign0){outbufsign0=1;TI=1;}//緩沖區(qū)開始為空置為有,啟動發(fā)送

ES=1;

}

//******************************

//放一串?dāng)?shù)據(jù)到發(fā)送緩沖區(qū)

putbytes(unsignedchar*outplace,unsignedcharj)

{inti;

for(i=0;i<j;i++)

{putbyte(*outplace);

outplace++;

}

}

//******************************

//輸出一個無符號字符數(shù)的十進(jìn)制表示,必須標(biāo)示小數(shù)點(diǎn)的位置,自動刪除前面無用的零

//例如putchar(0x32,2),輸出"4.8".

//putchar(0x32,3),輸出"0.48".

//putchar(0x32,1),輸出"48".

putchar(ucharc,ucharj)

{ucharidatafree[4];uchardatai;

i=0;

free[i++]=(c/100+0x30);

if(j==3)free[i++]='.';

free[i++]=(c%100)/10+0x30;

if(j==2)free[i++]='.';

if(j==2&&free[i-3]==0x30)free[i-3]=0x20;

free[i++]=(c%10)+0x30;

if(j==1&&free[i-3]==0x30)free[i-3]=0x20;

if(j==1&&free[i-3]==0x20&&free[i-2]==0x30)free[i-2]=0x20;

putbytes(free,i);

}</P><P>//******************************

//輸出一個無符號整型數(shù)的十進(jìn)制表示,必須標(biāo)示小數(shù)點(diǎn)的位置,自動刪除前面無用的零

putint(uintui,ucharj)

{ucharidatafree[6];

uchardatai;

i=0;

free[i++]=(ui/10000+0x30);

if(j==5)free[i++]='.';

free[i++]=((ui%10000)/1000+0x30);

if(j==4)free[i++]='.';

if(j==4&&free[i-3]==0x30)free[i-3]=0x20;

free[i++]=((ui%1000)/100+0x30);

if(j==3)free[i++]='.';

if(j==3&&free[i-4]==0x30)free[i-4]=0x20;

if(j==3&&free[i-4]==0x20&&free[i-3]==0x30)free[i-3]=0x20;

free[i++]=((ui%100)/10+0x30);

if(j==2)free[i++]='.';

if(j==2&&free[i-5]==0x30)free[i-5]=0x20;

if(j==2&&free[i-5]==0x20&&free[i-4]==0x30)free[i-4]=0x20;

if(j==2&&free[i-5]==0x20&&free[i-4]==0x20&&free[i-3]==0x30)free[i-3]=0x20;

free[i++]=(ui%10+0x30);

if(j==1&&free[i-5]==0x30)free[i-5]=0x20;

if(j==1&&free[i-5]==0x20&&free[i-4]==0x30)free[i-4]=0x20;

if(j==1&&free[i-5]==0x20&&free[i-4]==0x20&&free[i-3]==0x30)free[i-3]=0x20;

if(j==1&&free[i-5]==0x20&&free[i-4]==0x20&&free[i-3]==0x20&&free[i-2]==0x30)free[i-2]=0x20;

putbytes(free,i);

}

//***************************************

//發(fā)送一個定義在程序存儲區(qū)的字符串到串口

putstring(unsignedchar*puts)

{for(;*puts!=0;puts++)//遇到停止符0結(jié)束

putbyte(*puts);

}

//*************************************

//發(fā)送一個字節(jié)的hex碼,分成兩個字節(jié)發(fā)。

unsignedcharcodehex_[]={"0123456789ABCDEF"};

puthex(unsignedcharc)

{intch;

ch=(c>>4)&0x0f;

putbyte(hex_[ch]);

ch=c&0x0f;

putbyte(hex_[ch]);

}

//*************************************

//從接收緩沖區(qū)取一個byte,如不想等待則在調(diào)用前檢測inbufsign是否為1。

uchargetbyte(void)

{charidatac;

while(!inbufsign);//緩沖區(qū)空等待

ES=0;

c=*getlast;//取數(shù)據(jù)

getlast++;//最后取走的數(shù)據(jù)位置加一

inbufful=0;//輸入緩沖區(qū)的滿標(biāo)志清零

if(getlast==inbuf+ILEN)getlast=inbuf;//地址到頂部回到底部

if(getlast==inlast)inbufsign=0;//地址相等置接收緩沖區(qū)空空標(biāo)志,再取數(shù)前要檢該標(biāo)志

ES=1;

return(c);//取回數(shù)據(jù)

}

//*****************************************

//接收一行數(shù)據(jù),必須定義放數(shù)據(jù)串的指針位置和大小del=0x7f,backspace=0x08,cr=0x0d,lf=0x0a

voidgetline(ucharidata*line,unsignedcharn)

{unsignedcharcnt=0;//定義已接收的長度

charc;

do{

if((c=getbyte())==0x0d)c=0x00;//讀一個字節(jié),如果是回車換成結(jié)束符

if(c==0x08||c==0x7f)//BACKSPACE和DEL的處理

{if(cnt!=0)//已經(jīng)輸入退掉一個字符

{cnt--;//總數(shù)目減一

line--;//指針減一

putbyte(0x08);//屏幕回顯的處理

putbyte('');

putbyte(0x08);

}

}

else

{putbyte(*line=c);//其他字符取入,回顯

line++;//指針加一

cnt++;//總數(shù)目加一

}

}while(cnt<n-1&&c!=0x00&&c!=0x1b);//數(shù)目到了,回車或ESC停止

*line=0;//再加上停止符0

}

//****************************

//人工輸入一個字符到輸入緩沖區(qū)

putinbuf(ucharc)

{ES=0;if(!inbufful)

{*inlast=c;//放入數(shù)據(jù)

inlast++;//最后放入的位置加一

if(inlast==inbuf+ILEN)inlast=inbuf;//地址到頂部回到底部

if(inlast==getlast)inbufful=1;//接收緩沖區(qū)滿置滿標(biāo)志

inbufsign=1;

}

ES=1;

}

//*****************************************

//串口中斷處理

serial()interrupt4

{if(TI)

{TI=0

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論