嵌入式Linux文件處理與串口通信_(tái)第1頁(yè)
嵌入式Linux文件處理與串口通信_(tái)第2頁(yè)
嵌入式Linux文件處理與串口通信_(tái)第3頁(yè)
嵌入式Linux文件處理與串口通信_(tái)第4頁(yè)
嵌入式Linux文件處理與串口通信_(tái)第5頁(yè)
已閱讀5頁(yè),還剩55頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第6章嵌入式Linux

文件處理與串口通信教材:嵌入式系統(tǒng)設(shè)計(jì)與應(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ū)動(dòng)程序的編寫(xiě)6.1嵌入式Linux的文件處理6.1嵌入式Linux的文件處理由于嵌入式Linux是經(jīng)Linux裁減而來(lái)的,它的系統(tǒng)調(diào)用及用戶(hù)編程接口API與Linux基本上是一致的。6.1.1文件描述符及文件處理1、文件及文件描述符由于在Linux下設(shè)備和目錄都看作是文件,因此,Linux中的文件有4種類(lèi)型:普通文件、目錄文件、鏈接文件和設(shè)備文件。Linux的內(nèi)核利用文件描述符訪(fǎng)問(wèn)文件。文件描述符是非負(fù)整數(shù)。當(dāng)打開(kāi)一個(gè)現(xiàn)存文件或新建一個(gè)文件時(shí),內(nèi)核會(huì)向進(jìn)程返回一個(gè)文件描述符。當(dāng)讀寫(xiě)文件時(shí),也需要使用文件描述符來(lái)指定待讀寫(xiě)的文件。1、文件及文件描述符通常,一個(gè)進(jìn)程啟動(dòng)時(shí),要打開(kāi)3個(gè)文件:標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤處理。標(biāo)準(zhǔn)輸入的文件描述符是0,標(biāo)準(zhǔn)輸出是1,標(biāo)準(zhǔn)錯(cuò)誤處理是2。在POSIX中定義了STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO來(lái)代替0、1、2。這三個(gè)符號(hào)常量的定義位于頭文件unistd.h中。6.1.1文件描述符及文件處理2、系統(tǒng)調(diào)用所謂系統(tǒng)調(diào)用是指操作系統(tǒng)提供給用戶(hù)程序調(diào)用的一組“特殊”接口,用戶(hù)程序可以通過(guò)這組“特殊”接口來(lái)獲得操作系統(tǒng)內(nèi)核提供的服務(wù)。例如用戶(hù)可以通過(guò)進(jìn)程控制相關(guān)的系統(tǒng)調(diào)用來(lái)創(chuàng)建進(jìn)程、實(shí)現(xiàn)進(jìn)程調(diào)度、進(jìn)程管理等。2、系統(tǒng)調(diào)用Linux為了保護(hù)內(nèi)核空間,將程序的運(yùn)行空間分為內(nèi)核空間和用戶(hù)空間,它們?cè)谶壿嬌鲜窍嗷ジ綦x的。用戶(hù)進(jìn)程在通常情況下不允許訪(fǎng)問(wèn)內(nèi)核數(shù)據(jù),也無(wú)法使用內(nèi)核函數(shù),它們只能在用戶(hù)空間操作用戶(hù)數(shù)據(jù),調(diào)用用戶(hù)空間的函數(shù)。當(dāng)用戶(hù)空間的進(jìn)程需要獲得一定的系統(tǒng)服務(wù)(調(diào)用內(nèi)核空間程序),操作系統(tǒng)就利用系統(tǒng)提供給用戶(hù)的“特殊接口”——系統(tǒng)調(diào)用,用戶(hù)進(jìn)程進(jìn)入內(nèi)核空間。進(jìn)行系統(tǒng)調(diào)用時(shí),程序運(yùn)行空間需要從用戶(hù)空間進(jìn)入內(nèi)核空間,處理完后再返回到用戶(hù)空間。3、文件處理Linux系統(tǒng)的文件處理,主要是指進(jìn)行打開(kāi)文件、讀文件、寫(xiě)文件及關(guān)閉文件等I/O操作。大多數(shù)情況下,只需用到5個(gè)函數(shù):open、read、write、lseek

和close。這幾個(gè)函數(shù)不需要經(jīng)過(guò)緩沖就能立即執(zhí)行,因此,被稱(chēng)之為不帶緩存的I/O操作,即每一個(gè)函數(shù)都只調(diào)用內(nèi)核中的一個(gè)系統(tǒng)調(diào)用。6.1.2

open函數(shù)和close函數(shù)1、open函數(shù)

open函數(shù)用于打開(kāi)或創(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ù)返回值:若文件打開(kāi)成功則返回文件描述符,若出錯(cuò)則返回-1。2、close函數(shù)close函數(shù)用于關(guān)閉一個(gè)打開(kāi)的文件,所需要的頭文件為:#include<unistd.h>其函數(shù)為:int

close(int

fd);函數(shù)返回值:若成功為0,若出錯(cuò)為-1。關(guān)閉文件函數(shù)close的參數(shù)fd為文件描述符。3、示例【例6-1】用可讀寫(xiě)方式新建(打開(kāi))一個(gè)文件。文件讀寫(xiě)權(quán)限的表示:數(shù)字0表示無(wú)權(quán)限,數(shù)字1表示可執(zhí)行,數(shù)字2表示寫(xiě)權(quán)限,數(shù)字4表示讀權(quán)限。常用數(shù)字求和來(lái)表示多權(quán)限的組合。例:文件的可讀寫(xiě)權(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】用可讀寫(xiě)方式新建(打開(kāi))一個(gè)文件。

必要的頭文件intmain(void){

intfd;//聲明文件描述符

fd=open(“open_test.c”,O_CREAT|O_TRUNC|O_RDWR,0600);【例6-1】用可讀寫(xiě)方式

新建(打開(kāi))一個(gè)文件。調(diào)用open函數(shù),以可讀寫(xiě)的方式打開(kāi),注意多個(gè)選項(xiàng)用“|”符號(hào)分隔

printf("openfile:open_test.cfiledes=%d\n",fd);

close(fd);}【例6-1】用可讀寫(xiě)方式

新建(打開(kāi))一個(gè)文件。關(guān)閉文件使用交叉編譯方法,宿主機(jī)上用arm-linux-gcc命令編譯程序:#arm-linux-gcc–oopen_armfile_open.c將編譯好的Linux執(zhí)行程序open_arm下載到目標(biāo)板上運(yùn)行#open_armopenfile:open_test.cfiledes=36.1.3

read函數(shù)、write函數(shù)和lseek函數(shù)1、read函數(shù)read函數(shù)從打開(kāi)的文件中讀取數(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則為出錯(cuò)。文件描述符存放數(shù)據(jù)緩沖區(qū)(數(shù)組)指定讀取數(shù)據(jù)大小2、write函數(shù)write函數(shù)用于向打開(kāi)的文件實(shí)現(xiàn)寫(xiě)入數(shù)據(jù)的操作。寫(xiě)操作的位置從文件位置開(kāi)始。調(diào)用write函數(shù)所需要的頭文件:#include<unistd.h>其函數(shù)原型為:ssize_t

write(int

fd,void*buf,size_tcount);函數(shù)返回值為已寫(xiě)入數(shù)據(jù)的字節(jié)數(shù),若返回-1則出錯(cuò)。文件描述符存放數(shù)據(jù)緩沖區(qū)(數(shù)組)指定讀取數(shù)據(jù)大小3、lseek函數(shù)lseek函數(shù)用于將文件指針定位到相應(yīng)的位置,以進(jìn)行讀寫(xiě)操作。調(diào)用lseek函數(shù)所需要的頭文件:#include<unistd.h>#include<sys/types.h>其函數(shù)原型為:off_t

lseek(int

fd,off_toffset,intwhence);函數(shù)返回值為文件指針的新位置,若返回-1則出錯(cuò)。文件描述符位移量位置基點(diǎn):SEEK_SET:文件開(kāi)頭SEEK_CUR:當(dāng)前位置SEEK_END:文件尾部

4、示例【例6-2】創(chuàng)建一新文件,然后對(duì)此文件進(jìn)行讀寫(xiě)操作。設(shè)計(jì)思路與分析:(1)創(chuàng)建新文件(2)將指定內(nèi)容寫(xiě)進(jìn)文件(3)讀取文件內(nèi)容(4)關(guān)閉文件設(shè)計(jì)思路與分析:(1)創(chuàng)建新文件假設(shè)要?jiǎng)?chuàng)建新的文件“aabb.c”,并將其保存到/tmp目錄之下,即其路徑為“/tmp/aabb.c”則:

fd=open("/tmp/aabb.c",O_CREAT|O_TRUNC|O_RDWR,0666);fd為文件描述符文件擁有者、同組用戶(hù)、不同組用戶(hù)均具有讀和寫(xiě)的權(quán)限,則該文件的權(quán)限為666

設(shè)計(jì)思路與分析:(2)將指定內(nèi)容寫(xiě)進(jìn)文件調(diào)用write()函數(shù),將一段文本內(nèi)容寫(xiě)到文件中,需要使用strlen()函數(shù)來(lái)檢測(cè)字符串長(zhǎng)度:

len=strlen(buf);然后調(diào)用write()函數(shù):

write(fd,buf,len);buf為字符串設(shè)計(jì)思路與分析:(3)讀取文件內(nèi)容假設(shè)要讀文件中的前10個(gè)字符,我們首先要調(diào)用lseek()函數(shù)將文件指針移到文件起始處:

lseek(fd,0,SEEK_SET);再調(diào)用read()函數(shù)將其讀出來(lái):

write(fd,buf,len);buf為字符數(shù)組設(shè)計(jì)思路與分析:(4)關(guān)閉文件文件使用完畢后,將其關(guān)閉,這是一個(gè)良好的編程習(xí)慣。

close(fd);實(shí)現(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);}打開(kāi)文件寫(xiě)入數(shù)據(jù)讀取數(shù)據(jù)關(guān)閉文件/*建立新文件aabb.c,并指定讀寫(xiě)操作權(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)容寫(xiě)到指定的文件描述符文件中*/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個(gè)字符*/ 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ì)算機(jī)間使用一根數(shù)據(jù)信號(hào)線(xiàn)(另外需要地線(xiàn)),數(shù)據(jù)在一根數(shù)據(jù)信號(hào)線(xiàn)上一位一位地進(jìn)行傳輸,每一位數(shù)據(jù)都占據(jù)一個(gè)固定的時(shí)間長(zhǎng)度。在串口傳輸中,發(fā)送方為了告訴接收方,新的數(shù)據(jù)字節(jié)分組到達(dá),在每一個(gè)數(shù)據(jù)字節(jié)分組前面有一個(gè)起始位(通常是0),為了讓接收方知道字節(jié)已經(jīng)結(jié)束,在每一個(gè)數(shù)據(jù)字節(jié)分組后面有一個(gè)停止位(通常是1)。接收方一旦檢測(cè)到停止位,接收方會(huì)一直等待,直到下一個(gè)開(kāi)始位。圖6.1串行傳輸數(shù)據(jù)的工作原理嵌入式系統(tǒng)串行通信采用EIARS-232C標(biāo)準(zhǔn),為單向不平衡傳輸方式,信號(hào)電平標(biāo)準(zhǔn)±12V,負(fù)邏輯,即邏輯1(MARKING)表示為信號(hào)電平-12V,邏輯0(SPACING)表示為信號(hào)電平+12V,最大傳送距離15米,最大傳送速率19.6K波特,其傳送序列如圖6.1,平時(shí)線(xiàn)路保持為1,傳送數(shù)據(jù)開(kāi)始時(shí),先發(fā)送起始位(其數(shù)據(jù)值是0),然后傳8(或7,6,5)個(gè)數(shù)據(jù)位(其數(shù)據(jù)值是0,1),接著可傳1位奇偶校驗(yàn)位,最后為1~2個(gè)停止位(其數(shù)據(jù)值是1),由此可見(jiàn),傳送一個(gè)ASCII字符(7位),加上同步信號(hào)最少需9位數(shù)據(jù)位。2、常用信號(hào)引腳與串口通信接線(xiàn)圖6.2串口的連接線(xiàn)

6.2.2嵌入式Linux串口設(shè)置詳解1、起始位通信線(xiàn)路上沒(méi)有數(shù)據(jù)被傳送時(shí),處于邏輯“1”的狀態(tài)。當(dāng)發(fā)送設(shè)備要發(fā)送字符數(shù)據(jù)時(shí),首先發(fā)送一個(gè)邏輯“0”信號(hào),這個(gè)邏輯低電平就是起始位。起始位通過(guò)通信線(xiàn)路傳輸?shù)浇邮斩?,接收端檢測(cè)到這個(gè)低電平后,就開(kāi)始準(zhǔn)備接收數(shù)據(jù)位信號(hào)。起始位所起的作用就是使通信雙方同步。2、數(shù)據(jù)位當(dāng)接收端收到起始位后,開(kāi)始接收數(shù)據(jù)位。數(shù)據(jù)位的個(gè)數(shù)可以是5~8位。在數(shù)據(jù)傳送過(guò)程中,數(shù)據(jù)位從最低有效位開(kāi)始傳送,接收端收到數(shù)據(jù)后,依次將其轉(zhuǎn)換成并行數(shù)據(jù)。3、奇偶校驗(yàn)位數(shù)據(jù)位發(fā)送完后,為了保證數(shù)據(jù)的可靠性,還要再傳送一個(gè)奇偶校驗(yàn)位。奇偶校驗(yàn)用于差錯(cuò)檢測(cè)。如果選擇偶校驗(yàn),則數(shù)據(jù)位和奇偶位的邏輯“1”的個(gè)數(shù)必須為偶數(shù),相反,如果是奇校驗(yàn),數(shù)據(jù)位和奇偶位的邏輯“1”的個(gè)數(shù)為奇數(shù)。4、停止位在奇偶位或數(shù)據(jù)位(當(dāng)無(wú)奇偶校驗(yàn)時(shí))之后發(fā)送停止位。停止位表示一個(gè)數(shù)據(jù)的結(jié)束。它可以是1~2位的低電平。接收端收到停止位后,通信線(xiàn)路便恢復(fù)邏輯“1”的狀態(tài),直到下一個(gè)數(shù)據(jù)的起始位到來(lái)。5、波特率設(shè)置通信線(xiàn)路上傳輸?shù)奈唬ùa元)信號(hào)都必須保持一致的信號(hào)持續(xù)時(shí)間,單位時(shí)間內(nèi)傳送碼元的數(shù)目稱(chēng)為波特率。對(duì)于大多數(shù)嵌入式設(shè)備來(lái)說(shuō),其波特率都設(shè)置為115200。在Linux中,所有的設(shè)備文件一般都位于“/dev”下,其中串口一、串口二所對(duì)應(yīng)的設(shè)備名依次為“/dev/ttyS0”、“/dev/ttyS1”,可以查看在“/dev”下的文件以確認(rèn)。6.2.3

RS232C標(biāo)準(zhǔn)1、電氣特性2、引腳定義3、字符(幀)格式RS232C采用起止式異步通信協(xié)議,其特點(diǎn)是一個(gè)字符接著一個(gè)字符進(jìn)行傳輸,并且傳送一個(gè)字符總是以起始位開(kāi)始,以停止位結(jié)束,字符之間沒(méi)有固定的時(shí)間間隔要求。其傳輸格式如圖6.1所示,每一個(gè)字符的前面都有一位起始位(低電平,邏輯值“0”),字符本身有5~8位數(shù)據(jù)位,接著字符后面是一位校驗(yàn)碼(也可以沒(méi)有校驗(yàn)碼),最后是停止位。停止位后面是不定長(zhǎng)度的空閑位。停止位和空閑位都規(guī)定為高電平(邏輯值“1”),這樣就能保證起始位開(kāi)始處一定有一個(gè)下跳沿,便于接收方識(shí)別。4、握手協(xié)議5、雙機(jī)互連方式(1)無(wú)硬件握手情況(2)DTR和DSR握手情況(3)RTS和CTS握手情況6.2.4串口驅(qū)動(dòng)程序的編寫(xiě)一個(gè)串口驅(qū)動(dòng)程序,通常包括打開(kāi)串口、設(shè)置串口參數(shù)、對(duì)串口進(jìn)行讀寫(xiě)操作等內(nèi)容。1、串口操作需要的頭文件#include<stdio.h>/*標(biāo)準(zhǔn)輸入輸出定義*/#include<stdlib.h>/*標(biāo)準(zhǔn)函數(shù)庫(kù)定義*/#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>/*錯(cuò)誤號(hào)定義*/2、打開(kāi)串口通常嵌入式Linux系統(tǒng)下的串口文件是位于/dev下:串口一為/dev/ttyS0;串口二為/dev/ttyS1。打開(kāi)串口是通過(guò)打開(kāi)函數(shù)open()進(jìn)行的。int

fd;

//文件描述符fd=open(“/dev/ttyS0”,O_RDWR);

//以讀寫(xiě)方式打開(kāi)串口3、設(shè)置串口參數(shù)最基本的串口參數(shù)設(shè)置包括波特率設(shè)置,校驗(yàn)位和停止位設(shè)置。串口的設(shè)置主要是設(shè)置結(jié)構(gòu)體struct

termios

的各成員值。#include<termios.h>struct

termio{

unsignedshortc_iflag; unsignedshortc_oflag; unsignedshortc_cflag; unsignedshor

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論