• <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 下串口編程入門

            計算機串口的引腳定義

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

            串口操作需要的頭文件

            #include           /*標準輸入輸出定義*/
            #include /*標準函數庫定義*/
            #include /*Unix 標準函數定義*/
            #include
            #include
            #include /*文件控制定義*/
            #include /*PPSIX 終端控制定義*/
            #include /*錯誤號定義*/

            打開串口

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

            串口一 為 /dev/ttyS0

            串口二 為 /dev/ttyS1

            打開串口是通過使用標準的文件打開函數操作:

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

            設置串口

            最基本的設置串口包括波特率設置,效驗位和停止位設置。

            串口的設置主要是設置 struct termios 結構體的各成員值。

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

            設置這個結構體很復雜,我這里就只說說常見的一些設置:

            波特率設置

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

            struct  termios Opt;
            tcgetattr(fd, &Opt);
            cfsetispeed(&Opt,B19200); /*設置為19200Bps*/
            cfsetospeed(&Opt,B19200);
            tcsetattr(fd,TCANOW,&Opt);
            設置波特率的例子函數:
            /**
            *@brief 設置串口通信速率
            *@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);
            }
            }
            }
            效驗位和停止位的設置:
            無效驗8位 Option.c_cflag &= ~PARENB;
            Option.c_cflag &= ~CSTOPB;
            Option.c_cflag &= ~CSIZE;
            Option.c_cflag |= ~CS8;
            奇效驗(Odd)7位 Option.c_cflag |= ~PARENB;
            Option.c_cflag &= ~PARODD;
            Option.c_cflag &= ~CSTOPB;
            Option.c_cflag &= ~CSIZE;
            Option.c_cflag |= ~CS7;
            偶效驗(Even)7位 Option.c_cflag &= ~PARENB;
            Option.c_cflag |= ~PARODD;
            Option.c_cflag &= ~CSTOPB;
            Option.c_cflag &= ~CSIZE;
            Option.c_cflag |= ~CS7;
            Space效驗7位 Option.c_cflag &= ~PARENB;
            Option.c_cflag &= ~CSTOPB;
            Option.c_cflag &= &~CSIZE;
            Option.c_cflag |= CS8;
            設置效驗的函數:
            /**
            *@brief 設置串口數據位,停止位和效驗位
            *@param fd 類型 int 打開的串口文件句柄
            *@param databits 類型 int 數據位 取值 為 7 或者8
            *@param stopbits 類型 int 停止位 取值為 1 或者2
            *@param parity 類型 int 效驗類型 取值為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) /*設置數據位數*/
            {
            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); /* 設置為奇效驗*/
            options.c_iflag |= INPCK; /* Disnable parity checking */
            break;
            case 'e':
            case 'E':
            options.c_cflag |= PARENB; /* Enable parity */
            options.c_cflag &= ~PARODD; /* 轉換為偶效驗*/
            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);
            }
            /* 設置停止位*/
            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; /* 設置超時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);
            }

            需要注意的是:

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

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

            讀寫串口

            設置好串口之后,讀寫串口就很容易了,把串口當作文件讀寫就是。

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

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

            可以使用操作文件的函數來實現異步讀取,如fcntl,或者select等來操作。

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

            關閉串口

            關閉串口就是關閉文件。

            close(fd);

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

            評論

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

            "#include"后面的看不見  回復  更多評論   

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

            導航

            統計

            留言簿(4)

            隨筆分類

            隨筆檔案

            搜索

            最新評論

            亚洲欧美伊人久久综合一区二区| 国产欧美久久久精品影院| 日本久久久久亚洲中字幕| 久久精品欧美日韩精品| 国产99精品久久| 日批日出水久久亚洲精品tv| 久久久久久极精品久久久| 色妞色综合久久夜夜| 97超级碰碰碰久久久久| 欧美久久一区二区三区| 国产人久久人人人人爽| 久久婷婷五月综合色99啪ak| 97精品依人久久久大香线蕉97| 精品国产福利久久久| 亚洲欧美日韩精品久久亚洲区 | 亚洲国产欧美国产综合久久| 国产精品无码久久综合| 伊人久久一区二区三区无码| 国产精品久久久久影院色| 人妻无码精品久久亚瑟影视 | 久久精品无码一区二区三区免费| 久久无码专区国产精品发布| 久久91精品久久91综合| 狠狠色丁香婷婷久久综合 | 午夜天堂av天堂久久久| 久久久久免费视频| 国产成人综合久久久久久| 香港aa三级久久三级老师2021国产三级精品三级在 | 久久国语露脸国产精品电影| 2020最新久久久视精品爱| 性高湖久久久久久久久| 欧美黑人激情性久久| 中文字幕精品久久久久人妻| 久久99久久无码毛片一区二区| 国产精品福利一区二区久久| 色综合久久久久无码专区| 久久久久久国产精品美女| 国产精品久久久久久久app| 亚洲国产成人精品91久久久| 欧美精品福利视频一区二区三区久久久精品 | 久久天天躁狠狠躁夜夜2020|