嵌入式linux串口設置(一)


在linux中,所有的設備文件一般都位於“/dev”下,串口1和串口2對應的設備名依次為“/dev/ttyS0”, “/dev/ttyS1”,而且USB轉串口的設備名通常為“/dev/ttyUSB0”,在linux下對設備的操作方法與對文件的操作方法一樣。

串口開發步驟:

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

#include<termios>

struct termios

{

       Unsigned short c_iflag;            /*輸入模式標志*/

       Unsigned short c_oflag;           /*輸出模式標志*/

       Unsigned short c_cflag;           /*控制模式標志*/

       Unsigned short c_lflag;            /*本地模式標志*/

       Unsigned char c_line ;             /*線路規則*/

       Unsigned char c_cc[NCC];              /*控制特性*/

      Speed_t        c_ispeed;             /*輸入速度*/

     Speed_t        c_ospeed;            /*輸出速度*/

};

串口設置包括波特率設置,檢驗位和停止位設置,主要設置的是c_cflag結構體成員,注意,不能直接對c_cflag成員初始化,而要將其通過與或操作。

 

 

int set_com_config(int fd,int baud_rate, int data_bits,char parity,int stop_bits)

{

       struct termios new_cfg,old_cfg;

       int speed;

      

       /*保存並測試現有串口參數設置,在這里如果串口號等出錯,會有相關出錯信息*/

       if(tcgetattr(fd,&old_cfg) != 0)        /*該函數得到fd指向的終端配置參數,並將它們保存到old_cfg變量中,成功返回0,否則-1*/

       {

              perror("tcgetttr");

              return -1;

       }

      

       /*設置字符大小*/

       new_cfg=old_cfg;

       cfmakeraw(&new_cfg);    /*配置為原始模式*/

       new_cfg.c_cflag &= ~CSIZE;/*用位掩碼清空數據位的設置*/

      

       /*設置波特率*/

       switch(baud_rate)

       {

              case 2400:

                            speed=B2400;

                            break;

           case 4800:

                            speed=B4800;

                            break;

              case 9600:

                            speed=B9600;

                            break;   

              case 19200:

                            speed=B19200;

                            break;                        

              case 38400:

                            speed=B38400;

                            break;

              default:

              case 115200:

                            speed=B115200;

                            break;

       }

       cfsetispeed(&new_cfg,speed);

       cfsetospeed(&new_cfg,speed);

      

       /*設置停止位*/

       switch(data_bits)

       {

              case 7:

                            new_cfg.c_cflag |= CS7;

                            break;

              default:

              case 8:

                            new_cfg.c_cflag |= CS8;

                            break;

       }

      

       /*設置奇偶校驗位*/

       switch(parity)

       {

              default:

              case 'n':

              case 'N':

              {

                     new_cfg.c_cflag &= ~PARENB;

                     new_cfg.c_iflag &= ~INPCK;

              }

              break;

              case 'o':

              case 'O':

              {

                     new_cfg.c_cflag |= (PARODD | PARENB);

                     new_cfg.c_iflag |= INPCK;

              }

              break;

              case 'e':

              case 'E':

              {

                     new_cfg.c_cflag |=  PARENB;

                     new_cfg.c_cflag &= ~PARODD;

                     new_cfg.c_iflag |= INPCK;

              }

              break;

             

       }

      

       /*設置停止位*/

       switch(stopbits)

       {

              default:

              case 1:

                            new_cfg.c_cflag &= ~CSTOPB;

                            break;

              case 2:

                            new_cfg.c_cflag |= CSTOPB;

                            break;

       }

      

       /*設置等待時間和最小接收字符*/

       new_cfg.c_cc[VTIME]=0;

       new_cfg.c_cc[VMIN]=1;

      

       /*處理未接收字符*/

       tcflush(fd,TCIFLUSH);

      

       /*激活新配置*/

       if((tcsetattr(fd,TCSANOW,&new_cfg))!=0)

       {

              perror("tcsetattr");

              return -1;

       }

       return 0;

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM