嵌入式串口通信的設(shè)計(jì)_第1頁(yè)
嵌入式串口通信的設(shè)計(jì)_第2頁(yè)
嵌入式串口通信的設(shè)計(jì)_第3頁(yè)
嵌入式串口通信的設(shè)計(jì)_第4頁(yè)
嵌入式串口通信的設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩21頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、* 實(shí)踐教學(xué) *蘭州理工大學(xué)計(jì)算機(jī)與通信學(xué)院2013年春季學(xué)期嵌入式系統(tǒng)開(kāi)發(fā)技術(shù)課程設(shè)計(jì)題 目:嵌入式串口通信的設(shè)計(jì) 專業(yè)班級(jí): 通信工程三班 姓 名: 學(xué) 號(hào): 指導(dǎo)教師: 張璽君 成 績(jī): 摘 要 隨著Internet的發(fā)展和后PC時(shí)代的到來(lái),嵌入式系統(tǒng)以其可靠性強(qiáng)、體積小、專用性、成本低等特性得到日益廣泛的應(yīng)用。目前嵌入式系統(tǒng)技術(shù)已經(jīng)成為了最熱門的技術(shù)之一。與此同時(shí),一個(gè)獨(dú)立的嵌入式系統(tǒng)的功能缺陷也逐漸暴露出來(lái)。新一代嵌入計(jì)算系統(tǒng)的功能集成和應(yīng)用模式使之迅速向網(wǎng)絡(luò)化嵌入計(jì)算的方向發(fā)展,標(biāo)準(zhǔn)和統(tǒng)一的TCP/IP通信協(xié)議是獨(dú)立于任何廠家的硬件的,因此嵌入環(huán)境下的實(shí)時(shí)網(wǎng)絡(luò)通信成為嵌入計(jì)算技術(shù)研

2、究的重點(diǎn)和熱點(diǎn)。本文通過(guò)基于2410F 的嵌入式串口通信的實(shí)現(xiàn),按照嵌入式系統(tǒng)的軟、硬件結(jié)構(gòu)組成,較為詳細(xì)地介紹了串口通信的硬件電路和軟件實(shí)現(xiàn)方法。關(guān)鍵詞:嵌入式 串口通信 2410F目錄前言1一、 串口通信概述21.1 串口通信的原理21.2 串口通信的開(kāi)發(fā)工具21.2.1 CC2530功耗21.2.2 ARM簡(jiǎn)介31.2.3 Linux系統(tǒng)簡(jiǎn)介31.3 串口通信的基本任務(wù)41.4串口通信協(xié)議及實(shí)現(xiàn)4二、 RS-232C標(biāo)準(zhǔn)62.1引腳定義62.2 字符(幀)格式72.3握手協(xié)議82.4 雙機(jī)互連方式102.4.1無(wú)硬件握手情況102.4.2 DTR和DSR握手情況10三、 串口驅(qū)動(dòng)程序設(shè)計(jì)

3、123.1 串口操作需要的頭文件123.2 打開(kāi)串口123.3 串口設(shè)置123.4 串口讀寫153.5 關(guān)閉串口16四、源程流程圖18五、源程序代碼19參考文獻(xiàn)21總結(jié)22221前言嵌入式系統(tǒng)是以應(yīng)用為中心,以計(jì)算機(jī)技術(shù)為基礎(chǔ),軟硬件可定制,適用于不同應(yīng)用場(chǎng)合,對(duì)功能,可靠性,成本,體積,功耗有嚴(yán)格要求的專用計(jì)算機(jī)系統(tǒng)。它一般由嵌入式微處理器,外圍硬件設(shè)備,嵌入式操作系統(tǒng),用戶應(yīng)用程序4個(gè)部分組成。用于實(shí)現(xiàn)對(duì)其他設(shè)備的控制,監(jiān)視或管理等功能。嵌入式系統(tǒng)已經(jīng)廣泛應(yīng)用于科學(xué)研究,工業(yè)控制,軍事技術(shù),交通通信,醫(yī)療衛(wèi)生,消費(fèi)娛樂(lè)等領(lǐng)域,人們常用的手機(jī),PDA,汽車,智能家電,GPS等均是嵌入式系統(tǒng)的

4、典型代表。串口通信是簡(jiǎn)單嵌入式系統(tǒng)的一個(gè)應(yīng)用,串口通信是指外設(shè)和計(jì)算機(jī)間,通過(guò)數(shù)據(jù)信號(hào)線 、地線、控制線等,按位進(jìn)行傳輸數(shù)據(jù)的一種通訊方式。這種通信方式使用的數(shù)據(jù)線少,在遠(yuǎn)距離通信中可以節(jié)約通信成本,但其傳輸速度比并行傳輸?shù)汀R弧?串口通信概述所謂串口通信,是指外設(shè)和計(jì)算機(jī)間使用一根數(shù)據(jù)信號(hào)線(另外需要地線),數(shù)據(jù)在一根數(shù)據(jù)信號(hào)線上一位一位地進(jìn)行傳輸,每一位數(shù)據(jù)都占據(jù)一個(gè)固定的時(shí)間長(zhǎng)度。串口傳輸是二進(jìn)制代碼序列在一條信道上以位(元碼)為單位,按時(shí)間順序且按位傳輸?shù)耐ㄐ欧绞?。串行傳輸時(shí),發(fā)送端按位發(fā)送,接收端按位接受,同時(shí)還要對(duì)所傳輸?shù)奈患右源_認(rèn),所以收發(fā)雙方要采取同步措施,否則接受端將不能正確

5、區(qū)分出所傳輸?shù)臄?shù)據(jù)。串口通信不但能實(shí)現(xiàn)計(jì)算機(jī)與嵌入式開(kāi)發(fā)板之間的數(shù)據(jù)傳輸,而且還能實(shí)現(xiàn)計(jì)算機(jī)對(duì)嵌入式開(kāi)發(fā)板的控制。若采用普通單片機(jī),對(duì)外部設(shè)備的訪問(wèn)就需要利用復(fù)雜的匯編語(yǔ)言進(jìn)行編程或者使用C51自己編寫設(shè)備的初始化以及讀寫訪問(wèn)程序,這樣的過(guò)程不僅復(fù)雜,而且不利于大規(guī)模的開(kāi)發(fā)和設(shè)計(jì)。ARM 與8051 等普通單片機(jī)相比,具有開(kāi)發(fā)簡(jiǎn)單、靈活,而且性能穩(wěn)定、功能易于擴(kuò)展等一系列優(yōu)勢(shì),因而在汽車電子、手持設(shè)備、無(wú)線領(lǐng)域和航空航天等嵌入式系統(tǒng)中得到廣泛的應(yīng)用。將Linux 移植到ARM 嵌入式處理器后,可以利用操作系統(tǒng)中提供的系統(tǒng)調(diào)用把串口及其他外設(shè)當(dāng)成普通文件進(jìn)行操作,讀寫方便,因此進(jìn)行相應(yīng)開(kāi)發(fā)可以提

6、高系統(tǒng)編程效率,而且還可以簡(jiǎn)化調(diào)試的復(fù)雜程度。1.1 串口通信的原理串行端口的本質(zhì)功能是作為CPU和串行設(shè)備間的編碼轉(zhuǎn)換器。當(dāng)數(shù)從CPU經(jīng)過(guò)串行端口發(fā)送出去時(shí),字節(jié)數(shù)據(jù)轉(zhuǎn)換為串行的位。在接收數(shù)據(jù)時(shí),串行的位被轉(zhuǎn)換為字節(jié)數(shù)據(jù)。串口是系統(tǒng)資源的一部分,應(yīng)用程序要使用串口進(jìn)行通信,必須在使用之前向操作系統(tǒng)提出申請(qǐng)要求(打開(kāi)串口),通信完成后必須釋放資源(關(guān)閉串口)。1.2 串口通信的開(kāi)發(fā)工具本次開(kāi)發(fā)采用的硬件平臺(tái)是利用OURS-IOTV2-2530實(shí)驗(yàn)箱和C語(yǔ)言來(lái)實(shí)現(xiàn)本次系統(tǒng)的開(kāi)發(fā)。1.2.1 CC2530功耗CC2530使用不同的運(yùn)行模式或功耗模式以允許低功耗運(yùn)行。超低功耗是通過(guò)關(guān)閉模塊電源以避免

7、靜態(tài)功耗以及通過(guò)使用時(shí)鐘門控和關(guān)閉振蕩器來(lái)減少動(dòng)態(tài)功耗而獲得的。CC2530有4個(gè)功耗模式,被稱為PM0、PM1、PM2和PM3。PM0是激活模式而PM3具有最低功耗。 PM0:全功能模式。連接到數(shù)字內(nèi)核的電壓調(diào)整器打開(kāi)。16MHz RC振蕩器或32MHz 晶體振蕩器運(yùn)行或者它們同時(shí)運(yùn)行。32.753KHz RC振蕩器或32.768KHz 晶體振蕩器運(yùn)行。 PM1:連接到數(shù)字部分的電壓調(diào)整器打開(kāi)。16MHz RC振蕩器和32MHz 晶體振蕩器都不運(yùn)行。32.753KHz RC振蕩器或32.768KHz 晶體振蕩器運(yùn)行。在產(chǎn)生復(fù)位、外部中斷或當(dāng)睡眠定時(shí)器到期時(shí)系統(tǒng)將返回到PM0。 PM2:連接到

8、數(shù)字內(nèi)核的電壓調(diào)整器關(guān)閉。16MHz RC振蕩器和32MHz 晶體振蕩器都不運(yùn)行。32.753KHz RC振蕩器或32.768KHz 晶體振蕩器運(yùn)行。在產(chǎn)生復(fù)位、外部中斷或當(dāng)睡眠定時(shí)器到期時(shí)系統(tǒng)將返回到PM0。 PM3:連接到數(shù)字內(nèi)核的電壓調(diào)整器關(guān)閉。沒(méi)有振蕩器運(yùn)行。在產(chǎn)生復(fù)位或外部中斷時(shí)系統(tǒng)將返回到PM0。 PM0是全功能模式,在該模式下,CPU、片內(nèi)外設(shè)和RF收發(fā)器都處于激活狀態(tài),數(shù)字電壓調(diào)整器打開(kāi)。該模式也被稱為激活模式時(shí)。1.2.2 ARM簡(jiǎn)介ARM(Advanced RISC Machines),既可以認(rèn)為是一個(gè)公司的名字,也可以認(rèn)為是對(duì)一類微處理器的通稱,還可以認(rèn)為是一種技術(shù)的名字

9、。1991 年ARM 公司成立于英國(guó)劍橋,主要出售芯片設(shè)計(jì)技術(shù)的授權(quán)。目前,采用ARM 技術(shù)知識(shí)產(chǎn)權(quán)(IP)核的微處理器,即通常所說(shuō)的ARM微處理器,已遍及工業(yè)控制、消費(fèi)類電子產(chǎn)品、通信系統(tǒng)、網(wǎng)絡(luò)系統(tǒng)、無(wú)線系統(tǒng)、軍用系統(tǒng)等各類產(chǎn)品市場(chǎng),基于ARM 技術(shù)的微處理器應(yīng)用約占據(jù)了32 位RISC 微處理器70以上的市場(chǎng)份額,ARM 技術(shù)正在逐步滲入到我們生活的各個(gè)方面。ARM 公司是專門從事基于RISC 技術(shù)芯片設(shè)計(jì)開(kāi)發(fā)的公司,作為知識(shí)產(chǎn)權(quán)供應(yīng)商,本身不直接從事芯片生產(chǎn),靠轉(zhuǎn)讓設(shè)計(jì)許可,由合作公司生產(chǎn)各具特色的芯片,世界各大半導(dǎo)體生產(chǎn)商從ARM 公司購(gòu)買其ARM 微處理器核,根據(jù)各自不同的應(yīng)用領(lǐng)域,

10、加入適當(dāng)?shù)耐鈬娐?,從而形成自己的ARM 微處理器芯片進(jìn)入市場(chǎng)。目前全世界有幾十家大的半導(dǎo)體公司都使用ARM 公司的授權(quán),因此既使得ARM 技術(shù)獲得更多的第三方工具、制造、軟件的支持,又使整個(gè)系統(tǒng)成本降低,使產(chǎn)品更容易進(jìn)入市場(chǎng)并被消費(fèi)者所接受,更具有競(jìng)爭(zhēng)力。ARM 微處理器一般具有如下特點(diǎn): (1)體積小、低功耗、低成本、高性能; (2)支持 Thumb(16 位)/ARM(32 位)雙指令集,能很好的兼容8/16 位器件;(3)大量使用寄存器,指令執(zhí)行速度更快;(4)大多數(shù)數(shù)據(jù)操作都在寄存器中完成;(5)尋址方式靈活簡(jiǎn)單,執(zhí)行效率高;(6)指令長(zhǎng)度固定。1.2.3 Linux系統(tǒng)簡(jiǎn)介L(zhǎng)inu

11、x是一類Unix計(jì)算機(jī)操作系統(tǒng)的統(tǒng)稱。Linux操作系統(tǒng)也是自由軟件和開(kāi)放源代碼發(fā)展中最著名的例子。Linux 一般有四個(gè)主要部分:內(nèi)核、Shell、文件結(jié)構(gòu)和實(shí)用工具。(1)Linux 內(nèi)核內(nèi)核是系統(tǒng)的心臟,是運(yùn)行程序和管理像磁盤和打印機(jī)等硬件設(shè)備的核心程序。它從用戶那里接受命令并把命令送給內(nèi)核去執(zhí)行。(2)Linux ShellShell 是系統(tǒng)的用戶界面,提供了用戶與內(nèi)核進(jìn)行交互操作的一種接口。它接收用戶輸入的命令并把它送入內(nèi)核去執(zhí)行。實(shí)際上Shell 是一個(gè)命令解釋器,它解釋由用戶輸入的命令并且把它們送到內(nèi)核。不僅如此,Shell 有自己的編程語(yǔ)言用于對(duì)命令的編輯,它允許用戶編寫由sh

12、ell 命令組成的程序。Shell 編程語(yǔ)言具有普通編程語(yǔ)言的很多特點(diǎn),比如它也有循環(huán)結(jié)構(gòu)和分支控制結(jié)構(gòu)等,用這種編程語(yǔ)言編寫的Shell 程序與其他應(yīng)用程序具有同樣的效果。(3)Linux 文件結(jié)構(gòu)文件結(jié)構(gòu)是文件存放在磁盤等存儲(chǔ)設(shè)備上的組織方法。主要體現(xiàn)在對(duì)文件和目錄的組織上。目錄提供了管理文件的一個(gè)方便而有效的途徑。我們能夠從一個(gè)目錄切換到另一個(gè)目錄,而且可以設(shè)置目錄和文件的權(quán)限,設(shè)置文件的共享程度。使用Linux,用戶可以設(shè)置目錄和文件的權(quán)限,以便允許或拒絕其他人對(duì)其進(jìn)行訪問(wèn)。(4)Linux 實(shí)用工具標(biāo)準(zhǔn)的 Linux 系統(tǒng)都有一套叫做實(shí)用工具的程序,它們是專門的程序,例如編輯器、執(zhí)行

13、標(biāo)準(zhǔn)的計(jì)算操作等。用戶也可以產(chǎn)生自己的工具。1.3 串口通信的基本任務(wù)(1)實(shí)現(xiàn)數(shù)據(jù)格式化:因?yàn)閬?lái)自CPU 的是普通的并行數(shù)據(jù),所以,接口電路應(yīng)具有實(shí)現(xiàn)不同串行通信方式下的數(shù)據(jù)格式化的任務(wù)。在異步通信方式下,接口自動(dòng)生成起止式的幀數(shù)據(jù)格式。在面向字符的同步方式下,接口要在待傳送的數(shù)據(jù)塊前加上同步字符。(2)進(jìn)行串-并轉(zhuǎn)換:串行傳送,數(shù)據(jù)是一位一位串行傳送的,而計(jì)算機(jī)處理數(shù)據(jù)是并行數(shù)據(jù)。所以當(dāng)數(shù)據(jù)由計(jì)算機(jī)送至數(shù)據(jù)發(fā)送器時(shí),首先把串行數(shù)據(jù)轉(zhuǎn)換為并行數(shù)才能送入計(jì)算機(jī)處理。因此串并轉(zhuǎn)換是串接口電路和的重要任務(wù)。(3)控制數(shù)據(jù)傳輸速率:串行通信接口電路應(yīng)具有對(duì)數(shù)據(jù)傳輸速率-波特率進(jìn)行先擇和控制的能力。(

14、4)進(jìn)行錯(cuò)誤檢測(cè):在發(fā)送接口電路對(duì)傳送的字符數(shù)據(jù)自動(dòng)生成奇偶校驗(yàn)位或其他校驗(yàn)碼。在接收時(shí),接口電路檢查字符的奇偶校驗(yàn)或其他檢驗(yàn)碼,確定是否發(fā)生傳送錯(cuò)誤。(5)進(jìn)行TTL 與EIA 電平轉(zhuǎn)換:CPU 和終端均采用TTL 電平及正邏輯,它們與EIA 采用的電平及負(fù)邏輯不兼容,需在接口電路中進(jìn)行轉(zhuǎn)換。1.4串口通信協(xié)議及實(shí)現(xiàn)串行端口的本質(zhì)功能是作為CPU 和串行設(shè)備間的編碼轉(zhuǎn)換器,一般微機(jī)內(nèi)都配有通信適配器,使計(jì)算機(jī)能夠與其他具有RS-232C 串口的計(jì)算機(jī)或設(shè)備進(jìn)行通信。本系統(tǒng)主要目的是實(shí)現(xiàn)宿主機(jī)與目標(biāo)機(jī)之間的近距離串行通信, 采用的宿主機(jī)是Intel Centrino架構(gòu)的Red Hat Lin

15、ux 9.03 環(huán)境PC機(jī), 而目標(biāo)機(jī)是ARM 架構(gòu)的開(kāi)發(fā)板。本系統(tǒng)中目標(biāo)機(jī)開(kāi)發(fā)板的內(nèi)核采用的是三星的S3C2410 ,該開(kāi)發(fā)板采用核心板加底板的模式, 核心板接口采用DIMM200 標(biāo)準(zhǔn)連接器,工作非??煽?可穩(wěn)定運(yùn)行在203 MHz 的時(shí)鐘頻率下。其外設(shè)非常豐富,功能強(qiáng)大,完全可以滿足設(shè)計(jì)需要。串口線采用常用的RS-232C 型接口模式,能實(shí)現(xiàn)計(jì)算機(jī)與開(kāi)發(fā)板間的數(shù)據(jù)傳輸與控制。嵌入式串口通信采用EIA RS-232C標(biāo)準(zhǔn)。二、 RS-232C標(biāo)準(zhǔn)RS-232C是1969年由電子工業(yè)協(xié)會(huì)(EIA)公布的標(biāo)準(zhǔn)。該標(biāo)準(zhǔn)的用途是定義數(shù)據(jù)終端設(shè)備DTE(Data Terminal Equipment

16、)與數(shù)據(jù)通信設(shè)備DCE(Data Communication Equioment)的接口特性。數(shù)據(jù)終端設(shè)備就是連接通信兩端設(shè)備的連線(如空MODEM)或其他設(shè)備。RS-232C標(biāo)準(zhǔn)的構(gòu)架如圖2.1所示。(數(shù)據(jù)終端設(shè)備DTE)(數(shù)據(jù)通信設(shè)備DCE)(數(shù)據(jù)通信設(shè)備DCE)(數(shù)據(jù)終端設(shè)備DTE)計(jì)算機(jī)BMODEMRS-232CMODEM計(jì)算機(jī)A通信線路RS-232C圖2.1 RS-232C標(biāo)準(zhǔn)的構(gòu)架RS-232C標(biāo)準(zhǔn)的一些主要規(guī)范如下。電氣特性RS-232C采用非歸零、雙極性編碼,且使用負(fù)邏輯規(guī)定的邏輯電平:-15-5V規(guī)定為邏輯“1”。+5+15V規(guī)定為邏輯“0”。信號(hào)電平與TTL電平不兼容,所以

17、需要電平轉(zhuǎn)換電路(通常使用MAX3232轉(zhuǎn)換)。電平轉(zhuǎn)換電路如圖2.2所示。MAX3232RS-232C輸出TTL輸出RS-232C接口電路TTL輸入RS-232C輸入圖2.2 RS-232C的電平轉(zhuǎn)換電路2.1引腳定義目前廣泛的DB9引腳定義如圖2.3所示。信號(hào)引腳定義的說(shuō)明見(jiàn)表2.1。 GND 59 RI 8 CTSDTR 47 RTSTXD 3RXD 26 DSRDCD 1圖2.3 DB9 引腳定義9針串口DB9針號(hào)功能說(shuō)明縮寫1輸入,數(shù)據(jù)載波檢測(cè)DCD2輸入,接收數(shù)據(jù)RXD3輸出,發(fā)送數(shù)據(jù)TXD4輸出,DTE準(zhǔn)備就緒DTR5信號(hào)地GND6輸入,MODEM準(zhǔn)備就緒DSR7輸出,請(qǐng)求發(fā)送R

18、TS8輸入,允許發(fā)送CTS9輸入,振鈴指示DELL表2.1 DB9引腳說(shuō)明2.2 字符(幀)格式RS-232C采用起止式異步通信協(xié)議,其特點(diǎn)是一個(gè)字符接著一個(gè)字符進(jìn)行傳輸,并且傳輸一個(gè)字符總是以起始位開(kāi)始,以停止位結(jié)束,字符之間沒(méi)有固定的時(shí)間間隔要求。其傳輸格式如圖2.4所示,每一個(gè)字符的前面都有一位起始位(低電平,邏輯“0”),字符本身有58位數(shù)據(jù)位,接著字符后面是一位校驗(yàn)碼(也可以沒(méi)有校驗(yàn)碼),最后是停止位。停止位后面是不定長(zhǎng)度的空閑位。停止位和空閑位都規(guī)定為高電平(邏輯值“1”),這樣就能保證起始位開(kāi)始處一定有一個(gè)下跳沿,便于接受方識(shí)別。校驗(yàn)位(可以沒(méi)有)起始位數(shù)據(jù)停止位接收方發(fā)送方1

19、x 1 1 1 1 1 0 1 1 0數(shù)據(jù)流方向1 1 1 1 1 1 0 1 1 01 1 11 0 1 0數(shù)據(jù)單元之間的間隔圖2.4 串行傳輸?shù)墓ぷ髟硎疽鈭D從圖2.4 中可以看出,這種格式是靠起始位和停止位來(lái)實(shí)現(xiàn)字符的界定或同步的,故稱為起止式協(xié)議。沒(méi)有統(tǒng)一的時(shí)鐘,沒(méi)有同步字符,依靠起始位和停止位標(biāo)識(shí)每一幀,傳輸時(shí),數(shù)據(jù)的地位在前,高位在后。起始位實(shí)際上是作為同步信號(hào)附加進(jìn)來(lái)的,當(dāng)它變?yōu)榈碗娖綍r(shí),告訴接受方傳輸開(kāi)始,后面接著是數(shù)據(jù)位;而停止位則標(biāo)志一個(gè)字符的結(jié)束。這樣就為通信雙方提供了何時(shí)開(kāi)始收發(fā)、何時(shí)結(jié)束的標(biāo)志。傳輸開(kāi)始前,收發(fā)雙方把所采用的字符格式(包括字符的數(shù)據(jù)位長(zhǎng)度、停止位位數(shù)、

20、有無(wú)校驗(yàn)位以及是奇校驗(yàn)還是偶校驗(yàn)等)和數(shù)據(jù)的傳輸速率進(jìn)行統(tǒng)一規(guī)定。傳輸開(kāi)始后,接收設(shè)備不斷地檢測(cè)線路,看是否有起始位到來(lái)。當(dāng)收到一系列的“1”(停止位或空閑位)之后,檢測(cè)到一個(gè)下跳沿(由“1”變?yōu)椤?”),說(shuō)明起始位出現(xiàn),起始位經(jīng)確認(rèn)后,就開(kāi)始接收所規(guī)定的數(shù)據(jù)位和奇偶校驗(yàn)位以及停止位。然后去掉停止位,對(duì)數(shù)據(jù)位進(jìn)行串并轉(zhuǎn)換,并且經(jīng)奇偶校驗(yàn)無(wú)誤后,才算正確地接收到一個(gè)字符。一個(gè)字符接收完畢,接收設(shè)備又繼續(xù)測(cè)試線路,監(jiān)視“0”電平的到來(lái)和下一位字符的開(kāi)始,直到全部數(shù)據(jù)傳輸完畢。2.3握手協(xié)議RS-232C標(biāo)準(zhǔn)除了規(guī)定的字符格式和通信波特率以外,還在數(shù)據(jù)終端設(shè)備DTE和數(shù)據(jù)通信設(shè)備DCE之間定義了一套

21、握手協(xié)議。握手協(xié)議的過(guò)程如圖2.5所示。數(shù)據(jù)終端設(shè)備DTE 本地MODEM 遠(yuǎn)程MODEM 遠(yuǎn)程DTEDTRDSRRTS呼叫載波信號(hào)DCD 載波確認(rèn)CTSTXD圖2.5 DTE與DCE的握手協(xié)議過(guò)程DTR:數(shù)據(jù)終端設(shè)備DTE準(zhǔn)備就緒。DTE加電并能正確實(shí)現(xiàn)通信時(shí),向DCE發(fā)出DTR信號(hào)。DSR:數(shù)據(jù)通信設(shè)備DCE準(zhǔn)備就緒。MODEM加電并能正確執(zhí)行通信功能時(shí),DTE發(fā)出DSR信號(hào)。RTS:請(qǐng)求發(fā)送。當(dāng)DTE有數(shù)據(jù)需要向另一遠(yuǎn)程DTE傳輸時(shí),DTE在檢測(cè)DSR有效時(shí)向本地MODEM發(fā)出RTS信號(hào)。本地MODEM檢測(cè)到RTS有效,然后根據(jù)目的電話號(hào)碼向遠(yuǎn)程MODEM發(fā)出呼叫。遠(yuǎn)程MODEM收到該呼

22、叫,發(fā)出回答載波信號(hào)。本地MODEM接受到此載波信號(hào),然后向遠(yuǎn)程MODEM發(fā)出原載波信號(hào)進(jìn)行確認(rèn),同時(shí)向DTE發(fā)出數(shù)據(jù)載波信號(hào)DCD。DCD:數(shù)據(jù)載波信號(hào)檢測(cè)。由MODEM發(fā)向數(shù)據(jù)終端設(shè)備DTE,表示已檢測(cè)到對(duì)方載波信號(hào)。CTS:允許發(fā)送,當(dāng)一個(gè)MODEM辨認(rèn)出對(duì)方MODEM已經(jīng)準(zhǔn)備接收時(shí),使用CTS信號(hào)通知自己的DTE,表示這個(gè)通信通路已經(jīng)做好數(shù)據(jù)傳輸?shù)臏?zhǔn)備,允許DTE進(jìn)行數(shù)據(jù)發(fā)送。至此,通信鏈路建立,可以通信。RI:振鈴指示。如果MODEM具有自動(dòng)應(yīng)答能力,當(dāng)對(duì)方呼叫傳來(lái)時(shí),MODEM向DTE發(fā)出該信號(hào),指示此呼叫。在電話呼叫振鈴結(jié)束后,MODEM在DTE已準(zhǔn)備好的情況下(即DTR有效),

23、立即向?qū)Ψ阶詣?dòng)應(yīng)答。2.4 雙機(jī)互連方式雙機(jī)可以利用RS-232C通信接口進(jìn)行直接互連(數(shù)據(jù)終端設(shè)備DTE到DTE),即空MODEM連接。這種形式在嵌入式系統(tǒng)中應(yīng)用極為廣泛。由于RS-232C標(biāo)準(zhǔn)中有兩對(duì)硬件握手協(xié)議的引線:DTR和DSR、RTS和CTS,根據(jù)應(yīng)用握手協(xié)議的機(jī)制不同,可分為3種情況:無(wú)硬件握手、DTR和DSR握手、RTS和CTS握手。2.4.1無(wú)硬件握手情況無(wú)硬件握手的雙機(jī)互連如圖2.6所示。DTE TXD RXD GND DTETXDRXDGND計(jì)算機(jī)B計(jì)算機(jī)A圖2.6 無(wú)握手的雙機(jī)互連無(wú)硬件握手的連線最簡(jiǎn)單,只需要3根線,應(yīng)用比較多。但通信不可靠,接收緩沖區(qū)容易溢出。2.4

24、.2 DTR和DSR握手情況DTR和DSR握手的雙機(jī)互連如圖2.7所示。 DTETXDRXDGNDDTRDSRDTE TXD RXD GND DTRDSR計(jì)算機(jī)B計(jì)算機(jī)A采用DTR和DSR握手進(jìn)行發(fā)送和接收數(shù)據(jù)的過(guò)程如下(算機(jī)B發(fā)送):圖2.7 DTR和DSR握手的雙機(jī)互連若計(jì)算機(jī)A已經(jīng)準(zhǔn)備就緒,則使DTR有效。計(jì)算機(jī)B通過(guò)采集DS算機(jī)A已經(jīng)做好接收數(shù)據(jù)的準(zhǔn)備,可以發(fā)送數(shù)據(jù)。若計(jì)算機(jī)A為準(zhǔn)備好,則DTR無(wú)效,計(jì)算機(jī)B通過(guò)采集DSR,得知計(jì)算機(jī)A尚未做好接收數(shù)據(jù)的準(zhǔn)備,停止發(fā)送數(shù)據(jù)。2.4.3RTS和CTS握手情況RTS和CTS握手的雙機(jī)互連如圖2.8所示。DTE TXD RXD GND RTS

25、 CTS DTETXDRXDGNDRTSCTS計(jì)算機(jī)A計(jì)算機(jī)B圖2.8 RTS和CTS握手的雙機(jī)互連利用RTS和CTS握手進(jìn)行發(fā)送和接收數(shù)據(jù)的過(guò)程如下(設(shè)計(jì)算機(jī)A接收、計(jì)算機(jī)B發(fā)送):若計(jì)算機(jī)A已經(jīng)準(zhǔn)備就緒,則使RTS有效。計(jì)算機(jī)B通過(guò)采集CTS,得知計(jì)算機(jī)A已經(jīng)做好接收數(shù)據(jù)的準(zhǔn)備,可以發(fā)送數(shù)據(jù)。若計(jì)算機(jī)A未準(zhǔn)備好,則RTS無(wú)效,計(jì)算機(jī)B通過(guò)采集CTS,得知計(jì)算機(jī)A尚未做好接收數(shù)據(jù)的準(zhǔn)備,停止發(fā)送數(shù)據(jù)。 三、 串口驅(qū)動(dòng)程序設(shè)計(jì)由于嵌入式系統(tǒng)是一個(gè)受資源限制的系統(tǒng),因此不能直接在嵌入式系統(tǒng)硬件上進(jìn)行編程。作為一個(gè)完整的嵌入式系統(tǒng),其軟件設(shè)計(jì)也是一個(gè)很重要的方面。本系統(tǒng)軟件的實(shí)現(xiàn)是通過(guò)串口設(shè)置和讀

26、寫串口等操作來(lái)完成宿主機(jī)與目標(biāo)機(jī)間的串口通信。3.1 串口操作需要的頭文件在開(kāi)發(fā)嵌入式Linux串口驅(qū)動(dòng)程序時(shí),需要以下頭文件。#include <stdio.h> /*標(biāo)準(zhǔn)輸入輸出定義*/#include <stdlib.h> /*標(biāo)準(zhǔn)函數(shù)庫(kù)定義*/#include <unisted.h> /*UNIX標(biāo)準(zhǔn)函數(shù)定義*/#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h> /*文件控制定義*/#include <termios.h> /*PO

27、SIX終端控制定義*/#include <errno.h> /*錯(cuò)誤號(hào)定義*/3.2 打開(kāi)串口在嵌入式Linux系統(tǒng)中,打開(kāi)一個(gè)串口設(shè)備和打開(kāi)普通文件一樣。嵌入式Linux系統(tǒng)下的串口文件通常位于/dev下:串口一為/dev/ttyS0;串口二為/dev/ttyS1。打開(kāi)串口時(shí)通過(guò)使用標(biāo)準(zhǔn)的文件函數(shù)open( )來(lái)進(jìn)行操作的,下面假設(shè)以讀寫方式打開(kāi)串口一。int fd;/文件描述符fd=open(“/dev/ttyS0”,O_RDWR);/以讀寫方式打開(kāi)串口if(fd=-1)/如果不能打開(kāi)串口一 perror(“提示錯(cuò)誤!”); 3.3 串口設(shè)置在Linux 系統(tǒng)中,設(shè)備都是以文件

28、的形式表示的,串口參數(shù)一般包括波特率、起始位數(shù)量、停止位數(shù)量等。下面對(duì)這些串口參數(shù)進(jìn)行詳細(xì)說(shuō)明。起始位通信線路上沒(méi)有數(shù)據(jù)被傳送時(shí),處于邏輯“1”狀態(tài)。當(dāng)發(fā)送字符數(shù)數(shù)據(jù)是首先發(fā)送一個(gè)邏輯“0”信號(hào),這個(gè)邏輯低電平就是起始位。起始位通過(guò)通信線路傳輸?shù)浇邮斩耍邮斩藱z測(cè)到這個(gè)低電平之后,就開(kāi)始準(zhǔn)備接收數(shù)據(jù)位信號(hào)。起始位所起的作用就是使通信雙方同步。數(shù)據(jù)位當(dāng)接收端收到起始位后,開(kāi)始接收數(shù)據(jù)位。數(shù)據(jù)位的個(gè)數(shù)可以是58位。在數(shù)據(jù)傳送過(guò)程中,數(shù)據(jù)位從最低有效位開(kāi)始傳送,接收端收到數(shù)據(jù)后,依次將其轉(zhuǎn)換成并行數(shù)據(jù)。奇偶校驗(yàn)位數(shù)據(jù)位發(fā)送完后,為了保證數(shù)據(jù)的可靠性,還要傳送一個(gè)奇偶校驗(yàn)位。奇偶校驗(yàn)用于差錯(cuò)檢測(cè)。如果

29、選擇偶檢驗(yàn),則數(shù)據(jù)位和奇偶位的邏輯“1”的個(gè)數(shù)必須為偶數(shù),相反,如果是奇檢驗(yàn),則數(shù)據(jù)位和奇偶位的邏輯“1”的個(gè)數(shù)為奇數(shù)。停止位在奇偶位或數(shù)據(jù)位(當(dāng)無(wú)奇偶校驗(yàn)時(shí))之后發(fā)送停止位。停止位表示一個(gè)數(shù)據(jù)的結(jié)束。它可以是12位的低電平。接收端收到停止位后,通信線路便恢復(fù)邏輯“1”的狀態(tài),直到下一個(gè)數(shù)據(jù)的起始位到來(lái)。波特率通信線路上傳輸?shù)奈唬ùa元)信號(hào)都必須保持一致的信號(hào)持續(xù)時(shí)間,單位時(shí)間內(nèi)傳送碼元的數(shù)目稱為波特率。對(duì)大多數(shù)嵌入式設(shè)備來(lái)說(shuō),其波特率都設(shè)置為115200。訪問(wèn)串行口通過(guò)對(duì)設(shè)備文件的訪問(wèn)來(lái)實(shí)現(xiàn),僅需打開(kāi)相應(yīng)的設(shè)備文件。串口的設(shè)置主要是設(shè)置struct termios 結(jié)構(gòu)體中的各成員值。#in

30、clude<termios.h>struct termiounsigned short c_iflag; /*輸入模式標(biāo)志*/unsigned short c_oflag; /*輸出模式標(biāo)志*/unsigned short c_cflag; /*控制模式標(biāo)志*/unsigned short c_lflag; /*本地模式標(biāo)志*/unsigned char c_line; /*線路規(guī)范*/unsigned char c_ccNCC; /*控制特征值*/波特率設(shè)置:struct termios option;tcgetattr(fd,&option);cfsetispeed(&

31、amp;option,B115200);/*設(shè)置為115200Bps*/cfsetospeed(&option,B115200);tcsetattr(fd,TCANOW,&option);檢驗(yàn)位設(shè)置:無(wú)校驗(yàn) 8 位:options.c_cflag &=PARENBoptions.c_cflag &=CSTOPB;options.c_cflag &=CSIZE;options.c_cflag=CS8;奇效驗(yàn)(Odd)7 位:options.c_cflag=PARENB;options.c_cflag &=PARODD;options.c_cflag

32、 &=CSTOPB;options.c_cflag &=CSIZE;options.c_cflag=CS7;偶校驗(yàn)(Even)7 位:options.c_cflag &=PARENB;options.c_cflag=OARODD;options.c_cflag &= CSTOPB;options.c_cflag &=CSIZE;options.c_cflag=CS7;Space 校驗(yàn)7 位:options.c_cflag &= PARENB;options.c_cflag &=CSTOPB;options.c_cflag &=&a

33、mp;CSIZE;options.c_cflag=CS8;停止位設(shè)置:1位: options.c_cflag &=CSTOPB;2位: options.c_cflag=CSTOPB;模式設(shè)置:需要注意的是,如果不是開(kāi)發(fā)終端之類的,只是串口傳輸數(shù)據(jù),而不需要串口來(lái)處理,那么使用原始模式(Raw Mode)方式來(lái)通訊。options.c_lflag &=(ICANONECHOECHOEISIG);/*Input*/options.c_oflag &=OPOST;/*Output*/3.4 串口讀寫在Linux 系統(tǒng)中,對(duì)設(shè)備和目錄的操作都等同于文件的操作,這樣大大簡(jiǎn)化了系統(tǒng)

34、對(duì)不同設(shè)備的處理,提高了效率。在程序中,設(shè)備和文件都是使用文件描述符來(lái)進(jìn)行操作的。文件描述符是一個(gè)非負(fù)的整數(shù),是一個(gè)索引值,并指向內(nèi)核中每個(gè)進(jìn)程打開(kāi)文件的記錄表。當(dāng)打開(kāi)一個(gè)現(xiàn)存的文件或者是創(chuàng)建一個(gè)新文件時(shí),內(nèi)核就向進(jìn)程返回一個(gè)文件描述符;當(dāng)需要讀寫時(shí)也需要將文件描述符作為參數(shù)傳遞給相應(yīng)的函數(shù)。在Linux 系統(tǒng)中,所有的設(shè)備文件都位于“/ dev”下,其中串口對(duì)應(yīng)的設(shè)備名為“/ dev/ ttyS0”,因此對(duì)串口的讀寫就可以像讀寫(“read”和“write”) 普通文件一樣來(lái)讀寫設(shè)備文件,所不同的是需要對(duì)串口的其他參數(shù)另做配置。打開(kāi)串口之后,讀寫串口就很容易了,把串口當(dāng)作文件讀寫就可以了。(

35、1)發(fā)送數(shù)據(jù)char butter1024;int Length=1024;int nByte;nByte=write(fd,buffer,Length);(2)讀取串口數(shù)據(jù)使用文件操作read 函數(shù)讀取,如果設(shè)置為原始模式(Raw Mode)傳輸數(shù)據(jù),那么read 函數(shù)返回的字符數(shù)是實(shí)際串口收到的字符數(shù)。讀取數(shù)據(jù)時(shí)比較需要技巧的。char buff1024;int Len=1024;int rdadByte=read(fd,buff,Len);也可以使用操作文件的函數(shù)來(lái)實(shí)現(xiàn)異步讀取,如fcntl,或者selectt 等來(lái)操作。fd_set rfds;struct timeval tv;int

36、 retval;/*下面幾行設(shè)置要監(jiān)視進(jìn)行讀寫操作的文件集*/FD-ZERO(&rfds); /文件集清零FD_SET(portsportNo.handle,&rfds); /向集合中添加一個(gè)文件句柄tv.tv_sec=Timeout/1000; /設(shè)置等待的時(shí)間tv.tv_usec=(Timeeout%1000)*1000;retval=select(16,&rfds,NULL,NULL,&tv;) /文件所監(jiān)視的文件集準(zhǔn)備好.if(rdtvel) /文件集中有文件在等待時(shí)間內(nèi)準(zhǔn)備好了.actuaIRead=read(portsportNo.handle,bu

37、f,maxCnt); /讀取數(shù)據(jù)下面兩個(gè)實(shí)例給出了串口讀和寫兩個(gè)程序部分代碼。寫串口的程序?qū)⒃谒拗鳈C(jī)上運(yùn)行,讀串口程序?qū)⒃谀繕?biāo)板上運(yùn)行。寫串口部分程序:doprintf(“Input some words(enter quit to exit):”);memset(buff, 0,BUFFER_SIZE);if(fgets(buff,BUFFER_SIZE,stdin)=NULL)perror(“fgets”);break;write(fd,buff,strlen(buff);whie(strncmp(buff,”quit”,4);讀串口部分程序:domemset(buff,0,BUFFER_

38、SIZE);if(read(fd,buff,BUFFER_SIZE)>0)printf(“The received words are:%s”,buff);while(strncmp(buff,”quit”,4);3.5 關(guān)閉串口在Linux 系統(tǒng)中,對(duì)設(shè)備和目錄的操作都等同于文件的操作, 關(guān)閉串口就是關(guān)閉文件,而設(shè)備和文件都是使用文件描述符來(lái)進(jìn)行操作的。文件描述符是一個(gè)索引值,指向內(nèi)核中每個(gè)進(jìn)程打開(kāi)文件的記錄表,因此關(guān)閉文件就只要關(guān)閉文描述符就可以了。四、源程流程圖五、源程序代碼/*serial_com.c*/#include <string.h>#include <

39、unistd.h>#include <fcntl.h>#include <errno.h>#include <termios.h>#include <sys/types.h>#include <sys/stat.h>#include <stdlib.h>#define MODEMDEVICE "/dev/ttyS0"#define _POSIX_SOURCE 1#define FALSE 0#define TRUE 1volatile int STOP=FALSE;main() int fd,n=0,c,BAUDRATE,i,BUFNUMBER=32,READNUMBER=32; char receivebufBUFN

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論