linux和windows下串口的使用_第1頁
linux和windows下串口的使用_第2頁
linux和windows下串口的使用_第3頁
linux和windows下串口的使用_第4頁
linux和windows下串口的使用_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、設(shè)置串口屬性通常有以下幾個步驟: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> /*POSIX 終端控制定義*/#include <errno.h>

2、/*錯誤號定義*/#include <string.h> /*字符串功能函數(shù)*/2. termios結(jié)構(gòu)體struct termios tcflag_t c_iflag; /* 輸入?yún)?shù) */tcflag_t c_oflag;/* 輸出參數(shù) */tcflag_t c_cflag; /* 控制參數(shù)*/tcflag_t c_ispeed; /* 輸入波特率 */tcflag_t c_ospeed; /* 輸出波特率 */cc_t c_line;/* 線控制 */cc_t c_ccNCCS; /* 控制字符*/;3. 設(shè)置波特率struct termios opt;tcgetattr(f

3、d, &Opt);/設(shè)置前先獲取屬性tcflush(fd, TCIOFLUSH);cfsetispeed(&stOpt, DEVICE);/cfgetispeed 獲取波特率cfsetospeed(&stOpt, DEVICE);/cfgetospeedtcsetattr(fd,TCSANOW,&options);/設(shè)置屬性4. 配置串口屬性(包括:數(shù)據(jù)位、校驗位、停止位等)struct termios options;tcgetattr(iCom, & options);/設(shè)置前先獲取tcflush(fd,TCIFLUSH);/清空緩存數(shù)據(jù)tcseta

4、ttr(fd,TCSANOW,&options);/設(shè)置屬性校驗位: 奇校驗:options.c_cflag |= (PARODD | PARENB);/options.c_iflag |= INPCK;/偶校驗:options.c_cflag |= PARENB;options.c_cflag &= PARODD;options.c_iflag |= INPCK;無校驗:options.c_cflag &= PARENB;options.c_iflag &= INPCK;停止位:1位:options.c_cflag &= CSTOPB;/2位:opti

5、ons.c_cflag |= CSTOPB;數(shù)據(jù)位:7位:options.c_cflag &= CSIZE; / options.c_cflag |= CS7;8位:options.c_cflag &= CSIZE; options.c_cflag |= CS8;超時:tcflush(iCom, TCIFLUSH);/清空緩存stOpt.c_ccVTIME = 120; /超時12秒stOpt.c_ccVMIN = 0; /5. 常用屬性PARODD 輸入輸出是奇校驗PARENB允許輸出產(chǎn)生奇偶信息以及輸入的奇偶校驗。INPCK啟用輸入奇偶檢測CSIZE字符長度掩碼。取值為 C

6、S5, CS6, CS7, 或 CS8。CSTOPB設(shè)置兩個停止位,而不是一個。例:Linux下打開串口(9600,n,8,1):/變量聲明td_s32 g_fdCom4 = -1, -1, -1, -1;/串口句柄struct termios stOpt;/打開設(shè)備g_fdCom2 = open("/dev/ttyAMA1", O_RDWR); /| O_NOCTTY | O_NDELAY| O_SYNCtcgetattr(g_fdCom2, &stOpt);tcflush(g_fdCom2, TCIFLUSH);/設(shè)置波特率/cfmakeraw(&stO

7、pt);/存儲屬性嗎?,這句話導(dǎo)致超時設(shè)置失效cfsetispeed(&stOpt, B9600);/cfgetispeed 獲取波特率cfsetospeed(&stOpt, B9600);/cfgetospeed/串口控制屬性配置/*有這個配置,其他配置省略*/tcsetattr(iCom, TCSANOW, &stOpt);/stOpt.c_lflag &= (ICANON | ECHO | ECHOE | ISIG); /Input/stOpt.c_oflag &= OPOST; /Output/數(shù)據(jù)位stOpt.c_cflag &= CS

8、IZE;stOpt.c_cflag |= CS8;/校驗位,奇校驗stOpt.c_cflag &= PARENB; /無校驗stOpt.c_iflag &= INPCK; /不啟用奇偶校驗檢測,若采用無校驗,則不啟用/stOpt.c_iflag |= INPCK; /停止位stOpt.c_cflag &= CSTOPB; /1位停止位 stOpt.c_oflag &= OPOST;/超時tcflush(g_fdCom2, TCIFLUSH);stOpt.c_ccVTIME = 150; /超時15秒stOpt.c_ccVMIN = 0; /cfmakeraw(&

9、amp;stOpt);/存儲屬性嗎?,這句話導(dǎo)致超時設(shè)置失效if (tcsetattr(g_fdCom2,TCSANOW,&stOpt) != 0) printf("set parity errorn"); return -1; Windows下打開串口(9600,n,8,1):/變量聲明:HANDLE hCom; /串口句柄DCBdcpProperty;/打開設(shè)備hCom = CreateFile(_T("COM1"),/COM1口GENERIC_READ|GENERIC_WRITE,/允許讀寫0,/獨(dú)占方式,串口不能共享,故為零NULL,OP

10、EN_EXISTING,/打開而不是創(chuàng)建0,/同步方式、FILE_FLAG_OVERLAPPED表示是異步NULL);if(hCom=(HANDLE)-1)MessageBox(_T("打開COM失敗!");elseMessageBox(_T("串口已打開");/設(shè)定超時/讀超時COMMTIMEOUTS TimeOuts;BOOL bSuccess; TimeOuts.ReadIntervalTimeout=0; TimeOuts.ReadTotalTimeoutMultiplier=100; TimeOuts.ReadTotalTimeoutConst

11、ant=5000;/5秒/在讀一次輸入緩沖區(qū)的內(nèi)容后讀操作就立即返回,/而不管是否讀入了要求的字符。/寫超時TimeOuts.WriteTotalTimeoutMultiplier=5000;TimeOuts.WriteTotalTimeoutConstant=5000;bSuccess = SetCommTimeouts(hCom,&TimeOuts); /設(shè)置超時if (!bSuccess)MessageBox(_T("設(shè)置超時失敗");/配置串口屬性GetCommState(hCom, &dcpProperty); /未獲取則不能設(shè)置/設(shè)置波特率dcp

12、Property.BaudRate = CBR_9600;/波特率/dcpProperty.fParity = -1;/允許奇偶校驗/dcpProperty.Parity = NOPARITY;/奇校驗dcpProperty.StopBits = ONESTOPBIT ;/1位停止位dcpProperty.ByteSize = 8;/通訊字節(jié)數(shù)SetCommState(hCom, &dcpProperty);/清空讀寫緩存PurgeComm(g_hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);/讀寫操作。附錄:DESCRIPTION 描述termios 函數(shù)族提供了

13、一個常規(guī)的終端接口,用于控制非同步通信端口。 這里描述的大部分屬性有一個 termios_p 類型的參數(shù),它是指向一個 termios 結(jié)構(gòu)的指針。這個結(jié)構(gòu)包含了至少下列成員: tcflag_t c_iflag; /* 輸入模式 */tcflag_t c_oflag; /* 輸出模式 */tcflag_t c_cflag; /* 控制模式 */tcflag_t c_lflag; /* 本地模式 */cc_t c_ccNCCS; /* 控制字符 */c_iflag 標(biāo)志常量: IGNBRK 忽略輸入中的 BREAK 狀態(tài)。 BRKINT 如果設(shè)置了 IGNBRK,將忽略 BREAK。如果沒有設(shè)置

14、,但是設(shè)置了 BRKINT,那么 BREAK 將使得輸入和輸出隊列被刷新,如果終端是一個前臺進(jìn)程組的控制終端,這個進(jìn)程組中所有進(jìn)程將收到 SIGINT 信號。如果既未設(shè)置 IGNBRK 也未設(shè)置 BRKINT,BREAK 將視為與 NUL 字符同義,除非設(shè)置了 PARMRK,這種情況下它被視為序列 377 0 0。 IGNPAR 忽略楨錯誤和奇偶校驗錯。 PARMRK 如果沒有設(shè)置 IGNPAR,在有奇偶校驗錯或楨錯誤的字符前插入 377 0。如果既沒有設(shè)置 IGNPAR 也沒有設(shè)置 PARMRK,將有奇偶校驗錯或楨錯誤的字符視為 0。 INPCK 啟用輸入奇偶檢測。 ISTRIP 去掉第八位

15、。 INLCR 將輸入中的 NL 翻譯為 CR。 IGNCR 忽略輸入中的回車。 ICRNL 將輸入中的回車翻譯為新行 (除非設(shè)置了 IGNCR)。 IUCLC (不屬于 POSIX) 將輸入中的大寫字母映射為小寫字母。 IXON 啟用輸出的 XON/XOFF 流控制。 IXANY (不屬于 POSIX.1;XSI) 允許任何字符來重新開始輸出。(?) IXOFF 啟用輸入的 XON/XOFF 流控制。 IMAXBEL (不屬于 POSIX) 當(dāng)輸入隊列滿時響零。Linux 沒有實現(xiàn)這一位,總是將它視為已設(shè)置。 POSIX.1 中定義的 c_oflag 標(biāo)志常量: OPOST 啟用具體實現(xiàn)自行

16、定義的輸出處理。 其余 c_oflag 標(biāo)志常量定義在 POSIX 1003.1-2001 中,除非另外說明。 OLCUC (不屬于 POSIX) 將輸出中的小寫字母映射為大寫字母。 ONLCR (XSI) 將輸出中的新行符映射為回車-換行。 OCRNL 將輸出中的回車映射為新行符 ONOCR 不在第 0 列輸出回車。 ONLRET 不輸出回車。 OFILL 發(fā)送填充字符作為延時,而不是使用定時來延時。 OFDEL (不屬于 POSIX) 填充字符是 ASCII DEL (0177)。如果不設(shè)置,填充字符則是 ASCII NUL。 NLDLY 新行延時掩碼。取值為 NL0 和 NL1。 CRD

17、LY 回車延時掩碼。取值為 CR0, CR1, CR2, 或 CR3。 TABDLY 水平跳格延時掩碼。取值為 TAB0, TAB1, TAB2, TAB3 (或 XTABS)。取值為 TAB3,即 XTABS,將擴(kuò)展跳格為空格 (每個跳格符填充 8 個空格)。(?) BSDLY 回退延時掩碼。取值為 BS0 或 BS1。(從來沒有被實現(xiàn)過) VTDLY 豎直跳格延時掩碼。取值為 VT0 或 VT1。 FFDLY 進(jìn)表延時掩碼。取值為 FF0 或 FF1。 c_cflag 標(biāo)志常量: CBAUD (不屬于 POSIX) 波特率掩碼 (4+1 位)。 CBAUDEX (不屬于 POSIX) 擴(kuò)展

18、的波特率掩碼 (1 位),包含在 CBAUD 中。 (POSIX 規(guī)定波特率存儲在 termios 結(jié)構(gòu)中,并未精確指定它的位置,而是提供了函數(shù) cfgetispeed() 和 cfsetispeed() 來存取它。一些系統(tǒng)使用 c_cflag 中 CBAUD 選擇的位,其他系統(tǒng)使用單獨(dú)的變量,例如 sg_ispeed 和 sg_ospeed 。) CSIZE 字符長度掩碼。取值為 CS5, CS6, CS7, 或 CS8。 CSTOPB 設(shè)置兩個停止位,而不是一個。 CREAD 打開接受者。 PARENB 允許輸出產(chǎn)生奇偶信息以及輸入的奇偶校驗。 PARODD 輸入和輸出是奇校驗。 HUPC

19、L 在最后一個進(jìn)程關(guān)閉設(shè)備后,降低 modem 控制線 (掛斷)。(?) CLOCAL 忽略 modem 控制線。 LOBLK (不屬于 POSIX) 從非當(dāng)前 shell 層阻塞輸出(用于 shl )。(?) CIBAUD (不屬于 POSIX) 輸入速度的掩碼。CIBAUD 各位的值與 CBAUD 各位相同,左移了 IBSHIFT 位。 CRTSCTS (不屬于 POSIX) 啟用 RTS/CTS (硬件) 流控制。 c_lflag 標(biāo)志常量: ISIG 當(dāng)接受到字符 INTR, QUIT, SUSP, 或 DSUSP 時,產(chǎn)生相應(yīng)的信號。 ICANON 啟用標(biāo)準(zhǔn)模式 (canonical

20、 mode)。允許使用特殊字符 EOF, EOL, EOL2, ERASE, KILL, LNEXT, REPRINT, STATUS, 和 WERASE,以及按行的緩沖。 XCASE (不屬于 POSIX; Linux 下不被支持) 如果同時設(shè)置了 ICANON,終端只有大寫。輸入被轉(zhuǎn)換為小寫,除了以 前綴的字符。輸出時,大寫字符被前綴 ,小寫字符被轉(zhuǎn)換成大寫。 ECHO 回顯輸入字符。 ECHOE 如果同時設(shè)置了 ICANON,字符 ERASE 擦除前一個輸入字符,WERASE 擦除前一個詞。 ECHOK 如果同時設(shè)置了 ICANON,字符 KILL 刪除當(dāng)前行。 ECHONL 如果同時設(shè)

21、置了 ICANON,回顯字符 NL,即使沒有設(shè)置 ECHO。 ECHOCTL (不屬于 POSIX) 如果同時設(shè)置了 ECHO,除了 TAB, NL, START, 和 STOP 之外的 ASCII 控制信號被回顯為 X, 這里 X 是比控制信號大 0x40 的 ASCII 碼。例如,字符 0x08 (BS) 被回顯為 H。 ECHOPRT (不屬于 POSIX) 如果同時設(shè)置了 ICANON 和 IECHO,字符在刪除的同時被打印。 ECHOKE (不屬于 POSIX) 如果同時設(shè)置了 ICANON,回顯 KILL 時將刪除一行中的每個字符,如同指定了 ECHOE 和 ECHOPRT 一樣。

22、 DEFECHO (不屬于 POSIX) 只在一個進(jìn)程讀的時候回顯。 FLUSHO (不屬于 POSIX; Linux 下不被支持) 輸出被刷新。這個標(biāo)志可以通過鍵入字符 DISCARD 來開關(guān)。 NOFLSH 禁止在產(chǎn)生 SIGINT, SIGQUIT 和 SIGSUSP 信號時刷新輸入和輸出隊列。 TOSTOP 向試圖寫控制終端的后臺進(jìn)程組發(fā)送 SIGTTOU 信號。 PENDIN (不屬于 POSIX; Linux 下不被支持) 在讀入下一個字符時,輸入隊列中所有字符被重新輸出。(bash 用它來處理 typeahead) IEXTEN 啟用實現(xiàn)自定義的輸入處理。這個標(biāo)志必須與 ICAN

23、ON 同時使用,才能解釋特殊字符 EOL2,LNEXT,REPRINT 和 WERASE,IUCLC 標(biāo)志才有效。 c_cc 數(shù)組定義了特殊的控制字符。符號下標(biāo) (初始值) 和意義為: VINTR (003, ETX, Ctrl-C, or also 0177, DEL, rubout) 中斷字符。發(fā)出 SIGINT 信號。當(dāng)設(shè)置 ISIG 時可被識別,不再作為輸入傳遞。 VQUIT (034, FS, Ctrl-) 退出字符。發(fā)出 SIGQUIT 信號。當(dāng)設(shè)置 ISIG 時可被識別,不再作為輸入傳遞。 VERASE (0177, DEL, rubout, or 010, BS, Ctrl-H

24、, or also #) 刪除字符。刪除上一個還沒有刪掉的字符,但不刪除上一個 EOF 或行首。當(dāng)設(shè)置 ICANON 時可被識別,不再作為輸入傳遞。 VKILL (025, NAK, Ctrl-U, or Ctrl-X, or also ) 終止字符。刪除自上一個 EOF 或行首以來的輸入。當(dāng)設(shè)置 ICANON 時可被識別,不再作為輸入傳遞。 VEOF (004, EOT, Ctrl-D) 文件尾字符。更精確地說,這個字符使得 tty 緩沖中的內(nèi)容被送到等待輸入的用戶程序中,而不必等到 EOL。如果它是一行的第一個字符,那么用戶程序的 read() 將返回 0,指示讀到了 EOF。當(dāng)設(shè)置 IC

25、ANON 時可被識別,不再作為輸入傳遞。 VMIN 非 canonical 模式讀的最小字符數(shù)。 VEOL (0, NUL) 附加的行尾字符。當(dāng)設(shè)置 ICANON 時可被識別。 VTIME 非 canonical 模式讀時的延時,以十分之一秒為單位。 VEOL2 (not in POSIX; 0, NUL) 另一個行尾字符。當(dāng)設(shè)置 ICANON 時可被識別。 VSWTCH (not in POSIX; not supported under Linux; 0, NUL) 開關(guān)字符。(只為 shl 所用。) VSTART (021, DC1, Ctrl-Q) 開始字符。重新開始被 Stop 字符

26、中止的輸出。當(dāng)設(shè)置 IXON 時可被識別,不再作為輸入傳遞。 VSTOP (023, DC3, Ctrl-S) 停止字符。停止輸出,直到鍵入 Start 字符。當(dāng)設(shè)置 IXON 時可被識別,不再作為輸入傳遞。 VSUSP (032, SUB, Ctrl-Z) 掛起字符。發(fā)送 SIGTSTP 信號。當(dāng)設(shè)置 ISIG 時可被識別,不再作為輸入傳遞。 VDSUSP (not in POSIX; not supported under Linux; 031, EM, Ctrl-Y) 延時掛起信號。當(dāng)用戶程序讀到這個字符時,發(fā)送 SIGTSTP 信號。當(dāng)設(shè)置 IEXTEN 和 ISIG,并且系統(tǒng)支持作業(yè)

27、管理時可被識別,不再作為輸入傳遞。 VLNEXT (not in POSIX; 026, SYN, Ctrl-V) 字面上的下一個。引用下一個輸入字符,取消它的任何特殊含義。當(dāng)設(shè)置 IEXTEN 時可被識別,不再作為輸入傳遞。 VWERASE (not in POSIX; 027, ETB, Ctrl-W) 刪除詞。當(dāng)設(shè)置 ICANON 和 IEXTEN 時可被識別,不再作為輸入傳遞。 VREPRINT (not in POSIX; 022, DC2, Ctrl-R) 重新輸出未讀的字符。當(dāng)設(shè)置 ICANON 和 IEXTEN 時可被識別,不再作為輸入傳遞。 VDISCARD (not in

28、POSIX; not supported under Linux; 017, SI, Ctrl-O) 開關(guān):開始/結(jié)束丟棄未完成的輸出。當(dāng)設(shè)置 IEXTEN 時可被識別,不再作為輸入傳遞。 VSTATUS (not in POSIX; not supported under Linux; status request: 024, DC4, Ctrl-T). 這些符號下標(biāo)值是互不相同的,除了 VTIME,VMIN 的值可能分別與 VEOL,VEOF 相同。 (在 non-canonical 模式下,特殊字符的含義更改為延時含義。MIN 表示應(yīng)當(dāng)被讀入的最小字符數(shù)。TIME 是以十分之一秒為單位的計時器。如果同時設(shè)置了它們,read 將等待直到至少讀入一個字符,一旦讀入 MIN 個字符或者從上次讀入字符開始經(jīng)過了

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論