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增加非标波特率的方法的更多相关文章

  1. 【转】Linux C下非特定波特率的配置和使用

    https://blog.csdn.net/jinhongdu/article/details/43413071  对于非标准的任意波特率需要用ioctl(fd, TIOCGSERIAL,  p)和i ...

  2. linux增加,删除用户组,解压缩命令,VIM使用命令

    ln -s 建立软连接 ln -s /usr/bin/fdfs_trackerd     /usr/local/bin ln -s /usr/bin/stop.sh             /usr/ ...

  3. Linux删除非空目录

    Linux下如何删除非空目录   这个问题很basic,不过还是困扰了我一段时间.(这里主要讨论的是命令行模式下)我本来觉得应该使用命令 rmdir但是发现它无法删除非空的目录.后来发现了原来应该使用 ...

  4. Linux下清理内存和Cache方法 /proc/sys/vm/drop_caches

    Linux下清理内存和Cache方法 /proc/sys/vm/drop_caches 频繁的文件访问会导致系统的Cache使用量大增 $ free -m total used free shared ...

  5. 调整Linux磁盘分区的大小的方法

      昨天数据入库时,一直报错,说磁盘满了,,df -h    一看,发现/目录下只有50G空间,已使用49G:我的程序和dbss都安装在/目录下,ftp到的数据放在/data下的一个子目录下,分解完的 ...

  6. MSP430精准配置高速串口波特率的方法

    引言     在实际项目大批量生产调试设备时,笔者发现同样版本的程序在不同设备上运行时效果不一致,一部分设备串口通信正常,另外一部分串口通信不正常.通过示波器对多个设备的串口波特率及系统时钟频率测试, ...

  7. Linux下修改MySQL编码的方法

    有时候因为编码需要修改mysql的编码,windows下修改有图文界面简单一些,linux大家就可以参考下面的方法   默认登录mysql之后可以通过SHOW VARIABLES语句查看系统变量及其值 ...

  8. VMware linux 增加根目录空间 (使用图形分区工具gparted LiveCd)

    写这篇文章的原因: 最近要给服务器Centos上的ruby版本升级,由于是第一次升级,不敢直接在服务器上操作. 所以在我的winxp上装了Vmware ,又在Vmware中装了Centos5.2. 用 ...

  9. linux md5 加密字符串和文件方法

    linux md5 加密字符串和文件方法 MD5算法常常被用来验证网络文件传输的完整性,防止文件被人篡改.MD5全称是报文摘要算法(Message-Digest Algorithm 5),此算法对任意 ...

随机推荐

  1. 如何在 Linux 上设置密码策略

    https://linux.cn/article-2518-1.html 用户帐号管理是系统管理员最重要的工作之一.而密码安全是系统安全中最受关注的一块.在本教程中,我将为大家介绍如何在 Linux ...

  2. tomcat最大并发连接数的修改方法

    转载:http://blog.csdn.net/qysh123/article/details/11678903 这是个很简单的问题,但是搜了一圈,发现大家都写错了.所以这里总结一下: 几乎所有的中文 ...

  3. 每日英语:Six Ways to Modernize Your Car

    AS AUTO MAKERS ADD far-out features to the latest cars at warp speed--everything from futuristic hea ...

  4. 【嵌入式】使用Cross Toolchain构建交叉工具链

    Preface 前面编译linux内核的时候,用各种cross版本都不行啊,真是纠结,于是就想着自己也要会编译交叉工具的方法,然后各种尝试,各种问题啊,最后还是没解决(还有其它事情),步骤我都走熟了, ...

  5. Python 连接数据库 mysql

    python 连接 数据库 import pymysql db = pymysql.connect(host='127.0.0.1',port=3306,user='root',password='r ...

  6. python 创建txt并且写入做追加

    import os def create_str_to_txt(self,date,str_data): """ 创建txt,并且写入 """ ...

  7. 开源搜素引擎——Nutch

    Nutch简介 Nutch 是一个开源Java实现的搜索引擎.它提供了我们运行自己的搜索引擎所需的全部工具.包括全文搜索和Web爬虫. Nutch 是一个开源Java 实现的搜索引擎.它提供了我们运行 ...

  8. RedHat中代理设置

    YUM代理设置 编辑/etc/yum.conf,在最后加入 # Proxy proxy=http://username:password@proxy_ip:port/ 也可以使用proxy_usern ...

  9. 调整图像的灰度级数C++实现

    图像灰度级数我们见得最多的就是256了,如果想调整它的灰度级数,我们可以使用图像库的imadjust函数来作出调整,比如讲256个灰度级变成2个灰度级(也就是二值图了).再举一个例子,原来一幅256个 ...

  10. 在Windows上弄一个redis的docker容器

    [本文出自天外归云的博客园] Docker核心概念简介 镜像是一个面向docker引擎的只读模板,包含了文件系统. 镜像是创建容器的基础,容器类似于一个沙箱,用来运行和隔离应用. 容器是从镜像创建的应 ...