zoukankan      html  css  js  c++  java
  • (笔记)linux增加非标波特率的方法

    1.内核修改
     涉及到的内核文件包括driver/char/tty_ioctl.c和arch/xx/include/asm/termbits.h

     在linux内核中,struct ktermios结构的c_cflags共有5个位用来标注波特率,其中位CBAUDEX表明使用的是POSIX标准波特率还是扩展波特率,
    POSIX规定了16个标准波特率,为B0,B50,B75,B110,B134,B150,B200,B300,B600,B1200,B1800,B2400,B4800,B9600,B19200,B38400,不过遗憾的是,现在
    的USB to Serial芯片能工作的波特率远远大于B38400(例如PL2303最高波特率可以到12M bps),这些非标的波特率,只能使用CBAUDEX标志来使用了.
     毫无疑问,5位的值,最多能支持32种不同的波特率.

     例如对于pl2303,驱动支持3M/6M/12M bps,因此可以在内核中增加三个波特率B3000000,B6000000,B12000000.
     (1)修改driver/char/tty_ioctl.c中的baud_table[]和baud_bits[]为以下代码:
      static const speed_t baud_table[] =
      {
              0,50,75,110,134,150,200,300,600,1200,1800,2400,4800,9600,19200,38400,/*the POSIX std*/
              57600,115200,
              3000000,6000000,12000000/*pl2303 ext*/
      };
      static const tcflag_t baud_bits[] =
      {
              B0,B50,B75,B110,B134,B150,B200,B300,B600,B1200,B1800,B2400,B4800,B9600,B19200,B38400,B57600,B115200,/*the POSIX std*/
              B3000000,B6000000,B12000000/*pl2303 ext*/
      };
     (2)修改arch/xx/include/asm/termbits.h的Bxxxx定义如下:
      #define  B0     0000000         /* hang up */
      #define  B50    0000001
      #define  B75    0000002
      #define  B110   0000003
      #define  B134   0000004
      #define  B150   0000005
      #define  B200   0000006
      #define  B300   0000007
      #define  B600   0000010
      #define  B1200  0000011
      #define  B1800  0000012
      #define  B2400  0000013
      #define  B4800  0000014
      #define  B9600  0000015
      #define  B19200 0000016
      #define  B38400 0000017

      #define  BOTHER 0010000
      #define  B57600 0010001
      #define  B115200 0010002


      #define B3000000        0010003
      #define B6000000        0010004
      #define B12000000       0010005
      /*后面的波特率本人没有使用到,但如果不定义则内核无法编译通过!*/
      #define   B230400       0010006
      #define   B460800       0010007
      #define   B500000       0010010
      #define   B576000       0010011
      #define   B921600       0010012

     (3)重新编译内核,重启后则新内核将支持B3000000/B6000000/B12000000的波特率
    2.应用层修改
     libc中的cfsetispeed()和cfsetospeed()因为不支持非标波特率,因此调用这两个函数会返回-1,应用程序需要使用如下方式:
     if(baud_rate <= B38400)
     {
      cfsetispeed(&opt,baud_rate);
      cfsetospeed(&opt,baud_rate);
     }
     else
     {
      opt.c_cflag |= CBAUDEX;
      baud_rate -= 4096;/*baud_rate取值为1 ~ 5,分别对应B57600/B115200/B3000000/B6000000/B12000000*/
      cfsetispeed(&opt,baud_rate);
      cfsetospeed(&opt,baud_rate);
     }

  • 相关阅读:
    浏览器缓存机制
    linux mail命令用法
    linux下Memcached安装以及PHP的调用
    JAVA和C# 3DES加密解密
    C++中函数调用时的三种参数传递方式详解

    const的用法,特别是用在函数前面与后面的区别!
    海底捞的“七宗罪”
    解决Qt5.7.0 cannot find -lGL
    怎么删除桌面右键"打开好桌道壁纸"
  • 原文地址:https://www.cnblogs.com/tdyizhen1314/p/4147565.html
Copyright © 2011-2022 走看看