1005.linux設置串口支持非標準波特率614400

         linux中設置支持非標準波特率614400, 項目中要用到這個波特率,花了幾天,參考了幾個博客,發現資料很少,都大同小異,應用到我的開發板,發現並沒有什麼用。

       故閱讀了一下內核代碼,結合其他大神的博客,終於解決了這個特定的波特率問題。現記錄如下,希望對其他人也能有所幫助。

第1步,修改內核代碼支持B614400

           相關文件共2個,分別是drivers/tty 目錄下 tty_ioctl.c, include/uapi/asm-generic 目錄下 termbits.h

           /////////////////////////////////////////////////////////////修改tty_ioctl.c///////////////////////////////////////////////////////////////////////////

          

 

  1,打開 __sparc__  宏定義

     #define    __sparc__

  2,   修改baud_table數組

      static const speed_t baud_table[] = {
        0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
      9600, 19200, 38400, 57600, 115200, 230400, 460800,
      #ifdef __sparc__
        614400, 921600                                                                                                         
     #else
        500000, 576000, 921600, 1000000, 1152000, 1500000, 2000000,
       2500000, 3000000, 3500000, 4000000
   #endif
 };

3,修改baud_bits 數組

#ifndef __sparc__
  static const tcflag_t baud_bits[] = {
    B0, B50, B75, B110, B134, B150, B200, B300, B600,
    B1200, B1800, B2400, B4800, B9600, B19200, B38400,
    B57600, B115200, B230400, B460800, B500000, B576000,
    B921600, B1000000, B1152000, B1500000, B2000000, B2500000,
    B3000000, B3500000, B4000000
   };  
#else
  static const tcflag_t baud_bits[] = {
      B0, B50, B75, B110, B134, B150, B200, B300, B600,
      B1200, B1800, B2400, B4800, B9600, B19200, B38400,
      B57600, B115200, B230400, B460800,B614400, B921600                                                                                                             
 };  
 #endif
/////////////////////////////////////////////////////////////修改 termbits.h/////////////////////////////////////////////////////////////////////////////////////

需要修改頭文件否則內核編譯不通過.

第2步,修改應用 程序,串口初始化函數.

//設置非標準波特率,
void  serial_init_spec(int fd)
{
    struct termios options;
    tcgetattr(fd, &options);                //讀取終端參數
    options.c_cflag |= ( CLOCAL | CREAD );  //忽略調試解調器線路狀態,使用接受器
    options.c_cflag &= ~CSIZE;              //清目前字符長度
    options.c_cflag &= ~CRTSCTS;            //不實用RTS/CTS控制流
    options.c_cflag |= CS8;                 //字符長度設置爲8
    options.c_cflag &= ~CSTOPB;             //設置一個標誌位
    options.c_iflag |= IGNPAR;              //允許輸入奇偶校驗
    options.c_iflag &= ~(ICRNL | IXON);     //回車不轉換爲換行,不允許輸入時對XON/XOFF>
    options.c_oflag = 0;
    options.c_lflag = 0;

    options.c_cflag |= CBAUDEX; //設置特定波特率的標誌位.

    cfsetispeed(&options, B614400);         //設置波特率爲614400
    cfsetospeed(&options, B614400);
    tcsetattr(fd,TCSANOW,&options);         //設置終端參數

    return;
}

這樣就ok了。 接下來,就可以通過示波器對串口數據進行 監測,查看波特率設置是否正確,每比特位時間大約爲1.627us ,基本就設置成功了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章