• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Linux 下串口編程入門

            Linux 下串口編程入門

            計(jì)算機(jī)串口的引腳定義

            序號(hào) 信號(hào)名稱 符號(hào) 流向 功能
            2 發(fā)送數(shù)據(jù) TXD DTE→DCE DTE發(fā)送串行數(shù)據(jù)
            3 接收數(shù)據(jù) RXD DTE←DCE DTE 接收串行數(shù)據(jù)
            4 請(qǐng)求發(fā)送 RTS DTE→DCE DTE 請(qǐng)求 DCE 將線路切換到發(fā)送方式
            5 允許發(fā)送 CTS DTE←DCE DCE 告訴 DTE 線路已接通可以發(fā)送數(shù)據(jù)
            6 數(shù)據(jù)設(shè)備準(zhǔn)備好 DSR DTE←DCE DCE 準(zhǔn)備好
            7 信號(hào)地        信號(hào)公共地
            8 載波檢測(cè) DCD DTE←DCE 表示 DCE 接收到遠(yuǎn)程載波
            20 數(shù)據(jù)終端準(zhǔn)備好 DTR DTE→DCE DTE 準(zhǔn)備好
            22 振鈴指示 RI DTE←DCE 表示 DCE 與線路接通,出現(xiàn)振鈴
            串口操作

            串口操作需要的頭文件

            #include           /*標(biāo)準(zhǔn)輸入輸出定義*/
            #include /*標(biāo)準(zhǔn)函數(shù)庫(kù)定義*/
            #include /*Unix 標(biāo)準(zhǔn)函數(shù)定義*/
            #include
            #include
            #include /*文件控制定義*/
            #include /*PPSIX 終端控制定義*/
            #include /*錯(cuò)誤號(hào)定義*/

            打開串口

            在 Linux 下串口文件是位于 /dev 下的

            串口一 為 /dev/ttyS0

            串口二 為 /dev/ttyS1

            打開串口是通過(guò)使用標(biāo)準(zhǔn)的文件打開函數(shù)操作:

            int fd; /*以讀寫方式打開串口*/
            fd = open( "/dev/ttyS0", O_RDWR);//| O_NOCTTY | O_NDELAY
            if (-1 == fd)
            {
            /* 不能打開串口一*/
            perror(" 提示錯(cuò)誤!");
            }

            設(shè)置串口

            最基本的設(shè)置串口包括波特率設(shè)置,效驗(yàn)位和停止位設(shè)置。

            串口的設(shè)置主要是設(shè)置 struct termios 結(jié)構(gòu)體的各成員值。

            struct termio
            { unsigned short c_iflag; /* 輸入模式標(biāo)志 */
            unsigned short c_oflag; /* 輸出模式標(biāo)志 */
            unsigned short c_cflag; /* 控制模式標(biāo)志*/
            unsigned short c_lflag; /* local mode flags */
            unsigned char c_line; /* line discipline */
            unsigned char c_cc[NCC]; /* control characters */
            };

            設(shè)置這個(gè)結(jié)構(gòu)體很復(fù)雜,我這里就只說(shuō)說(shuō)常見的一些設(shè)置:

            波特率設(shè)置

            下面是修改波特率的代碼:

            struct  termios Opt;
            tcgetattr(fd, &Opt);
            cfsetispeed(&Opt,B19200); /*設(shè)置為19200Bps*/
            cfsetospeed(&Opt,B19200);
            tcsetattr(fd,TCANOW,&Opt);
            設(shè)置波特率的例子函數(shù):
            /**
            *@brief 設(shè)置串口通信速率
            *@param fd 類型 int 打開串口的文件句柄
            *@param speed 類型 int 串口速度
            *@return void
            */
            int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300,
            B38400, B19200, B9600, B4800, B2400, B1200, B300, };
            int name_arr[] = {38400, 19200, 9600, 4800, 2400, 1200, 300, 38400,
            19200, 9600, 4800, 2400, 1200, 300, };
            void set_speed(int fd, int speed){
            int i;
            int status;
            struct termios Opt;
            tcgetattr(fd, &Opt);
            for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++) {
            if (speed == name_arr[i]) {
            tcflush(fd, TCIOFLUSH);
            cfsetispeed(&Opt, speed_arr[i]);
            cfsetospeed(&Opt, speed_arr[i]);
            status = tcsetattr(fd1, TCSANOW, &Opt);
            if (status != 0) {
            perror("tcsetattr fd1");
            return;
            }
            tcflush(fd,TCIOFLUSH);
            }
            }
            }
            效驗(yàn)位和停止位的設(shè)置:
            無(wú)效驗(yàn)8位 Option.c_cflag &= ~PARENB;
            Option.c_cflag &= ~CSTOPB;
            Option.c_cflag &= ~CSIZE;
            Option.c_cflag |= ~CS8;
            奇效驗(yàn)(Odd)7位 Option.c_cflag |= ~PARENB;
            Option.c_cflag &= ~PARODD;
            Option.c_cflag &= ~CSTOPB;
            Option.c_cflag &= ~CSIZE;
            Option.c_cflag |= ~CS7;
            偶效驗(yàn)(Even)7位 Option.c_cflag &= ~PARENB;
            Option.c_cflag |= ~PARODD;
            Option.c_cflag &= ~CSTOPB;
            Option.c_cflag &= ~CSIZE;
            Option.c_cflag |= ~CS7;
            Space效驗(yàn)7位 Option.c_cflag &= ~PARENB;
            Option.c_cflag &= ~CSTOPB;
            Option.c_cflag &= &~CSIZE;
            Option.c_cflag |= CS8;
            設(shè)置效驗(yàn)的函數(shù):
            /**
            *@brief 設(shè)置串口數(shù)據(jù)位,停止位和效驗(yàn)位
            *@param fd 類型 int 打開的串口文件句柄
            *@param databits 類型 int 數(shù)據(jù)位 取值 為 7 或者8
            *@param stopbits 類型 int 停止位 取值為 1 或者2
            *@param parity 類型 int 效驗(yàn)類型 取值為N,E,O,,S
            */
            int set_Parity(int fd,int databits,int stopbits,int parity)
            {
            struct termios options;
            if ( tcgetattr( fd,&options) != 0) {
            perror("SetupSerial 1");
            return(FALSE);
            }
            options.c_cflag &= ~CSIZE;
            switch (databits) /*設(shè)置數(shù)據(jù)位數(shù)*/
            {
            case 7:
            options.c_cflag |= CS7;
            break;
            case 8:
            options.c_cflag |= CS8;
            break;
            default:
            fprintf(stderr,"Unsupported data size\n"); return (FALSE);
            }
            switch (parity)
            {
            case 'n':
            case 'N':
            options.c_cflag &= ~PARENB; /* Clear parity enable */
            options.c_iflag &= ~INPCK; /* Enable parity checking */
            break;
            case 'o':
            case 'O':
            options.c_cflag |= (PARODD | PARENB); /* 設(shè)置為奇效驗(yàn)*/
            options.c_iflag |= INPCK; /* Disnable parity checking */
            break;
            case 'e':
            case 'E':
            options.c_cflag |= PARENB; /* Enable parity */
            options.c_cflag &= ~PARODD; /* 轉(zhuǎn)換為偶效驗(yàn)*/
            options.c_iflag |= INPCK; /* Disnable parity checking */
            break;
            case 'S':
            case 's': /*as no parity*/
            options.c_cflag &= ~PARENB;
            options.c_cflag &= ~CSTOPB;break;
            default:
            fprintf(stderr,"Unsupported parity\n");
            return (FALSE);
            }
            /* 設(shè)置停止位*/
            switch (stopbits)
            {
            case 1:
            options.c_cflag &= ~CSTOPB;
            break;
            case 2:
            options.c_cflag |= CSTOPB;
            break;
            default:
            fprintf(stderr,"Unsupported stop bits\n");
            return (FALSE);
            }
            /* Set input parity option */
            if (parity != 'n')
            options.c_iflag |= INPCK;
            tcflush(fd,TCIFLUSH);
            options.c_cc[VTIME] = 150; /* 設(shè)置超時(shí)15 seconds*/
            options.c_cc[VMIN] = 0; /* Update the options and do it NOW */
            if (tcsetattr(fd,TCSANOW,&options) != 0)
            {
            perror("SetupSerial 3");
            return (FALSE);
            }
            return (TRUE);
            }

            需要注意的是:

            如果不是開發(fā)終端之類的,只是串口傳輸數(shù)據(jù),而不需要串口來(lái)處理,那么使用原始模式(Raw Mode)方式來(lái)通訊,設(shè)置方式如下:

            options.c_lflag  &= ~(ICANON | ECHO | ECHOE | ISIG);  /*Input*/
            options.c_oflag &= ~OPOST; /*Output*/

            讀寫串口

            設(shè)置好串口之后,讀寫串口就很容易了,把串口當(dāng)作文件讀寫就是。

            發(fā)送數(shù)據(jù)
            char  buffer[1024];int    Length;int    nByte;nByte = write(fd, buffer ,Length)
            讀取串口數(shù)據(jù)

            使用文件操作read函數(shù)讀取,如果設(shè)置為原始模式(Raw Mode)傳輸數(shù)據(jù),那么read函數(shù)返回的字符數(shù)是實(shí)際串口收到的字符數(shù)。

            可以使用操作文件的函數(shù)來(lái)實(shí)現(xiàn)異步讀取,如fcntl,或者select等來(lái)操作。

            char  buff[1024];int    Len;int  readByte = read(fd,buff,Len);

            關(guān)閉串口

            關(guān)閉串口就是關(guān)閉文件。

            close(fd);

            posted on 2009-06-28 23:16 王光平 閱讀(790) 評(píng)論(1)  編輯 收藏 引用 所屬分類: linux世界

            評(píng)論

            # re: Linux 下串口編程入門 2009-06-29 10:35 allen

            "#include"后面的看不見  回復(fù)  更多評(píng)論   

            <2006年7月>
            2526272829301
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            導(dǎo)航

            統(tǒng)計(jì)

            留言簿(4)

            隨筆分類

            隨筆檔案

            搜索

            最新評(píng)論

            久久无码高潮喷水| 久久久精品视频免费观看| 久久99久久成人免费播放| 97热久久免费频精品99| 婷婷国产天堂久久综合五月| 亚洲国产成人久久综合碰| 久久免费观看视频| 手机看片久久高清国产日韩| 久久久久99精品成人片三人毛片 | 亚洲国产日韩综合久久精品| 久久av高潮av无码av喷吹| 欧美日韩成人精品久久久免费看| 精品99久久aaa一级毛片| 无码人妻少妇久久中文字幕 | 91精品国产乱码久久久久久| 精品国产乱码久久久久久1区2区 | 亚洲国产精品久久久久| 国产一区二区精品久久岳| 亚洲精品无码专区久久同性男| 久久免费视频1| 亚洲乱码精品久久久久..| 国产成人精品久久一区二区三区| 久久精品国产亚洲麻豆| 日产久久强奸免费的看| 久久成人国产精品| 久久国产精品免费| 亚洲中文字幕无码久久2020| 久久久久国产精品| 香蕉久久久久久狠狠色| 国产精品久久久久久久久免费| 久久精品国产国产精品四凭| 亚洲中文久久精品无码ww16| 久久精品亚洲一区二区三区浴池| 久久久精品久久久久久| 日韩精品无码久久久久久| 欧美粉嫩小泬久久久久久久| 久久天天躁狠狠躁夜夜网站| 色悠久久久久久久综合网| 国产精品福利一区二区久久| 欧美国产精品久久高清| 久久国产精品-久久精品|