版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第6章 嵌入式Linux文件(wnjin)處理與串口通信 嵌入式系統(tǒng)(xtng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁本章(bn zhn)要點1、文件描述符的概念2、系統(tǒng)調(diào)用的基本概念 3、文件讀寫等處理方法(fngf)4、嵌入式Linux中對串口的操作重慶大學(xué)電氣工程學(xué)院嵌入式系統(tǒng)及其應(yīng)用共一百零六頁6.1嵌入式Linux的文件(wnjin)處理嵌入式系統(tǒng)(xtng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁6.1.1文件(wnjin)描述符及文件(wnjin)處理 1、文件及文件描述符由于在Linux下設(shè)備和目錄都看作是文件,因此,Linux中的文件有4種類型:普通文件、目錄文件、鏈接文件
2、和設(shè)備文件。Linux的內(nèi)核利用文件描述符訪問文件。文件描述符是非負(fù)整數(shù),它是一個索引(suyn)值,并指向內(nèi)核中每個進(jìn)程打開文件的記錄表。當(dāng)打開一個現(xiàn)存文件或新建一個文件時,內(nèi)核會向進(jìn)程返回一個文件描述符。當(dāng)讀寫文件時,也需要使用文件描述符來指定待讀寫的文件。 嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁 在Linux中對目錄和設(shè)備的操作都等同于文件的操作,因此,大大簡化了系統(tǒng)對不同(b tn)設(shè)備的處理,提高了效率。 Linux中的文件(wnjin)主要分為4種 普通文件 目錄文件 鏈接文件 設(shè)備文件 嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁 普通文件也稱作常規(guī)(chngg
3、u)文件,包含各種長度的字節(jié)串。核心對這些數(shù)據(jù)沒有進(jìn)行結(jié)構(gòu)化,只是作為有序的字節(jié)序列把它提交給應(yīng)用程序。應(yīng)用程序自己組織和解釋這些數(shù)據(jù),通常把它們歸并為下述類型之一: 普通(ptng)文件文本文件,由ASCII字符構(gòu)成。 數(shù)據(jù)文件,由來自應(yīng)用程序的數(shù)字型和文本型數(shù)據(jù)構(gòu)成。 可執(zhí)行的二進(jìn)制程序,由機(jī)器指令和數(shù)據(jù)構(gòu)成。 嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁目錄(ml)文件 目錄是一類特殊的文件,利用它可以構(gòu)成文件系統(tǒng)的分層樹型結(jié)構(gòu)。如同普通文件那樣,目錄文件也包含(bohn)數(shù)據(jù);但目錄文件與普通文件的差別是,核心對這些數(shù)據(jù)加以結(jié)構(gòu)化,它是由成對的“I節(jié)點號/文件名”構(gòu)成的列表。 I
4、節(jié)點中存放有文件的狀態(tài)信息。 文件名是給一個文件分配的文本形式的字符串,用來標(biāo)識該文件。 嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁鏈接(lin ji)文件 Linux具有為一個文件起多個名字的功能,稱為鏈接。被鏈接的文件可以存放在相同的或不同的目錄下。如果在同一目錄下,二者必須(bx)有不同的文件名,而不用在硬盤上為同樣的數(shù)據(jù)重復(fù)備份;如果在不同的目錄下,那么被鏈接的文件可以與原文件同名,只要對一個目錄下的該文件進(jìn)行修改,就可以完成對所有目錄下同名鏈接文件的修改。對于某文件的各個鏈接文件,我們可以給它們指定不同的存取權(quán)限,以控制對信息的共享和增強(qiáng)安全性。 文件鏈接分為硬鏈接和軟鏈接兩
5、種形式 嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁設(shè)備(shbi)文件 在Linux系統(tǒng)中,所有設(shè)備都作為一種(y zhn)特別文件對待,用戶像使用普通文件那樣對設(shè)備進(jìn)行操作,從而實現(xiàn)設(shè)備無關(guān)性。但是,設(shè)備文件除了存放在文件I節(jié)點中的信息外,它們不包含任何數(shù)據(jù)。系統(tǒng)利用它們來標(biāo)識各個設(shè)備驅(qū)動器,核心使用它們與硬件設(shè)備通信。 字符設(shè)備 塊設(shè)備 有兩類特別設(shè)備文件,它們對應(yīng)不同類型的設(shè)備 嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁 內(nèi)核如何區(qū)分和引用特定的文件呢?這里用到的就是個重要的概念文件描述符。對于Linux而言,所有對設(shè)備和文件的操作都使用文件描述符來進(jìn)行的。文件描述符是一
6、個非負(fù)的整數(shù),它是個索引(suyn)值,并指向內(nèi)核中每個進(jìn)程打開文件的記錄表。當(dāng)打開一個現(xiàn)存文件或創(chuàng)建一個新文件時,內(nèi)核就向進(jìn)程返回一個文件描述符;當(dāng)需要讀寫文件時,也需要把文件描述符作為參數(shù)傳遞給相應(yīng)的函數(shù)。 嵌入式系統(tǒng)(xtng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁2、系統(tǒng)(xtng)調(diào)用 系統(tǒng)調(diào)用是操作系統(tǒng)提供給用戶程序調(diào)用的一組“特殊”接口。 使用系統(tǒng)主要目的是使得用戶可以使用操作系統(tǒng)提供的有關(guān)設(shè)備管理、輸入/輸出系統(tǒng)、文件系統(tǒng)和進(jìn)程控制、通信以及存儲管理等方面的功能,而不必了解系統(tǒng)程序的內(nèi)部結(jié)構(gòu)和有關(guān)硬件細(xì)節(jié),從而起到減輕(jinqng)用戶負(fù)擔(dān)和保護(hù)系統(tǒng)以及提高資源利用率的作用
7、。嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁Linux的運行空間劃分為用戶空間和內(nèi)核空間,它們各自運行在不同(b tn)的級別中,所以用戶進(jìn)程在通常情況下不允許訪問內(nèi)核,也無法使用內(nèi)核函數(shù),它們只能在用戶空間操作用戶數(shù)據(jù),調(diào)用用戶空間函數(shù)。這樣做的目的是為了對系統(tǒng)作必要的“保護(hù)”措施,但是使用系統(tǒng)調(diào)用可以最大程度地解決這一問題。嵌入式系統(tǒng)(xtng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁Linux系統(tǒng)(xtng)有200多個系統(tǒng)調(diào)用,這些系統(tǒng)調(diào)用按照功能分類大致可分為以下幾個方面:進(jìn)程控制 文件系統(tǒng)控制 系統(tǒng)控制 存儲管理 網(wǎng)絡(luò)管理 socket控制 用戶(yngh)管理 進(jìn)程間通信
8、 嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁用戶(yngh)編程接口(API) 系統(tǒng)調(diào)用并不是直接與程序員進(jìn)行交互的,它僅僅是個通過軟中斷機(jī)制向內(nèi)核提交請求,以獲取內(nèi)核服務(wù)(fw)的接口。在實際使用中程序員調(diào)用的通常是用戶編程接口API。但并不是所有的函數(shù)都對應(yīng)個系統(tǒng)調(diào)用,有時,一個API函數(shù)會需要幾個系統(tǒng)調(diào)用來共同完成函數(shù)的功能,其至還有些API函數(shù)不需要調(diào)用相應(yīng)的系統(tǒng)調(diào)用(因此它所完成的不是內(nèi)核提供的服務(wù))。嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁嵌入式系統(tǒng)(xtng)及其應(yīng)用重慶大學(xué)電氣(dinq)工程學(xué)院共一百零六頁3、文件(wnjin)處理Linux系統(tǒng)的文件處理,
9、主要是指進(jìn)行打開文件、讀文件、寫文件及關(guān)閉文件等I/O操作。大多數(shù)情況下,只需用到5個函數(shù):open、read、write、lseek 和close。這幾個函數(shù)不需要經(jīng)過緩沖就能立即執(zhí)行(zhxng),因此,被稱之為不帶緩存的I/O操作,即每一個函數(shù)都只調(diào)用內(nèi)核中的一個系統(tǒng)調(diào)用。 嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁6.1.2open函數(shù)(hnsh)和close函數(shù) 嵌入式系統(tǒng)(xtng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁1、open函數(shù)(hnsh)open函數(shù)用于打開或創(chuàng)建文件。調(diào)用open函數(shù)所需要的頭文件如下(rxi):#include #include #inclu
10、de 其函數(shù)為:int open(const char *pathname, int oflag, int perms ) ;函數(shù)返回值:若文件打開成功則返回文件描述符,若出錯則返回-1。嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁所需頭文件#include#include#include函數(shù)原型int open(const char *pathname, flags, int perms)pathname被打開的文件名(可包括路徑名)flag:文件打開的方式O_RDONLY:只讀方式打開文件O_WRONLY:只寫方式打開文件O_RDWR:讀寫方式打開文件O_CREAT:如果該文件不存在
11、,就創(chuàng)建一個新的文件,并用第三個參數(shù)為其設(shè)置權(quán)限O_EXCL:如果同時使用O_CREAT時文件存在,則返回錯誤消息。這一參數(shù)可測試文件是否存在O_NOCTTY:使用本參數(shù)時,如文件為終端,那么終端不可以作為調(diào)用open()系統(tǒng)調(diào)用的那個進(jìn)程的控制終端O_TRUNC:如文件已經(jīng)存在,并且以只讀或只寫成功打開,那么會先全部刪除文件中原有數(shù)據(jù)O_APPEND:以添加方式打開文件,在打開文件的同時,文件指針指向文件的末尾perms被打開文件的存取權(quán)限,為8進(jìn)制表示法函數(shù)返回值成功:返回文件描述符失?。?1在open函數(shù)(hnsh)中,flag參數(shù)可通過組合構(gòu)成,但前3個函數(shù)不能相互組合 共一百零六頁2
12、、close函數(shù)(hnsh)close函數(shù)用于關(guān)閉一個打開(d ki)的文件,所需要的頭文件為:#include 其函數(shù)為:int close(int fd);函數(shù)返回值:若成功為0,若出錯為-1。關(guān)閉文件函數(shù)close的參數(shù)fd為文件描述符。嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁open和close函數(shù)(hnsh)使用實例實例中的open函數(shù)帶有3個flag參數(shù):O_CREAT、O_TRUNC和O_WRONLY,這樣就可以(ky)對不同的情況指定相應(yīng)的處理方法。另外,這里對該文件的權(quán)限設(shè)置為0600 。嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁文件(wnjin)操作所需頭
13、文件(wnjin)打開(d ki)當(dāng)前目錄下hello.c文件文件名文件打開的方式文件的權(quán)限打開文件操作成功打印顯示文件描述符關(guān)閉文件文件描述符定義變量fd用于保存文件描述符共一百零六頁執(zhí)行程序打開文件(wnjin)后輸出信息文件(wnjin)描述的值關(guān)閉文件后打印輸出信息嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁查看(chkn)當(dāng)前目錄中的文件創(chuàng)建(chungjin)了hello.c文件文件的權(quán)限嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁文件(wnjin)的權(quán)限共一百零六頁查看(chkn)當(dāng)前目錄中的文件創(chuàng)建(chungjin)了hello.c文件嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電
14、氣工程學(xué)院共一百零六頁注意:open函數(shù)返回的又件描述符一定是最小的未用文件描述符。由于一個進(jìn)程在啟動時自動打開了0、1、2三個文件描述符,因此,該文件運行結(jié)果中返回的文件描述符為3??梢試L試在調(diào)用open函數(shù)之前,加一句close(0),則此后(c hu)在open函數(shù)時返回的文件描述符為0(若關(guān)閉文件描述符1,則在執(zhí)行時會由于沒有標(biāo)準(zhǔn)輸出文件而無法輸出)。 嵌入式系統(tǒng)(xtng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁關(guān)閉標(biāo)準(zhǔn)輸入(shr)文件打印文件描述符文件(wnjin)描述符共一百零六頁執(zhí)行程序文件打開成功(chnggng)后輸出的信息文件(wnjin)描述符嵌入式系統(tǒng)及其應(yīng)用重慶大
15、學(xué)電氣工程學(xué)院共一百零六頁關(guān)閉標(biāo)準(zhǔn)(biozhn)輸出文件前,輸出一個信息關(guān)閉(gunb)標(biāo)準(zhǔn)輸出文件共一百零六頁查看(chkn)當(dāng)前目錄中的文件只輸出了關(guān)閉標(biāo)準(zhǔn)(biozhn)輸出文件以前的輸出信息嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁6.1.3read函數(shù)(hnsh)、write函數(shù)和lseek函數(shù)嵌入式系統(tǒng)(xtng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁1、read函數(shù)(hnsh) read函數(shù)從打開(d ki)的文件中讀取數(shù)據(jù)。 調(diào)用read函數(shù)所需要的頭文件: # include 其函數(shù)原型為:ssize_t read(int fd, void *buf, size_
16、t count);函數(shù)返回值為讀到數(shù)據(jù)的字節(jié)數(shù),若返回值為0,則已經(jīng)到達(dá)文件尾,若返回-1則為出錯。嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁read函數(shù)(hnsh)語法要點 所需頭文件#include 函數(shù)原型ssize_t read(int fd, void *buf, size_t count)函數(shù)輸入值fd:文件描述符buf:指定讀出數(shù)據(jù)的存儲緩沖區(qū)指針count:指定讀出的字節(jié)數(shù)函數(shù)返回值成功:讀出數(shù)據(jù)的字節(jié)數(shù)0:已到達(dá)文件尾部-1:出錯在讀普通文件(wnjin)時,若讀到要求的字節(jié)數(shù)之前己到達(dá)文件(wnjin)的尾部,則返回的字節(jié)數(shù)會小于希望讀出的字節(jié)數(shù)。 嵌入式系統(tǒng)及其應(yīng)
17、用重慶大學(xué)電氣工程學(xué)院共一百零六頁2、write函數(shù)(hnsh)write函數(shù)用于向打開的文件(wnjin)實現(xiàn)寫入數(shù)據(jù)的操作。寫操作的位置從文件(wnjin)的當(dāng)前位移量處開始。若磁盤已滿或超出該文件(wnjin)的長度,則write函數(shù)返回錯誤值。調(diào)用write函數(shù)所需要的頭文件:#include 其函數(shù)原型為:ssize_t write(int fd, void *buf, size_t count);函數(shù)返回值為已寫入數(shù)據(jù)的字節(jié)數(shù),若返回-1則出錯。 嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁write函數(shù)(hnsh)語法要點 所需頭文件#include 函數(shù)原型ssize_t
18、 write(int fd, void *buf, size_t count)函數(shù)輸入值fd:文件描述符buf:指定寫入數(shù)據(jù)的存儲緩沖區(qū)指針count:指定寫入的字節(jié)數(shù)函數(shù)返回值成功:寫入數(shù)據(jù)的字節(jié)數(shù)-1:出錯在寫普通文件(wnjin)時,寫操作從文件(wnjin)的當(dāng)前位移處開始。 嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁3、lseek函數(shù)(hnsh) lseek函數(shù)用于在由指定的文件描述符的文件中將文件指針定位到相應(yīng)的位置,以進(jìn)行讀寫操作。 調(diào)用lseek函數(shù)所需要的頭文件:#include #include 其函數(shù)原型為:off_t lseek(int fd, off_t of
19、fset, int whence);函數(shù)返回值為文件的當(dāng)前位移(wiy),若返回-1則出錯。嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁lseek函數(shù)語法(yf)要點 所需頭文件#include #include 函數(shù)原型off_t lseek(int fd, off_t offset, int whence)函數(shù)輸入值fd:文件描述符offset:偏移量,每次讀寫操作所需要移動的距離,單位是字節(jié)數(shù),可正可負(fù)(向前或向后移)whence:當(dāng)前位置的基點SEEK_SET:當(dāng)前位置為文件的開頭,新位置為相對于文件頭的偏移量SEEK_CUR:當(dāng)前位置為文件指針的位置,新位置為當(dāng)前位置加上偏移量
20、SEEK_END:當(dāng)前位置為文件的結(jié)尾,新位置為文件的大小加上偏移量函數(shù)返回值成功:文件的當(dāng)前位移-1:出錯嵌入式系統(tǒng)(xtng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁函數(shù)(hnsh)使用實例 該示例程序首先(shuxin)打開上一節(jié)中創(chuàng)建的文件,然后對此文件進(jìn)行讀寫操作(注意要將文件打開屬性改為可讀寫,將文件權(quán)限也做相應(yīng)更改)。接著,寫入“Hello! Im writing to this file!”,此時文件指針位于文件尾部。接著再使用lseek函數(shù)將文件指針移到文件開始處,并讀出10個字節(jié)并將其打印出來。 嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁文件(wnjin)讀寫操作函
21、數(shù)所需頭文件(wnjin)定義一個(y )字符串,用以寫入文件定義一個數(shù)組,有11個元素,用作讀緩沖區(qū)獲取字符串的長度寫文件操作寫入數(shù)據(jù)的存儲緩沖區(qū)指針寫入數(shù)據(jù)字節(jié)數(shù)共一百零六頁將文件(wnjin)指針移到文件(wnjin)頭部當(dāng)前(dngqin)位置的基準(zhǔn)點讀文件操作共一百零六頁嵌入式系統(tǒng)(xtng)及其應(yīng)用重慶大學(xué)電氣(dinq)工程學(xué)院共一百零六頁嵌入式系統(tǒng)(xtng)及其應(yīng)用重慶大學(xué)電氣(dinq)工程學(xué)院共一百零六頁6.2 嵌入式Linux串口通信(tng xn)技術(shù) 嵌入式系統(tǒng)(xtng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁6.2.1 嵌入式Linux串口通信(tng xn)基
22、礎(chǔ)嵌入式系統(tǒng)(xtng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁1、串口通信的工作(gngzu)原理所謂“串口通信”是指外設(shè)和計算機(jī)間使用一根數(shù)據(jù)信號線(另外需要地線),數(shù)據(jù)在一根數(shù)據(jù)信號線上一位一位地進(jìn)行傳輸,每一位數(shù)據(jù)都占據(jù)一個固定的時間長度。在串口傳輸中,發(fā)送方為了告訴接收方,新的數(shù)據(jù)字節(jié)分組到達(dá),在每一個數(shù)據(jù)字節(jié)分組前面有一個起始位(通常是0),為了讓接收方知道字節(jié)已經(jīng)結(jié)束,在每一個數(shù)據(jù)字節(jié)分組后面(hu mian)有一個停止位(通常是1)。接收方一旦檢測到停止位,接收方會一直等待,直到下一個開始位。 嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁圖6.1 串行傳輸數(shù)據(jù)的工作(gn
23、gzu)原理嵌入式系統(tǒng)(xtng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁嵌入式系統(tǒng)串行通信采用(ciyng)EIA RS-232C標(biāo)準(zhǔn),為單向不平衡傳輸方式,信號電平標(biāo)準(zhǔn)12V,負(fù)邏輯,即邏輯1(MARKING)表示為信號電平-12V,邏輯0(SPACING)表示為信號電平+12V,最大傳送距離15米,最大傳送速率19.6K波特,其傳送序列如圖6.1,平時線路保持為1,傳送數(shù)據(jù)開始時,先發(fā)送起始位(其數(shù)據(jù)值是0),然后傳8(或7,6,5)個數(shù)據(jù)位(其數(shù)據(jù)值是0,1),接著可傳1位奇偶校驗位,最后為12個停止位(其數(shù)據(jù)值是1),由此可見,傳送一個ASCII字符(7位),加上同步信號最少需9位數(shù)
24、據(jù)位。 重慶大學(xué)電氣(dinq)工程學(xué)院嵌入式系統(tǒng)及其應(yīng)用共一百零六頁2、常用信號(xnho)引腳與串口通信接線 圖6.2 串口的連接線嵌入式系統(tǒng)(xtng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁6.2.2 嵌入式Linux串口設(shè)置(shzh)詳解嵌入式系統(tǒng)(xtng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁1、起始(q sh)位 通信線路上沒有(mi yu)數(shù)據(jù)被傳送時,處于邏輯“1”的狀態(tài)。當(dāng)發(fā)送設(shè)備要發(fā)送字符數(shù)據(jù)時,首先發(fā)送一個邏輯“0”信號,這個邏輯低電平就是起始位。起始位通過通信線路傳輸?shù)浇邮斩?,接收端檢測到這個低電平后,就開始準(zhǔn)備接收數(shù)據(jù)位信號。起始位所起的作用就是使通信雙方同步
25、。 重慶大學(xué)電氣工程學(xué)院嵌入式系統(tǒng)及其應(yīng)用共一百零六頁2、數(shù)據(jù)位 當(dāng)接收端收到起始位后,開始接收數(shù)據(jù)位。數(shù)據(jù)位的個數(shù)可以是58位。在數(shù)據(jù)(shj)傳送過程中,數(shù)據(jù)(shj)位從最低有效位開始傳送,接收端收到數(shù)據(jù)(shj)后,依次將其轉(zhuǎn)換成并行數(shù)據(jù)(shj)。 嵌入式系統(tǒng)(xtng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁3、奇偶校驗位數(shù)據(jù)位發(fā)送完后,為了保證數(shù)據(jù)的可靠性,還要再傳送(chun sn)一個奇偶校驗位。奇偶校驗用于差錯檢測。如果選擇偶校驗,則數(shù)據(jù)位和奇偶位的邏輯“1”的個數(shù)必須為偶數(shù),相反,如果是奇校驗,數(shù)據(jù)位和奇偶位的邏輯“1”的個數(shù)為奇數(shù)。嵌入式系統(tǒng)(xtng)及其應(yīng)用重慶大學(xué)
26、電氣工程學(xué)院共一百零六頁4、停止(tngzh)位在奇偶位或數(shù)據(jù)位(當(dāng)無奇偶校驗時)之后發(fā)送停止位。停止位表示一個數(shù)據(jù)的結(jié)束。它可以是12位的“1”。接收端收到停止位后,通信線路便恢復(fù)邏輯“1”的狀態(tài)(zhungti),直到下一個數(shù)據(jù)的起始位到來。嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁5、波特率設(shè)置(shzh) 通信線路上傳輸?shù)奈唬ùa元)信號都必須保持一致的信號持續(xù)時間,單位時間內(nèi)傳送碼元的數(shù)目稱為波特率。 對于(duy)大多數(shù)嵌入式設(shè)備來說,其波特率都設(shè)置為115200。在Linux中,所有的設(shè)備文件一般都位于“/dev”下,其中串口一、串口二所對應(yīng)的設(shè)備名依次為“/dev/tty
27、S0”、“/dev/ttyS1”,可以查看在“/dev”下的文件以確認(rèn)。 嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁6.2.3RS232C標(biāo)準(zhǔn)(biozhn) 嵌入式系統(tǒng)(xtng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院由美國電子工業(yè)協(xié)會(EIA)聯(lián)合貝爾系統(tǒng)、調(diào)制解調(diào)器廠家及計算機(jī)終端生產(chǎn)廠家共同制定的用于串口通訊的標(biāo)準(zhǔn),它的全稱是“數(shù)據(jù)終端設(shè)備(DTE)和數(shù)據(jù)通訊設(shè)備(DCE)之間串行二進(jìn)制數(shù)據(jù)交換接口技術(shù)標(biāo)準(zhǔn)”。該標(biāo)準(zhǔn)規(guī)定采用一個DB25芯引腳的連接器或DB9芯引腳的連接器共一百零六頁1、電氣(dinq)特性2、引腳定義嵌入式系統(tǒng)(xtng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁嵌入式系
28、統(tǒng)(xtng)及其應(yīng)用重慶大學(xué)電氣(dinq)工程學(xué)院共一百零六頁嵌入式系統(tǒng)(xtng)及其應(yīng)用重慶大學(xué)電氣(dinq)工程學(xué)院共一百零六頁3、字符(z f)(幀)格式 RS232C采用起止式異步通信協(xié)議,其特點是一個字符接著一個字符進(jìn)行傳輸,并且傳送一個字符總是以起始位開始,以停止位結(jié)束,字符之間沒有固定的時間間隔要求。其傳輸格式如圖6.1所示,每一個字符的前面都有一位起始位(低電平,邏輯值“0”),字符本身有58位數(shù)據(jù)位,接著字符后面是一位校驗碼(也可以沒有校驗碼),最后是停止位。停止位后面是不定長度(chngd)的空閑位。停止位和空閑位都規(guī)定為高電平(邏輯值“1”),這樣就能保證起始位開
29、始處一定有一個下跳沿,便于接收方識別。嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁用奇偶校驗位將所傳字符(z f)中為“1”的位數(shù)湊成奇數(shù)個或偶數(shù)個數(shù)據(jù)位可設(shè)為5,6,7,8位嵌入式系統(tǒng)(xtng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁4、握手(w shu)協(xié)議 嵌入式系統(tǒng)(xtng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁5、雙機(jī)互連方式(fngsh) (1)無硬件握手(w shu)情況嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁(2)DTR和DSR握手(w shu)情況嵌入式系統(tǒng)(xtng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁(3)RTS和CTS握手(w shu)情況重慶
30、大學(xué)電氣(dinq)工程學(xué)院嵌入式系統(tǒng)及其應(yīng)用共一百零六頁6.2.4串口驅(qū)動程序的編寫(binxi) 一個串口驅(qū)動程序,通常包括打開串口、設(shè)置串口參數(shù)(cnsh)、對串口進(jìn)行讀寫操作等內(nèi)容。 嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁S3C2410X內(nèi)部具有2個獨立的UART控制器,每個控制器都可以工作在Interrupt(中斷)模式或者DMA(直接內(nèi)存訪問)模式。另外,每個UART均具有16字節(jié)的FIFO(先進(jìn)先出寄存器),支持的最高波特率可達(dá)到230.4Kbps。UART的操作主要可分為以下幾個(j )部分:信息發(fā)送、信息接收、產(chǎn)生中斷、產(chǎn)生波特率、Loopback模式、紅外模式以
31、及自動流程模式。 嵌入式系統(tǒng)(xtng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁1、串口操作(cozu)需要的頭文件#include /*標(biāo)準(zhǔn)輸入輸出定義(dngy)*/#include /*標(biāo)準(zhǔn)函數(shù)庫定義*/#include /*Unix 標(biāo)準(zhǔn)函數(shù)定義*/#include #include #include /*文件控制定義*/#include /*終端控制定義*/#include /*錯誤號定義*/嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁2、打開(d ki)串口 通常嵌入式 Linux 系統(tǒng)下的串口文件是位于 /dev 下: 串口一 為 /dev/ttyS0; 串口二 為 /de
32、v/ttyS1。打開串口是通過打開函數(shù)(hnsh)open( ) 進(jìn)行的 。int fd;/文件描述符fd = open( “/dev/ttyS0”, O_RDWR);/以讀寫方式打開串口嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁3、設(shè)置(shzh)串口參數(shù) 最基本的串口參數(shù)設(shè)置(shzh)包括波特率設(shè)置(shzh),校驗位和停止位設(shè)置(shzh)。 嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁嵌入式系統(tǒng)(xtng)及其應(yīng)用重慶大學(xué)電氣(dinq)工程學(xué)院#include struct termio unsigned short c_iflag; /*輸入模式標(biāo)志*/ unsig
33、ned 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; /*控制特征值*/;在這個結(jié)構(gòu)中最為重要的是c_cflag,通過對它的賦值,用戶可以設(shè)置波特率、數(shù)據(jù)位、停止位、奇偶校驗位和硬件流控等。另外c_iflag和c_cc也是比較常用的標(biāo)志。在此主要對這3個成員進(jìn)行詳細(xì)說明。 串口的設(shè)置主要是設(shè)置struct termios結(jié)構(gòu)體的各成員值,如下所
34、示: 共一百零六頁B00波特率(放棄DTR)B96009600波特率B1920019200波特率B3840038400波特率B5760057600波特率B115200115200波特率EXTA外部時鐘率EXTB外部時鐘率CS55個數(shù)據(jù)位CS66個數(shù)據(jù)位CS77個數(shù)據(jù)位CS88個數(shù)據(jù)位CSTOPB2個停止位(不設(shè)則是1個停止位)CREAD接收使能PARENB校驗位使能PARODD使用奇校驗而不使用偶校驗HUPCL最后關(guān)閉時掛線(放棄DTR)CLOCAL本地連接(不改變端口所有者)LOBLK塊作業(yè)控制輸出CNET_CTSRTS硬件流控制使能c_cflag支持(zhch)的常量名稱 波特率設(shè)置(sh
35、zh)為相應(yīng)的波特率值前加上B 字符長度 CBAUD波特率的位掩碼CSIZE數(shù)據(jù)位的位掩碼在這里,對于c_cflag成員不能直接對其初始化,而要將其通過“與”、“或”操作使用其中的某些選項。 共一百零六頁INPCK奇偶校驗使能IGNPAR忽略奇偶校驗錯誤PARMRK奇偶校驗錯誤掩碼ISTRIP除去奇偶校驗位IXON啟動出口硬件流控IXOFF啟動入口軟件流控IXANY允許字符重新啟動流控IGNBRK忽略中斷情況BRKINT當(dāng)發(fā)生中斷時發(fā)送SIGINT信號INLCR將NL映射到CRIGNCR忽略CRICRNL將CR映射到NLIUCLC將高位情況映射到低位情況IMAXBEL當(dāng)輸入太長時回復(fù)ECHOc
36、_iflag支持的常量(chngling)名稱 奇偶校驗控制(kngzh)共一百零六頁c_cc支持(zhch)的常量名稱 VINTR中斷控制,對應(yīng)鍵為CTRL+CVQUIT退出操作,對應(yīng)鍵為CTRL+ZVERAST刪除操作,對應(yīng)鍵為Backspace(BS)VKILL刪除行,對應(yīng)鍵為CTRL+UVEOF位于文件結(jié)尾,對應(yīng)鍵為CTRL+DVEOL位于行尾,對應(yīng)鍵為Carriage return(CR)VEOL2位于第二行尾,對應(yīng)鍵為Line feed(LF)VMIN指定了最少讀取的字符數(shù)VTIME指定了讀取每個字符的等待時間嵌入式系統(tǒng)(xtng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁設(shè)置(sh
37、zh)串口屬性的基本流程保存原先串口配置首先,為了安全(nqun)起見和以后調(diào)試程序方便,可以先保存原先串口的配置,在這里可以使用函數(shù)tcgetattr (fd, oldtio)。該函數(shù)得到與fd指向?qū)ο蟮南嚓P(guān)參數(shù),并將它們保存于oldtio引用的termios結(jié)構(gòu)中。該函數(shù)還可以測試配置是否正確、該串口是否可用等。若調(diào)用成功,函數(shù)返回值為0,若調(diào)用失敗,函數(shù)返回值為-1。 重慶大學(xué)電氣工程學(xué)院嵌入式系統(tǒng)及其應(yīng)用共一百零六頁使用(shyng)如下所示: if ( tcgetattr ( fd, &oldtio ) != 0 ) perror ( “Setup Serial 1” ); retu
38、rn -1;指向一個(y )對象保存原來的配置參數(shù)重慶大學(xué)電氣工程學(xué)院嵌入式系統(tǒng)及其應(yīng)用共一百零六頁激活(j hu)選項有CLOCAL和CREAD CLOCAL和CREAD分別用于本地連接和接受使能,因此,首先(shuxin)要通過位掩碼的方式激話這兩個選項。 newtio.c_cflag |= CLOCAL | CREAD; 嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁設(shè)置(shzh)波特率設(shè)置波特率有專門的函數(shù),用戶不能直接通過(tnggu)位掩碼來操作。設(shè)置波特率的主要函數(shù)有cfsetispeed和cfsetospeed。這兩個函數(shù)的使用很簡單,如下所示: cfsetispeed
39、( &newtio, B115200 );cfsetospeed ( &newtio, B115200 );一般情況下,用戶需將輸入輸出函數(shù)的波特率設(shè)置成一樣的。這幾個函數(shù)在成功時返回0,失敗時返回-1。 波特率決定了串口通訊 的速率,每一個數(shù)據(jù)位 的寬度等于傳送波特率 的倒數(shù)嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁設(shè)置(shzh)數(shù)據(jù)位數(shù)與設(shè)置波特率不同(b tn),設(shè)置數(shù)據(jù)位數(shù)并沒有現(xiàn)成可用的函數(shù),需要用位掩碼。一般首先去除數(shù)據(jù)位中的位掩碼,再重新按要求設(shè)置。如下所示: options.c_cflag &= CSIZE; options. c_cflag |= CS8;嵌入式系統(tǒng)
40、及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁 設(shè)置(shzh)奇偶校驗位設(shè)置奇偶校驗位需要用到兩個termio中的成員:c_cflag和c_iflag。首先要激活(j hu)c_cflag中的檢驗位使能標(biāo)志PARENB和是否要進(jìn)行偶校驗標(biāo)志,同時還要激活c_iflag中的奇偶校驗使能。嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁如使能奇校驗(xio yn)時,代碼如下所示: newtio.c_cflag |= PARENB;newtio.c_cflag |= PARODD;newtio.c_iflag |= (INPCK | ISTRIP);而使能偶校驗(xio yn)時,代碼為: newt
41、io.c_cflag |= PARENB;newtio.c_cflag &= PARODD;newtio.c_iflag |= (INPCK | ISTRIP);newtio.c_cflag &= PARENB; 無校驗,代碼為: 嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁設(shè)置(shzh)停止位設(shè)置停止(tngzh)位是通過激活c_cflag中的CSTOPB而實現(xiàn)的。若停止位為1,則清除CSTOPB,若停止位為2,則激活CSTOPB。下面是停止位是1時的代碼: newtio.c_cflag &= CSTOPB; 嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁設(shè)置(shzh)最少字符
42、和等待時間在對接收字符和等待時間沒有特別要求的情況下,可以將其設(shè)置(shzh)為0,如下所示: newtio.c_ccVTIME = 0;newtio.c_ccVMIN = 0;嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁處理要寫入的引用(ynyng)對象由于串口在重新設(shè)置(shzh)之后,在此之前要寫入的引用對象要重新處理,這時就可調(diào)用函數(shù)tcflush(fd, queue_selector)來處理要寫入引用的對象。對于尚未傳輸?shù)臄?shù)據(jù),或者收到的但是尚未讀取的數(shù)據(jù),其處理方法取決于queue_selector的值。 這里,queue_selector可能的取值有以下幾種。TCIFLUS
43、H:刷新收到的數(shù)據(jù)但是不讀;TCOFLUSH:刷新寫入的數(shù)據(jù)但是不傳送;TCIOFLUSH:同時刷新收到的數(shù)據(jù)但是不讀,刷新寫入的數(shù)據(jù)但是不傳送。 tcflush(fd, TCIFLUSH); 嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁激活(j hu)配置在完成全部串口配置之后(zhhu),要撤活剛才的配置并使配置生效。這里用到的函數(shù)是tcsetattr,它的函數(shù)原型是: tcsetattr(fd, OPTION, &newtio) 嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁TCSANOW:改變的配置立即生效。TCSADRAIN:改變的配置在所有(suyu)寫入fd的輸出都結(jié)束
44、后生效。TCSAFLUSH:改變的配置在所有寫入fd引用對象的輸出都被結(jié)束 后生效,所有已接受但未讀入的輸入都在改變發(fā)生前 丟棄。這里的newtio就是termios類型的變量(binling),OPTION可能的取值有以下三種:該函數(shù)若調(diào)用成功則返回0,若失敗則返回-1。if(tcsetattr(fd,TCSANOW, &newtio) != 0) perror(“com set error”); return -1;嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁程序(chngx)示例下面給出了串口配置的完整的函數(shù)。為了函數(shù)的通用性,將常用的選項都在函數(shù)中列出,這樣可以方便調(diào)試(dio
45、sh)使用。 嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁int set_opt(int fd, int nSpeed, int nBits, char nEvent, int nStop) struct termios newtio, oldtio/*保存測試現(xiàn)有串口參數(shù)設(shè)置,在這里如果串口號等出錯,會有相關(guān)的出錯信息(xnx)*/ if ( tcgetattr ( fd, &oldtio ) != 0 ) perror ( “Setup Serial 1” ); return -1; bzero(&newtio, sizeof(newtio);/*步驟一,設(shè)置字符大小*/ newti
46、o.c_cflag |= CLOCAL | CREAD; newtio.c_cflag &= CSIZE/*設(shè)置數(shù)據(jù)位*/ switch(nBits) case 7: newtio.c_cflag |= CS7; break; case 8: newtio.c_cflag |= CS8; break; 共一百零六頁/*設(shè)置(shzh)奇偶校驗位*/switch(nEvent) case O: /奇校驗 newtio.c_cflag |= PARENB; newtio.c_cflag |= PARODD; newtio.c_iflag |= (INPCK | ISTRIP); break; ca
47、se E: /偶校驗 newtio.c_iflag |= (INPCK | ISTRIP); newtio.c_cflag |= PARENB; newtio.c_cflag &= PARODD; break; case N: /無校驗 newtio.c_cflag &= PARENB; break;/*設(shè)置波特率*/switch(nSpeed) case 2400: cfsetispeed ( &newtio, B2400 ); cfsetospeed ( &newtio, B2400 ); break;共一百零六頁 case 4800: cfsetispeed ( &newtio, B48
48、00 ); cfsetospeed ( &newtio, B4800 ); break; case 9600: cfsetispeed ( &newtio, B9600 ); cfsetospeed ( &newtio, B9600 ); break; case 115200: cfsetispeed ( &newtio, B115200 ); cfsetospeed ( &newtio, B115200 ); break; case 460800: cfsetispeed ( &newtio, B460800 ); cfsetospeed ( &newtio, B460800 ); brea
49、k; default: cfsetispeed ( &newtio, B9600 ); cfsetospeed ( &newtio, B9600 ); break;共一百零六頁/*設(shè)置停止位*/ if(nStop = = 1) newtio.c_cflag &= CSTOPB; else if(nStop = = 2) newtio.c_cflag |= CSTOPB;/*設(shè)置等待時間和最小接收(jishu)字符*/ newtio.c_ccVTIME = 0; newtio.c_ccVMIN = 0;/*處理未接收字符*/ tcflush(fd, TCIFLUSH);/*激活新配置*/ if(
50、tcsetattr(fd,TCSANOW, &newtio) != 0) perror(“com set error”); return -1; printf(“set done!n”); return 0;共一百零六頁串口使用(shyng)詳解 在配置完串口的相關(guān)屬性后,就可以對串口進(jìn)行打開、讀寫操作了。它所使用的函數(shù)和普通文件讀寫的函數(shù)一樣,都是open、write和read。它們相區(qū)別的只是串口是一個終端設(shè)備,因此在函數(shù)具體參數(shù)的選擇時會有一些區(qū)別。另外,這里(zhl)會用到一些附加的函數(shù),用于測試終端設(shè)備的連接情況等。下面將對其進(jìn)行具體講解。 嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一
51、百零六頁打開(d ki)串口在Linux 下串口文件位于/dev 下,一般在老版本(bnbn)的內(nèi)核中串口一為/dev/ttyS0 ,串口二為 /dev/ttyS1, 在我們的實驗箱中串口設(shè)備位于/dev/tts/下,因為實驗箱中沒有ttyS0這個設(shè)備,所以我們要建立一個連接,如下聽示: /mnt/yaffs cd /dev/dev ln sf /dev/tts/0 ttyS0嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁打開串口和打開普通(ptng)文件一樣,使用的函數(shù)都是open函數(shù)。 int fd;fd = open( /dev/ttyS0, O_RDWR | O_NOCTTY |
52、O_NDELAY); if (-1 = = fd) /* 不能打開(d ki)串口一*/ perror( 提示錯誤!);嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁讀寫串口讀寫串口操作和讀寫普通文件一樣(yyng),使用read、write函數(shù)即可。 嵌入式系統(tǒng)(xtng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁寫串口(發(fā)送數(shù)據(jù))char buffer1024;int Length1024;int nByte;nByte = write(fd, buffer ,Length)嵌入式系統(tǒng)(xtng)及其應(yīng)用重慶大學(xué)電氣(dinq)工程學(xué)院共一百零六頁 讀串口(接收數(shù)據(jù))使用(shyng)文
53、件操作read 函數(shù)讀取數(shù)據(jù), read 函數(shù)返回的字符數(shù)是實際串口收到的字符數(shù)。char buff1024;int Len1024;int readByte = read(fd, buff, Len);嵌入式系統(tǒng)(xtng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁關(guān)閉(gunb)串口關(guān)閉串口就是(jish)關(guān)閉文件。 close(fd);嵌入式系統(tǒng)及其應(yīng)用重慶大學(xué)電氣工程學(xué)院共一百零六頁共一百零六頁#include /*PPSIX 終端控制定義(dngy)*/#include /*標(biāo)準(zhǔn)輸入輸出定義*/#include /*linux 標(biāo)準(zhǔn)函數(shù)定義*/#include /*文件控制定義*/#i
54、nclude #include /*線程庫定義*/#define BAUDRATE B115200#define COM1 /dev/ttyS0#define COM2 /dev/ttyS1#define ENDMINITERM 27 /* ESC to quit miniterm */#define FALSE 0#define TRUE 1volatile int STOP=FALSE;volatile int fd;void child_handler(int s) printf(stop!n); STOP=TRUE;/*-*/struct termio 等所需的頭文件波特率的宏定義(d
55、ngy)串口1和串口2的宏定義ESC鍵的ASCII值的宏定義定義變量是“易變”的信號處理函數(shù)共一百零六頁void* keyboard(void * data) int c; for (;) c=getchar(); if( c= ENDMINITERM) STOP=TRUE; break ; return NULL;/*-*/* modem input handler */void* receive(void * data) int c; printf(read modemn); while (STOP=FALSE) read(fd,&c,1); /* com port */ write(1,&c,1); /* stdout */ 鍵盤處理(chl)線程函數(shù)獲取一個(y )字符串口接收處理線程函數(shù)讀串口函數(shù),從串口讀取一個數(shù)據(jù)將接收到的數(shù)據(jù)打印顯示出來共一百零六頁 printf(exit from reading modemn)
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度新能源儲能設(shè)施建設(shè)與租賃合同4篇
- 2025年度新能源汽車充電樁電工安裝與運營合同4篇
- 2025年度數(shù)據(jù)中心建設(shè)承包技師服務(wù)協(xié)議3篇
- 2025年度油氣儲罐環(huán)保改造項目合同范本4篇
- 2024版聯(lián)合開發(fā)合同(新能源技術(shù))
- 2025年版產(chǎn)業(yè)園區(qū)招商引資代理服務(wù)合同6篇
- 2025年度快遞收派服務(wù)外包管理合同4篇
- 2025年度個人房地產(chǎn)投資融資委托服務(wù)協(xié)議4篇
- 2025年度行政效能監(jiān)察合作協(xié)議書2篇
- 2025年榆林神木精益化工有限公司招聘筆試參考題庫含答案解析
- 常見老年慢性病防治與護(hù)理課件整理
- 履約情況證明(共6篇)
- 云南省迪慶藏族自治州各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名居民村民委員會明細(xì)
- 設(shè)備機(jī)房出入登記表
- 六年級語文-文言文閱讀訓(xùn)練題50篇-含答案
- 醫(yī)用冰箱溫度登記表
- 零售學(xué)(第二版)第01章零售導(dǎo)論
- 大學(xué)植物生理學(xué)經(jīng)典05植物光合作用
- 口袋妖怪白金光圖文攻略2周目
- 光伏發(fā)電站集中監(jiān)控系統(tǒng)通信及數(shù)據(jù)標(biāo)準(zhǔn)
- 三年級下冊生字組詞(帶拼音)
評論
0/150
提交評論