串口通信中用到的函數Word版_第1頁
串口通信中用到的函數Word版_第2頁
串口通信中用到的函數Word版_第3頁
串口通信中用到的函數Word版_第4頁
串口通信中用到的函數Word版_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Linux C語言中open函數int open( const char * pathname, int flags); int open( const char * pathname,int flags, mode_t mode); 函數說明參數pathname 指向欲打開的文件路徑字符串。下列是參數flags 所能使用的旗標: O_RDONLY 以只讀方式打開文件 O_WRONLY 以只寫方式打開文件 O_RDWR 以可讀寫方式打開文件。 上述三種旗標是互斥的,也就是不可同時使用,但可與下列的旗標利用OR(|)運算符組合。 O_CREAT 若欲打開的文件不存在則自動建立該文件。 O_EXC

2、L 如果O_CREAT 也被設置,此指令會去檢查文件是否存在。文件若不存在則建立該文件,否則將導致打開文件錯誤。此外,若O_CREAT與O_EXCL同時設置,并且欲打開的文件為符號連接,則會打開文件失敗。 O_NOCTTY 如果欲打開的文件為終端機設備時,則不會將該終端機當成進程控制終端機。 O_TRUNC 若文件存在并且以可寫的方式打開時,此旗標會令文件長度清為0,而原來存于該文件的 資料也會消失。 O_APPEND 當讀寫文件時會從文件尾開始移動,也就是所寫入的數據會以附加的方式加入到文件后面。 O_NONBLOCK 以不可阻斷的方式打開文件,也就是無論有無數據讀取或等待,都會立即返回進程

3、之中。 O_NDELAY 同O_NONBLOCK。 O_SYNC 以同步的方式打開文件。 O_NOFOLLOW 如果參數pathname 所指的文件為一符號連接,則會令打開文件失敗。 O_DIRECTORY 如果參數pathname 所指的文件并非為一目錄,則會令打開文件失敗。 參數mode 組合此為Linux2.2以后特有的旗標,以避免一些系統(tǒng)安全問題。參數mode 則有下列數種組合,只有在建立新文件時才會生效,此外真正建文件時的權限會受到umask值所影響,因此該文件權限應該為(mode-umaks)。 S_IRWXU 00700 權限,代表該文件所有者具有可讀、可寫及可執(zhí)行的權限。 S_

4、IRUSR 或S_IREAD, 00400權限,代表該文件所有者具有可讀取的權限。 C語言中open函數作用:打開和創(chuàng)建文件。 int open(const char *pathname, int oflag, . /* mode_t mode */); 返回值:成功則返回文件描述符,否則返回 -1 對于 open 函數來說,第三個參數(.)僅當創(chuàng)建新文件時(即 使用了O_CREAT 時)才使用,用于指定文件的訪問權限位(access permission bits)。pathname 是待打開/創(chuàng)建文件的路徑名(如 C:/cpp/a.cpp);oflag 用于指定文件的打開/創(chuàng)建模式,這個參

5、數可由以下常量(定義于 fcntl.h)通過邏輯或構成。 O_RDONLY 只讀模式 O_WRONLY 只寫模式 O_RDWR 讀寫模式 打開/創(chuàng)建文件時,至少得使用上述三個常量中的一個。以下常量是選用的: O_APPEND 每次寫操作都寫入文件的末尾 O_CREAT 如果指定文件不存在,則創(chuàng)建這個文件 O_EXCL 如果要創(chuàng)建的文件已存在,則返回 -1,并且修改 errno 的值 O_TRUNC 如果文件存在,并且以只寫/讀寫方式打開,則清空文件全部內容(即將其長度截短為0) O_NOCTTY 如果路徑名指向終端設備,不要把這個設備用作控制終端。 O_NONBLOCK 如果路徑名指向 FIF

6、O/塊文件/字符文件,則把文件的打開和后繼 I/OS_IWUSR 或S_IWRITE,00200 權限,代表該文件所有者具有可寫入的權限。 S_IXUSR 或S_IEXEC, 00100 權限,代表該文件所有者具有可執(zhí)行的權限。 S_IRWXG 00070權限,代表該文件用戶組具有可讀、可寫及可執(zhí)行的權限。 S_IRGRP 00040 權限,代表該文件用戶組具有可讀的權限。 S_IWGRP 00020權限,代表該文件用戶組具有可寫入的權限。 S_IXGRP 00010 權限,代表該文件用戶組具有可執(zhí)行的權限。 S_IRWXO 00007權限,代表其他用戶具有可讀、可寫及可執(zhí)行的權限。 S_IR

7、OTH 00004 權限,代表其他用戶具有可讀的權限 S_IWOTH 00002權限,代表其他用戶具有可寫入的權限。 S_IXOTH 00001 權限,代表其他用戶具有可執(zhí)行的權限。 返回值若所有欲核查的權限都通過了檢查則返回文件描述符,表示成功,只要有一個權限被禁止則返回-1。文件描述符:內核(kernel)利用文件描述符(file descriptor)來訪問文件。文件描述符是非負整數。打開現存文件或新建文件時,內核會返回一個文件描述符。讀寫文件也需要使用文件描述符來指定待讀寫的文件。習慣上,標準輸入(standard input)的文件描述符是 0,標準輸出(standard outpu

8、t)是 1,標準錯誤(standard error)是 2。盡管這種習慣并非 Unix 內核的特性,但是因為一些 shell 和很多應用程序都使用這種習慣,因此,如果內核不遵循這種習慣的話,很多應用程序將不能使用。POSIX 定義了 STDIN_FILENO、STDOUT_FILENO 和 STDERR_FILENO 來代替 0、1、2。這三個符號常量的定義位于頭文件 unistd.h。ioctlioctl是設備驅動程序中對設備的I/O通道進行管理的函數。所謂對I/O通道進行管理,就是對設備的一些特性進行控制,例如串口的傳輸波特率、馬達的轉速等等。它的調用個數int ioctl(int fd,

9、 ind cmd, ); 其中fd就是用戶程序打開設備時使用open函數返回的文件標示符,cmd就是用戶程序對設備的控制命令,至于后面的省略號,那是一些補充參數,一般最多一個,有或沒有是和cmd的意義相關的。 ioctl函數是文件結構中的一個屬性分量,就是說如果你的驅動程序提供了對ioctl的支持,用戶就可以在用戶程序中使用ioctl函數控制設備的I/O通道cmd參數在用戶程序端由一些宏根據設備類型、序列號、傳送方向、數據尺寸等生成,這個整數通過系統(tǒng)調用傳遞到內核中的驅動程序,再由驅動程序使用解碼宏從這個整數中得到設備的類型、序列號、傳送方向、數據尺寸等信息,然后通過switchcase結構進

10、行相應的操作。FIONREAD :     通過由ioctl 的第三個參數指向的整數返回當前在本套接口接收緩沖區(qū)中的字節(jié)數。本特性同樣適用于文件,管道和終端Writessize_t write(int filedes, const void *buf, size_t nbytes);返回值:寫入文檔的字節(jié)數(成功);-1(出錯)write 函數向 filedes 中寫入 nbytes 字節(jié)數據,數據來源為 buf 。返回值一般總是等于 nbytes,否則就是出錯了。常見的出錯原因是磁盤空間滿了或超過了文檔大小限制。Read

11、#include <unistd.h> ssize_t read(int filedes, void *buf, size_t nbytes);返回值:讀取到的字節(jié)數;0(讀到 EOF);-1(出錯)read 函數從 filedes 指定的已打開文檔中讀取 nbytes 字節(jié)到 buf 中。以下幾種情況會導致讀取到的字節(jié)數小于 nbytes :    A. 讀取普通文檔時,讀到文檔末尾還不夠 nbytes 字節(jié)。例如:假如文檔只有 30 字節(jié),而我們想讀取 100字節(jié),那么實際讀到的只有 30 字節(jié),read 函數返回 30 。此時再使用 read 函數作用于這

12、個文檔會導致 read 返回 0 。    B. 從終端設備(terminal device)讀取時,一般情況下每次只能讀取一行。    C. 從網絡讀取時,網絡緩存可能導致讀取的字節(jié)數小于 nbytes 字節(jié)。    D. 讀取 pipe 或 FIFO 時,pipe 或 FIFO 里的字節(jié)數可能小于 nbytes 。    E. 從面向記錄(record-oriented)的設備讀取時,某些面向記錄的設備(如磁帶)每次最多只能返回一個記錄。    F. 在讀取了部分數據時被信號中斷。讀操作始于

13、 cfo 。在成功返回之前,cfo 增加,增量為實際讀取到的字節(jié)數。/* 打開串口*/int open_com1() /*打開串口2函數 */ int fd; fd = open("/tyCo/0",O_CREAT|O_RDWR,0); /*打開串口并返回串口設備文件描述符*/if(fd=ERROR) /*如果不能打開串口1則打印出錯信息*/printf("You cant open port com1!n");else printf("open Com1 successfully!n"); /* 配置串口*/int config_c

14、om1(void) /*串口1配置函數*/ ioctl(fd,FIOSETOPTIONS,OPT_LINE); /*設置串口工作模式為行模式:LINE_MODE */ioctl(fd,FIOBAUDRATE,9600); /*設置串口波特率為9600bps*/ioctl(fd,FIOFLUSH,0); /*清空輸入輸出緩沖*/ioctl(fd,SIO_HW_OPTS_SET,CS8|STOPB|PARENB|PARODD); /*設置 8 位數據位,2位停止位,帶校驗位,奇校驗*/ioctl (fd, FIOSETOPTIONS,OPT_ECHO | OPT_CRMOD | OPT_TANDE

15、M | OPT_7_BIT);printf("set options successfullyn");/* 串口發(fā)送數據 */int send_com1(void) /*向串口1發(fā)送數據函數*/ char *send_buf ="Hello,Data had accept!" /*待發(fā)送數據*/write(fd,send_buf,strlen(send_buf); /*任務阻塞等待寫串口準備完畢*/*關閉串口*/extern STATUS close(fd)close(fd);FD_ZERO(fd_set *fdset);將指定的文件描述符集清空,在對文

16、件描述符集合進行設置前,必須對其進行初始化,如果不清空,由于在系統(tǒng)分配內存空間后,通常并不作清空處理,所以結果是不可知的。  FD_SET(fd_set *fdset);用于在文件描述符集合中增加一個新的文件描述符。 FD_CLR(fd_set *fdset);用于在文件描述符集合中刪除一個文件描述符。  FD_ISSET(int fd,fd_set *fdset);用于測試指定的文件描述符是否在該集合中。 select函數: 系統(tǒng)提供select函數來實現多路復用輸入/輸出模型。原型: #include sys/time.h> #include unistd.h&g

17、t;   int select(int maxfd,fd_set *rdset,fd_set *wrset,fd_set *exset,struct timeval *timeout);int FD_ISSET(int fd,fd_set *fdset) 宏說明:在調用select()函數后,用FD_ISSET來檢測fdset中文件fd有無發(fā)生變化 返回整型,當fd是fdset的子集的時候,返回真,否者返回假。參數maxfd是需要監(jiān)視的最大的文件描述符值+1;rdset需要檢測的可讀文件描述符的集合,wrset可寫文件描述符的集 合exset及異常文件描述符的集合。stru

18、ct timeval結構用于描述一段時間長度,如果在這個時間內,需要監(jiān)視的描述符沒有事件發(fā)生則函數返回,返回值為0。select模型int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);其中參數n表示監(jiān)控的所有fd中最大值1。和select模型緊密結合的四個宏,FD_CLR(int fd, fd_set *set);FD_ISSET(int fd, fd_set *set);FD_SET(int fd, fd_set *set);FD_ZERO(fd_se

19、t *set);理解select模型的關鍵在于理解fd_set,為說明方便,取fd_set長度為1字節(jié),fd_set中的每一bit可以對應一個文件描述符fd。則1字節(jié)長的fd_set最大可以對應8個fd。(1)執(zhí)行fd_set set; FD_ZERO(&set);則set用位表示是0000,0000。(2)若fd5,執(zhí)行FD_SET(fd,&set);后set變?yōu)?001,0000(第5位置為1)(3)若再加入fd2,fd=1,則set變?yōu)?001,0011(4)執(zhí)行select(6,&set,0,0,0)阻塞等待(5)若fd=1,fd=2上都發(fā)生可讀事件,則sele

20、ct返回,此時set變?yōu)?000,0011。注意:沒有事件發(fā)生的fd=5被清空。基于上面的討論,可以輕松得出select模型的特點:(1)可監(jiān)控的文件描述符個數取決與sizeof(fd_set)的值。我這邊服務 器上sizeof(fd_set)512,每bit表示一個文件描述符,則我服務器上支持的最大文件描述符是512*8=4096。據說可調,另有說雖 然可調,但調整上限受于編譯內核時的變量值(2)將fd加入select監(jiān)控集的同時,還要再使用一個數據結構array保存放到select監(jiān)控集中的fd,一是用于再select 返回后,array作為源數據和fd_set進行FD_ISSET判斷。二

21、是select返回后會把以前加入的但并無事件發(fā)生的fd清空,則每次開始 select前都要重新從array取得fd逐一加入(FD_ZERO最先),掃描array的同時取得fd最大值maxfd,用于select的第一個 參數。(3)可見select模型必須在select前循環(huán)array(加fd,取maxfd),select返回后循環(huán)arraytimeout為結構timeval,用來設置select()的等待時間,其結構定義如下    struct timeval        

22、time_t tv_sec;    time_t tv_usec;        返回值    如果參數timeout設為NULL則表示select()沒有timeout。taskDelay(n)使調用該函數的任務延時n個tick(內核時鐘周期)。該任務在指定的時間內主動放棄CPU,除了taskDelay(0)專用于任務調度(將CPU交給同一優(yōu)先級的其他任務)外,任務延時也常用于等待某一外部事件,作為一種定時延時機制。在沒有中斷觸發(fā)時,

23、taskDelay能很方便地實現,且不影響系統(tǒng)整體性能。例如寫數據至EEPROM,EEPROM需要一個內部擦除時間(最大擦除時間為lOms)。以下所提及的一個tick都假設為1667 ms(160 s)??梢院唵蔚卣{用taskDelay(2)來保證數據擦寫完成。taskDelay有接近一1個tick的誤差存在,taskDelay(n)實際上是延時(n-1)tickn tick的時間。延時精度為ln主題:ioctl函數詳細說明 ioctl 函數 本函數影響由fd 參數引用的一個打開的文件。 #include<unistd.h>int 

24、ioctl( int fd, int request, ./* void *arg */ );返回0 :成功    -1 :出錯 第三個參數總是一個指針,但指針的類型依賴于request 參數。我們可以把和網絡相關的請求劃分為6 類:套接口操作文件操作接口操作ARP 高速緩存操作路由表操作流系統(tǒng)下表列出了網絡相關ioctl 請求的request 參數以及arg 地址必須指向的數據類型: 類別Request說明數據類型套接口SIOCATMARKSIOCSPGRPSIO

25、CGPGRP是否位于帶外標記設置套接口的進程ID 或進程組ID獲取套接口的進程ID 或進程組IDintintint 文 件  FIONBINFIOASYNCFIONREADFIOSETOWNFIOGETOWN 設置/ 清除非阻塞I/O 標志設置/ 清除信號驅動異步I/O 標志獲取接收緩存區(qū)中的字節(jié)數設置文件的進程ID 或進程組ID獲取文件的進程ID 或進程組IDintintintintint    接口  

26、        SIOCGIFCONFSIOCSIFADDRSIOCGIFADDRSIOCSIFFLAGSSIOCGIFFLAGSSIOCSIFDSTADDRSIOCGIFDSTADDRSIOCGIFBRDADDRSIOCSIFBRDADDRSIOCGIFNETMASKSIOCSIFNETMASKSIOCGIFMETRICSIOCSIFMETRICSIOCGIFMTUSIOCxxx獲取所有接口的清單設置接口地址獲取接口地址設置接口標志獲取接口標志設置點到點地址獲取點到點地址獲取廣播地址設置廣播地址獲取子網掩碼設置子

27、網掩碼獲取接口的測度設置接口的測度獲取接口MTU(還有很多取決于系統(tǒng)的實現)struct ifconfstruct ifreqstruct ifreqstruct ifreqstruct ifreqstruct ifreqstruct ifreqstruct ifreqstruct ifreqstruct ifreqstruct ifreqstruct ifreqstruct ifreqstruct ifreq ARPSIOCSARPSIOCGARPSIOCDARP創(chuàng)建/ 修改ARP 表項獲取ARP 表項刪除ARP 表項struct arpre

28、qstruct arpreqstruct arpreq路由SIOCADDRTSIOCDELRT增加路徑刪除路徑struct rtentrystruct rtentry流I_xxx    套接口操作:明確用于套接口操作的ioctl 請求有三個, 它們都要求ioctl 的第三個參數是指向某個整數的一個指針。 SIOCATMARK:    如果本套接口的的度指針當前位于帶外標記,那就通過由第三個參數指向的整數返回一個非0 值;否則返回一個0 值。POSIX

29、60;以函數sockatmark 替換本請求。SIOCGPGRP :       通過第三個參數指向的整數返回本套接口的進程ID 或進程組ID ,該ID 指定針對本套接口的SIGIO 或SIGURG 信號的接收進程。本請求和fcntl 的F_GETOWN 命令等效,POSIX 標準化的是fcntl 函數。SIOCSPGRP :     把本套接口的進程ID&

30、#160;或者進程組ID 設置成第三個參數指向的整數,該ID 指定針對本套接口的SIGIO 或SIGURG 信號的接收進程,本請求和fcntl 的F_SETOWN 命令等效,POSIX 標準化的是fcntl 操作。 文件操作:以下5 個請求都要求ioctl 的第三個參數指向一個整數。 FIONBIO :        根據ioctl 的第三個參數指向一個0 或非0&#

31、160;值分別清除或設置本套接口的非阻塞標志。本請求和O_NONBLOCK 文件狀態(tài)標志等效,而該標志通過fcntl 的F_SETFL 命令清除或設置。 FIOASYNC :      根據iocl 的第三個參數指向一個0 值或非0 值分別清除或設置針對本套接口的信號驅動異步I/O 標志,它決定是否收取針對本套接口的異步I/O 信號(SIGIO )。本請求和O_ASYNC 文件狀態(tài)標志等效,而該標志可以通過fcntl

32、 的F_SETFL 命令清除或設置。 FIONREAD :     通過由ioctl 的第三個參數指向的整數返回當前在本套接口接收緩沖區(qū)中的字節(jié)數。本特性同樣適用于文件,管道和終端。 FIOSETOWN :    對于套接口和SIOCSPGRP 等效。FIOGETOWN :    對于套接口和SIOCGPGRP 等效。 接口配置:得到系統(tǒng)中所有接口由SIOC

33、GIFCONF 請求完成,該請求使用ifconf 結構,ifconf 又使用ifreq結構,如下所示: Struct ifconf    int ifc_len;                 / 緩沖區(qū)的大小    union        caddr_t

34、 ifcu_buf;        / input from user->kernel        struct ifreq *ifcu_req;    / return of structures returned    ifc_ifcu; #define  ifc_buf  ifc_ifcu.ifcu_buf    /buff

35、er address#define  ifc_req  ifc_ifcu.ifcu_req    /array of structures returned #define  IFNAMSIZ  16 struct ifreq    char ifr_nameIFNAMSIZ;           / interface name, e.g., “l(fā)e0”  

36、;  union        struct sockaddr ifru_addr;        struct sockaddr ifru_dstaddr;        struct sockaddr ifru_broadaddr;        short ifru_flags;  

37、      int ifru_metric;        caddr_t ifru_data;    ifr_ifru; #define ifr_addr     ifr_ifru.ifru_addr            / address#define ifr_dstaddr 

38、60; ifr_ifru.ifru_dstaddr         / otner end of p-to-p link#define ifr_broadaddr ifr_ifru.ifru_broadaddr    / broadcast address#define ifr_flags     ifr_ifru.ifru_flags        / flags#define ifr_metric    ifr_ifru.ifru_metric      / metric#define ifr_data     

溫馨提示

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

評論

0/150

提交評論