linux串口編程參數(shù)配置詳解重點(diǎn)講義_第1頁(yè)
linux串口編程參數(shù)配置詳解重點(diǎn)講義_第2頁(yè)
linux串口編程參數(shù)配置詳解重點(diǎn)講義_第3頁(yè)
linux串口編程參數(shù)配置詳解重點(diǎn)講義_第4頁(yè)
linux串口編程參數(shù)配置詳解重點(diǎn)講義_第5頁(yè)
已閱讀5頁(yè),還剩26頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、linux串口編程參數(shù)配置詳解1.linux串口編程需要的頭文件#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

2、.h>#include <sys/stat.h>#include <fcntl.h>          /文件控制定義#include <termios.h>     /POSIX中斷控制定義#include <errno.h>        /錯(cuò)誤號(hào)定義2.打開串口串口位于/dev中,可作為標(biāo)準(zhǔn)文件的形式打開,其中:串口1

3、 /dev/ttyS0串口2 /dev/ttyS1代碼如下:int fd;fd = open(“/dev/ttyS0”, O_RDWR);if(fd = -1)    Perror(“串口1打開失??!”);/else    /fcntl(fd, F_SETFL, FNDELAY);除了使用O_RDWR標(biāo)志之外,通常還會(huì)使用O_NOCTTY和O_NDELAY這兩個(gè)標(biāo)志。O_NOCTTY:告訴Unix這個(gè)程序不想成為“控

4、制終端”控制的程序,不說明這個(gè)標(biāo)志的話,任何輸入都會(huì)影響你的程序。O_NDELAY:告訴Unix這個(gè)程序不關(guān)心DCD信號(hào)線狀態(tài),即其他端口是否運(yùn)行,不說明這個(gè)標(biāo)志的話,該程序就會(huì)在DCD信號(hào)線為低電平時(shí)停止。3.設(shè)置波特率最基本的串口設(shè)置包括波特率、校驗(yàn)位和停止位設(shè)置,且串口設(shè)置主要使用termios.h頭文件中定義的termios結(jié)構(gòu),如下:struct termios   tcflag_t  c_iflag;   /輸入模式標(biāo)志   tcflag_t  c_of

5、lag;  /輸出模式標(biāo)志   tcflag_t  c_cflag;  /控制模式標(biāo)志   tcflag_t  c_lflag;   /本地模式標(biāo)志   cc_t   c_line;              /line discipline

6、0;  cc_t   c_ccNCC;    /control characters代碼如下:int speed_arr =  B38400, B19200, B9600, B4800, B2400, B1200, B300, B38400, B19200, B9600, B4800, B2400, B1200, B300, i

7、nt name_arr = 38400, 19200, 9600, 4800, 2400, 1200, 300, 38400, 19200, 9600, 4800, 2400, 1200, 300, void SetSpeed(int fd, int speed)    int i;    stru

8、ct termios Opt;    /定義termios結(jié)構(gòu)    if(tcgetattr(fd, &Opt) != 0)            perror(“tcgetattr fd”);        return;  &

9、#160;     for(i = 0; i < sizeof(speed_arr) / sizeof(int); i+)            if(speed = name_arri)           &#

10、160;        tcflush(fd, TCIOFLUSH);            cfsetispeed(&Opt, speed_arri);            cfsetospeed(&Opt, speed_arri

11、);            if(tcsetattr(fd, TCSANOW, &Opt) != 0)                           

12、60;perror(“tcsetattr fd”);                return;                        tcflush(fd, TCIOF

13、LUSH);            注意tcsetattr函數(shù)中使用的標(biāo)志:TCSANOW:立即執(zhí)行而不等待數(shù)據(jù)發(fā)送或者接受完成。TCSADRAIN:等待所有數(shù)據(jù)傳遞完成后執(zhí)行。TCSAFLUSH:Flush input and output buffers and make the change4.設(shè)置數(shù)據(jù)位、停止位和校驗(yàn)位以下是幾個(gè)數(shù)據(jù)位、停止位和校驗(yàn)位的設(shè)置方法:(以下均為1位停止位)8位數(shù)據(jù)位、無校驗(yàn)位:Opt.c_cflag &= PARENB;Opt.c_

14、cflag &= CSTOPB;Opt.c_cflag &= CSIZE;Opt.c_cflag |= CS8;7位數(shù)據(jù)位、奇校驗(yàn):Opt.c_cflag |= PARENB;Opt.c_cflag |= PARODD;Opt.c_cflag &= CSTOPB;Opt.c_cflag &= CSIZE;Opt.c_cflag |= CS7;7位數(shù)據(jù)位、偶校驗(yàn):Opt.c_cflag |= PARENB;Opt.c_cflag &= PARODD;Opt.c_cflag &= CSTOPB;Opt.c_cflag &= CSIZE;Opt

15、.c_cflag |= CS7;7位數(shù)據(jù)位、Space校驗(yàn):Opt.c_cflag &= PARENB;Opt.c_cflag &= CSTOPB;Opt.c_cflag &= CSIZE;Opt.c_cflag |= CS7;代碼如下:int SetParity(int fd, int databits, int stopbits, int parity)    struct termios Opt;  

16、60; if(tcgetattr(fd, &Opt) != 0)            perror("tcgetattr fd");        return FALSE;       Opt.c_cflag |= (

17、CLOCAL | CREAD);        /一般必設(shè)置的標(biāo)志    switch(databits)        /設(shè)置數(shù)據(jù)位數(shù)        case 7:        Opt.c_cflag

18、60;&= CSIZE;        Opt.c_cflag |= CS7;        break;    case 8:        Opt.c_cflag &= CSIZE;     

19、;   Opt.c_cflag |= CS8;        berak;    default:        fprintf(stderr, "Unsupported data size.n");        re

20、turn FALSE;        switch(parity)            /設(shè)置校驗(yàn)位        case 'n':    case 'N':    

21、0;   Opt.c_cflag &= PARENB;        /清除校驗(yàn)位        Opt.c_iflag &= INPCK;        /enable parity checking    &#

22、160;   break;    case 'o':    case 'O':        Opt.c_cflag |= PARENB;        /enable parity     

23、60;  Opt.c_cflag |= PARODD;        /奇校驗(yàn)        Opt.c_iflag |= INPCK            /disable parity checking   

24、;     break;    case 'e':     case 'E':         Opt.c_cflag |= PARENB;        /enable parity    

25、60;    Opt.c_cflag &= PARODD;        /偶校驗(yàn)         Opt.c_iflag |= INPCK;            /disable pairty checkin

26、g         break;     case 's':     case 'S':         Opt.c_cflag &= PARENB;        /清除校驗(yàn)位  

27、0;      Opt.c_cflag &= CSTOPB;        /?         Opt.c_iflag |= INPCK;            /disable pairty

28、0;checking         break;     default:         fprintf(stderr, "Unsupported parity.n");         return FALSE;     &

29、#160;        switch(stopbits)        /設(shè)置停止位          case 1:         Opt.c_cflag &= CSTOPB;      

30、0;  break;     case 2:         Opt.c_cflag |= CSTOPB;         break;     default:         fprintf(stderr, &quo

31、t;Unsupported stopbits.n");         return FALSE;          opt.c_cflag |= (CLOCAL | CREAD);     opt.c_lflag &= (ICANON | ECHO | ECH

32、OE | ISIG);       opt.c_oflag &= OPOST;     opt.c_oflag &= (ONLCR | OCRNL);    /添加的       opt.c_iflag &= (ICRNL | INLCR);   

33、0; opt.c_iflag &= (IXON | IXOFF | IXANY);    /添加的     tcflush(fd, TCIFLUSH);     Opt.c_ccVTIME = 0;        /設(shè)置超時(shí)為15sec     Opt

34、.c_ccVMIN = 0;        /Update the Opt and do it now     if(tcsetattr(fd, TCSANOW, &Opt) != 0)              perror(&q

35、uot;tcsetattr fd");         return FALSE;          return TRUE; 5.某些設(shè)置項(xiàng)在第四步中我們看到一些比較特殊的設(shè)置,下面簡(jiǎn)述一下他們的作用。c_cc數(shù)組的VSTART和VSTOP元素被設(shè)定成DC1和DC3,代表ASCII標(biāo)準(zhǔn)的XON和XOFF字符,如果在傳輸這兩個(gè)字符的時(shí)候就傳不過去,需要把軟件流控制屏蔽,即:Opt.c_iflag

36、&= (IXON | IXOFF | IXANY);有時(shí)候,在用write發(fā)送數(shù)據(jù)時(shí)沒有鍵入回車,信息就發(fā)送不出去,這主要是因?yàn)槲覀冊(cè)谳斎胼敵鰰r(shí)是按照規(guī)范模式接收到回車或換行才發(fā)送,而更多情況下我們是不必鍵入回車或換行的。此時(shí)應(yīng)轉(zhuǎn)換到行方式輸入,不經(jīng)處理直接發(fā)送,設(shè)置如下:Opt.c_lflag &= (ICANON | ECHO | ECHOE | ISIG);還存在這樣的情況:發(fā)送字符0X0d的時(shí)候,往往接收端得到的字符是0X0a,原因是因?yàn)樵诖谠O(shè)置中c_iflag和c_oflag中存在從NL-CR和CR-NL的映射,即串口能把回車和換行當(dāng)成同一個(gè)字符,可以進(jìn)行如下設(shè)置屏

37、蔽之:Opt.c_iflag &= (INLCR | ICRNL | IGNCR);Opt.c_oflag &= (ONLCR | OCRNL);注意:控制符VTIME和VMIN之間有復(fù)雜的關(guān)系。VTIME定義要求等待的時(shí)間(百毫米,通常是unsigned char變量),而VMIN定義了要求等待的最小字節(jié)數(shù)(相比之下,read函數(shù)的第三個(gè)參數(shù)指定了要求讀的最大字節(jié)數(shù))。如果VTIME=0,VMIN=要求等待讀取的最小字節(jié)數(shù),read必須在讀取了VMIN個(gè)字節(jié)的數(shù)據(jù)或者收到一個(gè)信號(hào)才會(huì)返回。如果VTIME=時(shí)間量,VMIN=0,不管能否讀取到數(shù)據(jù),read也要等待VTIME的時(shí)

38、間量。如果VTIME=時(shí)間量,VMIN=要求等待讀取的最小字節(jié)數(shù),那么將從read讀取第一個(gè)字節(jié)的數(shù)據(jù)時(shí)開始計(jì)時(shí),并會(huì)在讀取到VMIN個(gè)字節(jié)或者VTIME時(shí)間后返回。如果VTIME=0,VMIN=0,不管能否讀取到數(shù)據(jù),read都會(huì)立即返回。6.讀寫串口發(fā)送數(shù)據(jù)方式如下,write函數(shù)將返回寫的位數(shù)或者當(dāng)錯(cuò)誤時(shí)為-1。char buffer1024;int length;int nByte;nByte = write(fd, buffer, length);讀取數(shù)據(jù)方式如下,原始數(shù)據(jù)模式下每個(gè)read函數(shù)將返回實(shí)際串口收到的字符數(shù),如果串口中沒有字符可用,回叫將會(huì)阻塞直到以下幾種情況:有字符進(jìn)

39、入;一個(gè)間隔計(jì)時(shí)器失效;錯(cuò)誤發(fā)送。在打開串口成功后,使用fcntl(fd, F_SETFL, FNDELAY)語(yǔ)句,可以使read函數(shù)立即返回而不阻塞。FNDELAY選項(xiàng)使read函數(shù)在串口無字符時(shí)立即返回且為0。char buffer1024;int length;int readByte;readByte = read(fd, buffer, len);注 意:設(shè)置為原始模式傳輸數(shù)據(jù)的話,read函數(shù)返回的字符數(shù)是實(shí)際串口收到的字符數(shù)。Linux下直接用read讀串口可能會(huì)造成堵塞,或者數(shù)據(jù)讀出錯(cuò) 誤,此時(shí)可使用tcntl或者select等函數(shù)實(shí)現(xiàn)異步讀取。用select先查詢com口,再

40、用read去讀就可以避免上述錯(cuò)誤。7.關(guān)閉串口串口作為文件來處理,所以一般的關(guān)閉文件函數(shù)即可:close(fd);8.例子這個(gè)例子中,需要打開串口1,設(shè)置9600波特率、8位數(shù)據(jù)位、1位停止位以及空校驗(yàn),之后利用while語(yǔ)句循環(huán)判斷串口中是否可以讀出數(shù)據(jù),將串口中數(shù)據(jù)連續(xù)讀出后重新寫回到串口中。該程序可與minicom聯(lián)合測(cè)試。#include     <stdio.h>#include     <stdlib.h> #include  &

41、#160;  <unistd.h>  #include     <sys/types.h>#include     <sys/stat.h>#include     <fcntl.h> #include     <termios.h>#include   &#

42、160; <errno.h>   main()    int fd;    int i;    int len;    int n = 0;          char read_buf256;  

43、  char write_buf256;    struct termios opt;         fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY);    /默認(rèn)為阻塞讀方式    if(fd = -1)&#

44、160;           perror("open serial 0n");        exit(0);        tcgetattr(fd, &opt);        

45、0; cfsetispeed(&opt, B9600);    cfsetospeed(&opt, B9600);        if(tcsetattr(fd, TCSANOW, &opt) != 0 )              &

46、#160; perror("tcsetattr error");       return -1;            opt.c_cflag &= CSIZE;       opt.c_cflag |= CS8;   

47、     opt.c_cflag &= CSTOPB;      opt.c_cflag &= PARENB;      opt.c_cflag &= INPCK;     opt.c_cflag |= (CLOCAL | CREAD);      

48、60;opt.c_lflag &= (ICANON | ECHO | ECHOE | ISIG);       opt.c_oflag &= OPOST;     opt.c_oflag &= (ONLCR | OCRNL);    /添加的       

49、opt.c_iflag &= (ICRNL | INLCR);     opt.c_iflag &= (IXON | IXOFF | IXANY);    /添加的          opt.c_ccVTIME = 0;     opt.c_ccVMIN 

50、;= 0;          tcflush(fd, TCIOFLUSH);       printf("configure completen");          if(tcsetattr(fd, TCSANOW, &opt) != 0)     

51、;         perror("serial error");         return -1;          printf("start send and receive datan");      

52、60; while(1)                  n = 0;         len = 0;         bzero(read_buf, sizeof(read_buf);  

53、60; /類似于memset         bzero(write_buf, sizeof(write_buf);           while( (n = read(fd, read_buf, sizeof(read_buf) > 0 )       

54、60;              for(i = len; i < (len + n); i+)                         

55、0;    write_bufi = read_bufi - len;                          len += n;           

56、0;      write_buflen = '0'                        printf("Len %d n", len);        

57、 printf("%s n", write_buf);           n = write(fd, write_buf, len);         printf("write %d charsn",n);        &#

58、160;         sleep(2);      9.附錄c_cflag用于設(shè)置控制參數(shù),除了波特率外還包含以下內(nèi)容: EXTA         External rate clockEXTB         External rate clockCSIZE  &

59、#160;      Bit mask for data bitsCS5         5個(gè)數(shù)據(jù)位CS6         6個(gè)數(shù)據(jù)位CS7         7個(gè)數(shù)據(jù)位CS8        

60、 8個(gè)數(shù)據(jù)位CSTOPB         2個(gè)停止位(清除該標(biāo)志表示1個(gè)停止位PARENB         允許校驗(yàn)位PARODD         使用奇校驗(yàn)(清除該標(biāo)志表示使用偶校驗(yàn))CREAD         Enable r

61、eceiverHUPCL         Hangup (drop DTR) on last closeCLOCAL         Local line do not change “owner” of portLOBLK         Block job control outpuc_cflag標(biāo)志可以定義CLOCAL和C

62、READ,這將確保該程序不被其他端口控制和信號(hào)干擾,同時(shí)串口驅(qū)動(dòng)將讀取進(jìn)入的數(shù)據(jù)。CLOCAL和CREAD通??偸潜皇悄艿?。c_lflag用于設(shè)置本地模式,決定串口驅(qū)動(dòng)如何處理輸入字符,設(shè)置內(nèi)容如下:ISIG            Enable SIGINTR, SIGSUSP, SIGDSUSP, and SIGQUIT signals ICANON         Enab

63、le canonical input (else raw) XCASE         Map uppercase lowercase (obsolete) ECHO         Enable echoing of input characters ECHOE         Echo eras

64、e character as BS-SP-BS ECHOK         Echo NL after kill character ECHONL         Echo NL NOFLSH         Disable flushing of input buffers after inter

65、rupt or quit characters IEXTEN         Enable extended functions ECHOCTL         Echo control characters as char and delete as ? ECHOPRT         Echo

66、erased character as character erased ECHOKE         BS-SP-BS entire line on line kill FLUSHO         Output being flushed PENDIN         Retype pendin

67、g input at next read or input char TOSTOP         Send SIGTTOU for background outputc_iflag用于設(shè)置如何處理串口上接收到的數(shù)據(jù),包含如下內(nèi)容:INPCK         Enable parity check IGNPAR       &#

68、160; Ignore parity errors PARMRK      Mark parity errors ISTRIP         Strip parity bits IXON         Enable software flow control (outgoing) IXOFF &

69、#160;       Enable software flow control (incoming) IXANY         Allow any character to start flow again IGNBRK         Ignore break condition BRKINT 

70、0;       Send a SIGINT when a break condition is detected INLCR         Map NL to CR IGNCR         Ignore CR ICRNL       

71、0; Map CR to NL IUCLC         Map uppercase to lowercase IMAXBEL      Echo BEL on input line too longc_oflag用于設(shè)置如何處理輸出數(shù)據(jù),包含如下內(nèi)容:OPOST         Postprocess output (not

72、 set = raw output) OLCUC         Map lowercase to uppercase ONLCR         Map NL to CR-NL OCRNL         Map CR to NL NOCR    

73、     No CR output at column 0 ONLRET      NL performs CR function OFILL         Use fill characters for delay OFDEL         Fill character i

74、s DEL NLDLY         Mask for delay time needed between lines NL0            No delay for NLs NL1            Delay furthe

75、r output after newline for 100 milliseconds CRDLY      Mask for delay time needed to return carriage to left column CR0            No delay for CRs CR1       &#

76、160;    Delay after CRs depending on current column position CR2            Delay 100 milliseconds after sending CRs CR3            Delay 150 millisec

77、onds after sending CRs TABDLY      Mask for delay time needed after TABs TAB0            No delay for TABs TAB1         Delay after TABs depending on

78、current column position TAB2         Delay 100 milliseconds after sending TABs TAB3         Expand TAB characters to spaces BSDLY      Mask for delay time needed aft

79、er BSs BS0         No delay for BSs BS1         Delay 50 milliseconds after sending BSs VTDLY      Mask for delay time needed after VTs VT0   

80、60;     No delay for VTs VT1         Delay 2 seconds after sending VTs FFDLY      Mask for delay time needed after FFs FF0         No delay

81、for FFs FF1         Delay 2 seconds after sending FFsc_cc定義了控制字符,包含以下內(nèi)容:VINTR  Interrupt  CTRL-C VQUIT  Quit    CTRL-Z VERASE   Erase    Backspace (BS) VKILL  &

82、#160;Kill-line   CTRL-U VEOF   End-of-file   CTRL-D VEOL   End-of-line   Carriage return (CR) VEOL2   Second    end-of-line Line feed (LF) VMIN   Minimum number of characters to read  VSTART

83、   Start flow   CTRL-Q (XON) VSTOP   Stop flow   CTRL-S (XOFF) VTIME   Time to wait for data (tenths of seconds) 分類: C/C+嵌入式linux 串口編程 (2011-04-22 11:21:12)轉(zhuǎn)載標(biāo)簽: 雜談分類: 2010.31.串口操作需要的頭文件#include <stdio.h>

84、         /標(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>

85、;          /文件控制定義#include <termios.h>     /POSIX中斷控制定義#include <errno.h>        /錯(cuò)誤號(hào)定義2.打開串口串口位于/dev中,可作為標(biāo)準(zhǔn)文件的形式打開,其中:串口1 /dev/ttyS0串口2 /dev/ttyS1代碼如下:int fd

86、;fd = open(“/dev/ttyS0”, O_RDWR);if(fd = -1)    Perror(“串口1打開失?。 ?;/else    /fcntl(fd, F_SETFL, FNDELAY);除了使用O_RDWR標(biāo)志之外,通常還會(huì)使用O_NOCTTY和O_NDELAY這兩個(gè)標(biāo)志。O_NOCTTY:告訴Unix這個(gè)程序不想成為“控制終端”控制的程序,不說明這個(gè)標(biāo)志的話,任何輸入都會(huì)影響你的程序。O_NDELAY:告訴Unix這個(gè)程

87、序不關(guān)心DCD信號(hào)線狀態(tài),即其他端口是否運(yùn)行,不說明這個(gè)標(biāo)志的話,該程序就會(huì)在DCD信號(hào)線為低電平時(shí)停止。3.設(shè)置波特率最基本的串口設(shè)置包括波特率、校驗(yàn)位和停止位設(shè)置,且串口設(shè)置主要使用termios.h頭文件中定義的termios結(jié)構(gòu),如下:struct termios   tcflag_t  c_iflag;   /輸入模式標(biāo)志   tcflag_t  c_oflag;  /輸出模式標(biāo)志   tcflag_t&#

88、160; c_cflag;  /控制模式標(biāo)志   tcflag_t  c_lflag;   /本地模式標(biāo)志   cc_t   c_line;              /line discipline   cc_t   c_ccN

89、CC;    /control characters代碼如下:int speed_arr =  B38400, B19200, B9600, B4800, B2400, B1200, B300, B38400, B19200, B9600, B4800, B2400, B1200, B300, int name_arr = 38400, 

90、19200, 9600, 4800, 2400, 1200, 300, 38400, 19200, 9600, 4800, 2400, 1200, 300, void SetSpeed(int fd, int speed)    int i;    struct termios Opt;  

91、0; /定義termios結(jié)構(gòu)    if(tcgetattr(fd, &Opt) != 0)            perror(“tcgetattr fd”);        return;        for(i&

92、#160;= 0; i < sizeof(speed_arr) / sizeof(int); i+)            if(speed = name_arri)                  &

93、#160; tcflush(fd, TCIOFLUSH);            cfsetispeed(&Opt, speed_arri);            cfsetospeed(&Opt, speed_arri);      

94、60;     if(tcsetattr(fd, TCSANOW, &Opt) != 0)                            perror(“tcsetattr fd”); 

95、0;              return;                        tcflush(fd, TCIOFLUSH);      

96、;      注意tcsetattr函數(shù)中使用的標(biāo)志:TCSANOW:立即執(zhí)行而不等待數(shù)據(jù)發(fā)送或者接受完成。TCSADRAIN:等待所有數(shù)據(jù)傳遞完成后執(zhí)行。TCSAFLUSH:Flush input and output buffers and make the change4.設(shè)置數(shù)據(jù)位、停止位和校驗(yàn)位以下是幾個(gè)數(shù)據(jù)位、停止位和校驗(yàn)位的設(shè)置方法:(以下均為1位停止位)8位數(shù)據(jù)位、無校驗(yàn)位:Opt.c_cflag &= PARENB;Opt.c_cflag &= CSTOPB;Opt.c_cflag &= CS

97、IZE;Opt.c_cflag |= CS8;7位數(shù)據(jù)位、奇校驗(yàn):Opt.c_cflag |= PARENB;Opt.c_cflag |= PARODD;Opt.c_cflag &= CSTOPB;Opt.c_cflag &= CSIZE;Opt.c_cflag |= CS7;7位數(shù)據(jù)位、偶校驗(yàn):Opt.c_cflag |= PARENB;Opt.c_cflag &= PARODD;Opt.c_cflag &= CSTOPB;Opt.c_cflag &= CSIZE;Opt.c_cflag |= CS7;7位數(shù)據(jù)位、Space校驗(yàn):Opt.c_cflag

98、 &= PARENB;Opt.c_cflag &= CSTOPB;Opt.c_cflag &= CSIZE;Opt.c_cflag |= CS7;代碼如下:int SetParity(int fd, int databits, int stopbits, int parity)    struct termios Opt;    if(tcgetattr(fd, &Opt)&

99、#160;!= 0)            perror("tcgetattr fd");        return FALSE;       Opt.c_cflag |= (CLOCAL | CREAD);  

100、60;     /一般必設(shè)置的標(biāo)志    switch(databits)        /設(shè)置數(shù)據(jù)位數(shù)        case 7:        Opt.c_cflag &= CSIZE;   &#

101、160;    Opt.c_cflag |= CS7;        break;    case 8:        Opt.c_cflag &= CSIZE;        Opt.c_cflag |=

102、60;CS8;        berak;    default:        fprintf(stderr, "Unsupported data size.n");        return FALSE;    &

103、#160;   switch(parity)            /設(shè)置校驗(yàn)位        case 'n':    case 'N':        Opt.c_cflag &

104、;= PARENB;        /清除校驗(yàn)位        Opt.c_iflag &= INPCK;        /enable parity checking        break;  &

105、#160; case 'o':    case 'O':        Opt.c_cflag |= PARENB;        /enable parity        Opt.c_cflag |= P

106、ARODD;        /奇校驗(yàn)        Opt.c_iflag |= INPCK            /disable parity checking        break;

107、0;   case 'e':    case 'E':        Opt.c_cflag |= PARENB;        /enable parity        Opt.c_cflag 

108、&= PARODD;        /偶校驗(yàn)        Opt.c_iflag |= INPCK;            /disable pairty checking       &#

109、160;break;    case 's':    case 'S':        Opt.c_cflag &= PARENB;        /清除校驗(yàn)位        Opt.c_cflag&

110、#160;&= CSTOPB;        /?        Opt.c_iflag |= INPCK;            /disable pairty checking       

111、; break;    default:        fprintf(stderr, "Unsupported parity.n");        return FALSE;            switch(st

112、opbits)        /設(shè)置停止位        case 1:        Opt.c_cflag &= CSTOPB;        break;    case 2: 

113、;       Opt.c_cflag |= CSTOPB;        break;    default:        fprintf(stderr, "Unsupported stopbits.n");     

114、;   return FALSE;        opt.c_cflag |= (CLOCAL | CREAD);    opt.c_lflag &= (ICANON | ECHO | ECHOE | ISIG);     opt.c_oflag &a

115、mp;= OPOST;    opt.c_oflag &= (ONLCR | OCRNL);    /添加的     opt.c_iflag &= (ICRNL | INLCR);    opt.c_iflag &= (IXON | IXOFF | IXA

116、NY);    /添加的    tcflush(fd, TCIFLUSH);    Opt.c_ccVTIME = 0;        /設(shè)置超時(shí)為15sec    Opt.c_ccVMIN = 0;        /Update

117、 the Opt and do it now    if(tcsetattr(fd, TCSANOW, &Opt) != 0)            perror("tcsetattr fd");        retur

118、n FALSE;        return TRUE;5.某些設(shè)置項(xiàng)在第四步中我們看到一些比較特殊的設(shè)置,下面簡(jiǎn)述一下他們的作用。c_cc數(shù)組的VSTART和VSTOP元素被設(shè)定成DC1和DC3,代表ASCII標(biāo)準(zhǔn)的XON和XOFF字符,如果在傳輸這兩個(gè)字符的時(shí)候就傳不過去,需要把軟件流控制屏蔽,即:Opt.c_iflag &= (IXON | IXOFF | IXANY);有時(shí)候,在用write發(fā)送數(shù)據(jù)時(shí)沒有鍵入回車,信息就發(fā)送不出去,這主要是因?yàn)槲覀冊(cè)谳斎胼敵鰰r(shí)是按照規(guī)范模式接收到回車或換行才發(fā)送,而更多情況下我們是不必鍵入回車或換行的。此時(shí)應(yīng)轉(zhuǎn)

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論