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

            評論

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

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

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

            導航

            統計

            留言簿(4)

            隨筆分類

            隨筆檔案

            搜索

            最新評論

            国产精品VIDEOSSEX久久发布| 7777精品久久久大香线蕉| 国产精品久久久久影院嫩草| 国产精品无码久久综合网| 成人a毛片久久免费播放| 欧美一级久久久久久久大| 成人久久精品一区二区三区| 99热热久久这里只有精品68| 久久久久久精品免费免费自慰| 大伊人青草狠狠久久| 欧美粉嫩小泬久久久久久久| 99久久www免费人成精品| 久久国产色AV免费看| 精品国产乱码久久久久久呢| 久久成人影院精品777| 久久九九亚洲精品| 国内精品久久九九国产精品| 麻豆久久| 久久久久久一区国产精品| 无夜精品久久久久久| 久久99精品久久久久久| 色欲综合久久躁天天躁蜜桃| avtt天堂网久久精品| 久久精品成人免费网站| 亚洲精品高清国产一线久久| 久久人搡人人玩人妻精品首页 | 国产综合久久久久久鬼色| 国产69精品久久久久APP下载 | 色偷偷88888欧美精品久久久| 少妇无套内谢久久久久| 国产综合免费精品久久久| 看全色黄大色大片免费久久久| 久久久精品免费国产四虎| 久久国产精品无码HDAV| 亚洲AV日韩AV永久无码久久| 模特私拍国产精品久久| 久久精品夜夜夜夜夜久久| 中文字幕成人精品久久不卡| 日韩久久久久久中文人妻| 99久久夜色精品国产网站| 亚洲午夜久久久久久久久久|