您的位置:首页 > 运维架构 > Linux

linux中串口如何支持非标准波特率B28800?

2008-03-12 11:11 197 查看
转贴请注明出处,文章来自: blog.csdn.net/chenzhixin

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

#include <termios.h>
#include <sys/ioctl.h>
#include <linux/serial.h>

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;
};

//设置为特诉波特率,比如28800
int 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;
ss.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,
},
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: