非标准配置linux,剖析非标准波特率的设置和使用于Linux操作系统中

Linux操作系统最近几年的发展超过了微软的想象,大有赶上微软的趋势,于是也就有大部分人开始学习Linux操作系统,通常,在Linux下面,设置串口使用终端IO的相关函数设置,如tcsetattr等函数,Linux内部有一个对常用波特率列表的索引,根据设置的波特率用底层驱动来设置异步通信芯片的寄存器

对于非标准的任意波特率需要用ioctl(fd, TIOCGSERIAL, p)和ioctl(fd, TIOCSSERIAL, p)的配合,ioctl的***一个参数是struct serial_struct *类型,在Linux/serial.h中定义。其中baud_base是基准晶振频率/16,通常是115200,你需要设的是custom_divisor这个值,最终的波特率为baud_base/custom_divisor,比如你需要28800,因为115200/4=28800,所以要设置custom_divisor=4,。

具体过程为,先设置波特率设为38400(tcsetattr),然后用TIOCGSERIAL得到当前的设置,将flags设置ASYNC_SPD_CUST位,设置custom_divisor,***用TIOCSSERIAL设置。

使用setserial其实就是利用上述方法,来设置baud_base, custom_divisor等, 其内部实现就是使用ioctl来进行设置,

另外还可以用硬件更换晶振,根据比例来达到使用一些非标准的波特率的目的.

参考:http://blog.ednchina.com/seam_liu/7181/post.aspx#include

#include

#include

struct serial_t {

int     fd;

char    *device;/*/dev/ttyS0,...*/

int     baud;

int     databit;/*5,6,7,8*/

char    parity;/*O,E,N*/

int    stopbit;/*1,2*/

int    startbit;/*1*/

struct termios    options;

};

//设置为特诉波特率,比如28800int serial_set_speci_baud(struct serial_t *tty,int baud)

{

struct serial_struct ss,ss_set;

cfsetispeed(&tty->options,B38400);

cfsetospeed(&tty->options,B38400);

tcflush(tty->fd,TCIFLUSH);/*handle unrecevie char*/

tcsetattr(tty->fd,TCSANOW,&tty->options);

if((ioctl(tty->fd,TIOCGSERIAL,&ss))<0){

dprintk("BAUD: error to get the serial_struct info:%s\n",strerror(errno));

return -1;

}

ss.flags=ASYNC_SPD_CUST;

ssss.custom_divisor= ss.baud_base / baud;

if((ioctl(tty->fd,TIOCSSERIAL,&ss))<0){

dprintk("BAUD: error to set serial_struct:%s\n",strerror(errno));

return -2;

}

ioctl(tty->fd,TIOCGSERIAL,&ss_set);

dprintk("BAUD: success set baud to %d,custom_divisor=%d,baud_base=%d\n",

baud,ss_set.custom_divisor,ss_set.baud_base);

return 0;

}

用法:只要指定serial_t的baud就可以了static struct serial_t __seri_conf[] = {

[0] = {//connect with b board, ttyS0

.device="/dev/ttyS0",

.baud=28800,

.databit=8,

.parity='N',

.stopbit=1,

},

};

以上就Linux操作系统下非标准波特率的设置和使用。

【责任编辑:小崔 TEL:(010)68476606】

点赞 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值