本文主要是介绍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来进行设置,
另外还可以用硬件更换晶振,根据比例来达到使用一些非标准的波特率的目的.
#include <sys/ioctl.h>
#include <linux/serial.h>
int fd;
char *device;/*/dev/ttyS0,...*/
int databit;/*5,6,7,8*/
char parity;/*O,E,N*/
int stopbit;/*1,2*/
int startbit;/*1*/
struct termios options;
};
int serial_set_speci_baud(struct serial_t *tty,int baud)
{
struct serial_struct ss,ss_set;
cfsetospeed(&tty->options,B38400);
tcsetattr(tty->fd,TCSANOW,&tty->options);
dprintk("BAUD: error to get the serial_struct info:%s\n",strerror(errno));
return -1;
}
ss.custom_divisor = ss.baud_base / baud;
dprintk("BAUD: error to set serial_struct:%s\n",strerror(errno));
return -2;
}
dprintk("BAUD: success set baud to %d,custom_divisor=%d,baud_base=%d\n",
baud,ss_set.custom_divisor,ss_set.baud_base);
}
这篇关于linux下非标准波特率的设置和使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!