• <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 王光平 閱讀(783) 評(píng)論(1)  編輯 收藏 引用 所屬分類: linux世界

            評(píng)論

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

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

            <2009年6月>
            31123456
            78910111213
            14151617181920
            21222324252627
            2829301234
            567891011

            導(dǎo)航

            統(tǒng)計(jì)

            留言簿(4)

            隨筆分類

            隨筆檔案

            搜索

            最新評(píng)論

            久久亚洲精品人成综合网| 久久精品国产AV一区二区三区| 亚洲αv久久久噜噜噜噜噜| 久久久噜噜噜久久中文福利| 97久久精品无码一区二区| 青青草国产成人久久91网| 久久se精品一区二区影院| 久久综合九色综合网站| 久久99国产精一区二区三区| 香港aa三级久久三级老师2021国产三级精品三级在 | 香蕉久久永久视频| 亚洲精品乱码久久久久久久久久久久| 久久久久久亚洲Av无码精品专口| 久久香蕉国产线看观看99| 97精品依人久久久大香线蕉97| 精品久久777| 久久午夜无码鲁丝片秋霞| 国产精品女同一区二区久久| 无码伊人66久久大杳蕉网站谷歌| 狠狠狠色丁香婷婷综合久久俺| 日本久久中文字幕| 国产成人精品久久亚洲高清不卡 | 久久精品中文字幕一区| 曰曰摸天天摸人人看久久久| 奇米综合四色77777久久| 久久只有这精品99| 久久综合久久伊人| 久久综合九色欧美综合狠狠| 99热都是精品久久久久久| 成人妇女免费播放久久久| 久久精品国产99国产精品导航| 欧美日韩中文字幕久久久不卡| 久久综合久久久| 久久香蕉国产线看观看99| 久久精品亚洲日本波多野结衣| 性做久久久久久久| 性欧美大战久久久久久久久| 色狠狠久久综合网| 人人妻久久人人澡人人爽人人精品| 一级做a爰片久久毛片看看| 久久无码一区二区三区少妇|