版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第6章嵌入式Linux
文件處理與串口通信教材:嵌入式系統(tǒng)設(shè)計與應(yīng)用作者:張思民出版:清華大學(xué)出版社第6章嵌入式Linux
文件處理與串口通信
6.1嵌入式Linux的文件處理
6.1.1文件描述符及文件處理
6.1.2
open函數(shù)和close函數(shù)
6.1.3
read函數(shù)、write函數(shù)和lseek函數(shù)6.2嵌入式Linux串口通信技術(shù)
6.2.1嵌入式Linux串口通信基礎(chǔ)
6.2.2嵌入式Linux串口設(shè)置詳解
6.2.3
RS232C標(biāo)準(zhǔn)
6.2.4串口驅(qū)動程序的編寫6.1嵌入式Linux的文件處理6.1嵌入式Linux的文件處理由于嵌入式Linux是經(jīng)Linux裁減而來的,它的系統(tǒng)調(diào)用及用戶編程接口API與Linux基本上是一致的。6.1.1文件描述符及文件處理1、文件及文件描述符由于在Linux下設(shè)備和目錄都看作是文件,因此,Linux中的文件有4種類型:普通文件、目錄文件、鏈接文件和設(shè)備文件。Linux的內(nèi)核利用文件描述符訪問文件。文件描述符是非負(fù)整數(shù)。當(dāng)打開一個現(xiàn)存文件或新建一個文件時,內(nèi)核會向進(jìn)程返回一個文件描述符。當(dāng)讀寫文件時,也需要使用文件描述符來指定待讀寫的文件。1、文件及文件描述符通常,一個進(jìn)程啟動時,要打開3個文件:標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤處理。標(biāo)準(zhǔn)輸入的文件描述符是0,標(biāo)準(zhǔn)輸出是1,標(biāo)準(zhǔn)錯誤處理是2。在POSIX中定義了STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO來代替0、1、2。這三個符號常量的定義位于頭文件unistd.h中。6.1.1文件描述符及文件處理2、系統(tǒng)調(diào)用所謂系統(tǒng)調(diào)用是指操作系統(tǒng)提供給用戶程序調(diào)用的一組“特殊”接口,用戶程序可以通過這組“特殊”接口來獲得操作系統(tǒng)內(nèi)核提供的服務(wù)。例如用戶可以通過進(jìn)程控制相關(guān)的系統(tǒng)調(diào)用來創(chuàng)建進(jìn)程、實現(xiàn)進(jìn)程調(diào)度、進(jìn)程管理等。2、系統(tǒng)調(diào)用Linux為了保護(hù)內(nèi)核空間,將程序的運行空間分為內(nèi)核空間和用戶空間,它們在邏輯上是相互隔離的。用戶進(jìn)程在通常情況下不允許訪問內(nèi)核數(shù)據(jù),也無法使用內(nèi)核函數(shù),它們只能在用戶空間操作用戶數(shù)據(jù),調(diào)用用戶空間的函數(shù)。當(dāng)用戶空間的進(jìn)程需要獲得一定的系統(tǒng)服務(wù)(調(diào)用內(nèi)核空間程序),操作系統(tǒng)就利用系統(tǒng)提供給用戶的“特殊接口”——系統(tǒng)調(diào)用,用戶進(jìn)程進(jìn)入內(nèi)核空間。進(jìn)行系統(tǒng)調(diào)用時,程序運行空間需要從用戶空間進(jìn)入內(nèi)核空間,處理完后再返回到用戶空間。3、文件處理Linux系統(tǒng)的文件處理,主要是指進(jìn)行打開文件、讀文件、寫文件及關(guān)閉文件等I/O操作。大多數(shù)情況下,只需用到5個函數(shù):open、read、write、lseek
和close。這幾個函數(shù)不需要經(jīng)過緩沖就能立即執(zhí)行,因此,被稱之為不帶緩存的I/O操作,即每一個函數(shù)都只調(diào)用內(nèi)核中的一個系統(tǒng)調(diào)用。6.1.2
open函數(shù)和close函數(shù)1、open函數(shù)
open函數(shù)用于打開或創(chuàng)建文件。調(diào)用open函數(shù)所需要的頭文件如下:
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>其函數(shù)為:int
open(constchar*pathname,int
oflag,intperms);函數(shù)返回值:若文件打開成功則返回文件描述符,若出錯則返回-1。2、close函數(shù)close函數(shù)用于關(guān)閉一個打開的文件,所需要的頭文件為:#include<unistd.h>其函數(shù)為:int
close(int
fd);函數(shù)返回值:若成功為0,若出錯為-1。關(guān)閉文件函數(shù)close的參數(shù)fd為文件描述符。3、示例【例6-1】用可讀寫方式新建(打開)一個文件。文件讀寫權(quán)限的表示:數(shù)字0表示無權(quán)限,數(shù)字1表示可執(zhí)行,數(shù)字2表示寫權(quán)限,數(shù)字4表示讀權(quán)限。常用數(shù)字求和來表示多權(quán)限的組合。例:文件的可讀寫權(quán)限可以用數(shù)字0600表示。/*file_open.c*/#include<stdio.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#include<stdlib.h>【例6-1】用可讀寫方式新建(打開)一個文件。
必要的頭文件intmain(void){
intfd;//聲明文件描述符
fd=open(“open_test.c”,O_CREAT|O_TRUNC|O_RDWR,0600);【例6-1】用可讀寫方式
新建(打開)一個文件。調(diào)用open函數(shù),以可讀寫的方式打開,注意多個選項用“|”符號分隔
printf("openfile:open_test.cfiledes=%d\n",fd);
close(fd);}【例6-1】用可讀寫方式
新建(打開)一個文件。關(guān)閉文件使用交叉編譯方法,宿主機(jī)上用arm-linux-gcc命令編譯程序:#arm-linux-gcc–oopen_armfile_open.c將編譯好的Linux執(zhí)行程序open_arm下載到目標(biāo)板上運行#open_armopenfile:open_test.cfiledes=36.1.3
read函數(shù)、write函數(shù)和lseek函數(shù)1、read函數(shù)read函數(shù)從打開的文件中讀取數(shù)據(jù)。調(diào)用read函數(shù)所需要的頭文件:
#include<unistd.h>其函數(shù)原型為:ssize_t
read(int
fd,void*buf,size_tcount);函數(shù)返回值為讀到數(shù)據(jù)的字節(jié)數(shù),若返回值為0,則已經(jīng)到達(dá)文件尾,若返回-1則為出錯。文件描述符存放數(shù)據(jù)緩沖區(qū)(數(shù)組)指定讀取數(shù)據(jù)大小2、write函數(shù)write函數(shù)用于向打開的文件實現(xiàn)寫入數(shù)據(jù)的操作。寫操作的位置從文件位置開始。調(diào)用write函數(shù)所需要的頭文件:#include<unistd.h>其函數(shù)原型為:ssize_t
write(int
fd,void*buf,size_tcount);函數(shù)返回值為已寫入數(shù)據(jù)的字節(jié)數(shù),若返回-1則出錯。文件描述符存放數(shù)據(jù)緩沖區(qū)(數(shù)組)指定讀取數(shù)據(jù)大小3、lseek函數(shù)lseek函數(shù)用于將文件指針定位到相應(yīng)的位置,以進(jìn)行讀寫操作。調(diào)用lseek函數(shù)所需要的頭文件:#include<unistd.h>#include<sys/types.h>其函數(shù)原型為:off_t
lseek(int
fd,off_toffset,intwhence);函數(shù)返回值為文件指針的新位置,若返回-1則出錯。文件描述符位移量位置基點:SEEK_SET:文件開頭SEEK_CUR:當(dāng)前位置SEEK_END:文件尾部
4、示例【例6-2】創(chuàng)建一新文件,然后對此文件進(jìn)行讀寫操作。設(shè)計思路與分析:(1)創(chuàng)建新文件(2)將指定內(nèi)容寫進(jìn)文件(3)讀取文件內(nèi)容(4)關(guān)閉文件設(shè)計思路與分析:(1)創(chuàng)建新文件假設(shè)要創(chuàng)建新的文件“aabb.c”,并將其保存到/tmp目錄之下,即其路徑為“/tmp/aabb.c”則:
fd=open("/tmp/aabb.c",O_CREAT|O_TRUNC|O_RDWR,0666);fd為文件描述符文件擁有者、同組用戶、不同組用戶均具有讀和寫的權(quán)限,則該文件的權(quán)限為666
設(shè)計思路與分析:(2)將指定內(nèi)容寫進(jìn)文件調(diào)用write()函數(shù),將一段文本內(nèi)容寫到文件中,需要使用strlen()函數(shù)來檢測字符串長度:
len=strlen(buf);然后調(diào)用write()函數(shù):
write(fd,buf,len);buf為字符串設(shè)計思路與分析:(3)讀取文件內(nèi)容假設(shè)要讀文件中的前10個字符,我們首先要調(diào)用lseek()函數(shù)將文件指針移到文件起始處:
lseek(fd,0,SEEK_SET);再調(diào)用read()函數(shù)將其讀出來:
write(fd,buf,len);buf為字符數(shù)組設(shè)計思路與分析:(4)關(guān)閉文件文件使用完畢后,將其關(guān)閉,這是一個良好的編程習(xí)慣。
close(fd);實現(xiàn)上述功能的完整程序如下:/*file_rw.c*/#include<unistd.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<stdlib.h>#include<stdio.h>#include<string.h>#defineMAXSIZE/*在主函數(shù)中調(diào)用各功能模塊*/intmain(void){ intfd;fd=open_file(); write_file(fd);read_file(fd);exit_file(fd);}打開文件寫入數(shù)據(jù)讀取數(shù)據(jù)關(guān)閉文件/*建立新文件aabb.c,并指定讀寫操作權(quán)限*/
intopen_file(){intfd;fd=open("/tmp/aabb.c",O_CREAT|O_TRUNC|O_RDWR,0666); printf("openfile:aabb.c,fd=%d\n",fd);return(fd);}
/*調(diào)用函數(shù)write(),將buf的內(nèi)容寫到指定的文件描述符文件中*/intwrite_file(intfd){ inti,size,len; char*buf="Hello!I'mwritingtothisfile!";len=strlen(buf); size=write(fd,buf,len); printf("Write:%s\n",buf);return0;}/*調(diào)用函數(shù)lseek(),將文件指針移到文件起始處,并讀文件中的10個字符*/ intread_file(intfd){ charbuf_r[10]; buf_r[10]='\0'; intsize; lseek(fd,0,SEEK_SET); size=read(fd,buf_r,10); printf("readfromfile:%s\n",buf_r);return0;}/*關(guān)閉文件*/
intexit_file(intfd){ close(fd); printf("Closeaabb.c\n"); exit(0);}6.2嵌入式Linux串口通信技術(shù)6.2.1嵌入式Linux串口通信基礎(chǔ)1、串口通信的工作原理所謂“串口通信”是指外設(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é)分組后面有一個停止位(通常是1)。接收方一旦檢測到停止位,接收方會一直等待,直到下一個開始位。圖6.1串行傳輸數(shù)據(jù)的工作原理嵌入式系統(tǒng)串行通信采用EIARS-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位奇偶校驗位,最后為1~2個停止位(其數(shù)據(jù)值是1),由此可見,傳送一個ASCII字符(7位),加上同步信號最少需9位數(shù)據(jù)位。2、常用信號引腳與串口通信接線圖6.2串口的連接線
6.2.2嵌入式Linux串口設(shè)置詳解1、起始位通信線路上沒有數(shù)據(jù)被傳送時,處于邏輯“1”的狀態(tài)。當(dāng)發(fā)送設(shè)備要發(fā)送字符數(shù)據(jù)時,首先發(fā)送一個邏輯“0”信號,這個邏輯低電平就是起始位。起始位通過通信線路傳輸?shù)浇邮斩?,接收端檢測到這個低電平后,就開始準(zhǔn)備接收數(shù)據(jù)位信號。起始位所起的作用就是使通信雙方同步。2、數(shù)據(jù)位當(dāng)接收端收到起始位后,開始接收數(shù)據(jù)位。數(shù)據(jù)位的個數(shù)可以是5~8位。在數(shù)據(jù)傳送過程中,數(shù)據(jù)位從最低有效位開始傳送,接收端收到數(shù)據(jù)后,依次將其轉(zhuǎn)換成并行數(shù)據(jù)。3、奇偶校驗位數(shù)據(jù)位發(fā)送完后,為了保證數(shù)據(jù)的可靠性,還要再傳送一個奇偶校驗位。奇偶校驗用于差錯檢測。如果選擇偶校驗,則數(shù)據(jù)位和奇偶位的邏輯“1”的個數(shù)必須為偶數(shù),相反,如果是奇校驗,數(shù)據(jù)位和奇偶位的邏輯“1”的個數(shù)為奇數(shù)。4、停止位在奇偶位或數(shù)據(jù)位(當(dāng)無奇偶校驗時)之后發(fā)送停止位。停止位表示一個數(shù)據(jù)的結(jié)束。它可以是1~2位的低電平。接收端收到停止位后,通信線路便恢復(fù)邏輯“1”的狀態(tài),直到下一個數(shù)據(jù)的起始位到來。5、波特率設(shè)置通信線路上傳輸?shù)奈唬ùa元)信號都必須保持一致的信號持續(xù)時間,單位時間內(nèi)傳送碼元的數(shù)目稱為波特率。對于大多數(shù)嵌入式設(shè)備來說,其波特率都設(shè)置為115200。在Linux中,所有的設(shè)備文件一般都位于“/dev”下,其中串口一、串口二所對應(yīng)的設(shè)備名依次為“/dev/ttyS0”、“/dev/ttyS1”,可以查看在“/dev”下的文件以確認(rèn)。6.2.3
RS232C標(biāo)準(zhǔn)1、電氣特性2、引腳定義3、字符(幀)格式RS232C采用起止式異步通信協(xié)議,其特點是一個字符接著一個字符進(jìn)行傳輸,并且傳送一個字符總是以起始位開始,以停止位結(jié)束,字符之間沒有固定的時間間隔要求。其傳輸格式如圖6.1所示,每一個字符的前面都有一位起始位(低電平,邏輯值“0”),字符本身有5~8位數(shù)據(jù)位,接著字符后面是一位校驗碼(也可以沒有校驗碼),最后是停止位。停止位后面是不定長度的空閑位。停止位和空閑位都規(guī)定為高電平(邏輯值“1”),這樣就能保證起始位開始處一定有一個下跳沿,便于接收方識別。4、握手協(xié)議5、雙機(jī)互連方式(1)無硬件握手情況(2)DTR和DSR握手情況(3)RTS和CTS握手情況6.2.4串口驅(qū)動程序的編寫一個串口驅(qū)動程序,通常包括打開串口、設(shè)置串口參數(shù)、對串口進(jìn)行讀寫操作等內(nèi)容。1、串口操作需要的頭文件#include<stdio.h>/*標(biāo)準(zhǔn)輸入輸出定義*/#include<stdlib.h>/*標(biāo)準(zhǔn)函數(shù)庫定義*/#include<unistd.h>/*Unix標(biāo)準(zhǔn)函數(shù)定義*/#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>/*文件控制定義*/#include<termios.h>/*終端控制定義*/#include<errno.h>/*錯誤號定義*/2、打開串口通常嵌入式Linux系統(tǒng)下的串口文件是位于/dev下:串口一為/dev/ttyS0;串口二為/dev/ttyS1。打開串口是通過打開函數(shù)open()進(jìn)行的。int
fd;
//文件描述符fd=open(“/dev/ttyS0”,O_RDWR);
//以讀寫方式打開串口3、設(shè)置串口參數(shù)最基本的串口參數(shù)設(shè)置包括波特率設(shè)置,校驗位和停止位設(shè)置。串口的設(shè)置主要是設(shè)置結(jié)構(gòu)體struct
termios
的各成員值。#include<termios.h>struct
termio{
unsignedshortc_iflag; unsignedshortc_oflag; unsignedshortc_cflag; unsignedshor
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《修改DIY飾品坊》課件
- 醫(yī)院財務(wù)自糾報告范文
- 影像學(xué)診斷兒童肝膽疾病
- 2025年西安貨運從業(yè)資格證模擬考試下載什么軟件
- 2025年遵義貨車從業(yè)資格證考什么
- 教師硬筆書法培訓(xùn)講座
- 2025年安徽貨運從業(yè)資格證技巧
- 《故宮博物院公開》課件
- 《魚類的營養(yǎng)價值》課件
- 《保障安全發(fā)展》課件
- 9《知法守法 依法維權(quán)》(教學(xué)設(shè)計)部編版道德與法治六年級上冊
- 山東省機(jī)場管理集團(tuán)濟(jì)南國際機(jī)場股份有限公司招聘筆試題庫2024
- 2024年全國新能源汽車關(guān)鍵技術(shù)技能大賽考試題庫500題
- NB-T 10641-2021 電動汽車非車載充電機(jī)現(xiàn)場檢測儀
- 2024-2030年中國旋轉(zhuǎn)變壓器行業(yè)市場深度分析及前景趨勢與投資研究報告
- 誠意金合同協(xié)議模板
- 創(chuàng)新創(chuàng)業(yè)實戰(zhàn)案例解析智慧樹知到期末考試答案章節(jié)答案2024年東北農(nóng)業(yè)大學(xué)
- AQ 1083-2011 煤礦建設(shè)安全規(guī)范 (正式版)
- 醫(yī)院醫(yī)學(xué)科研管理制度
- 求職英語完整版本
- 主持人合同協(xié)議書范文模板
評論
0/150
提交評論