完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
|
相关推荐
1个回答
|
|
通常,在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; }; //设置为特诉波特率,比如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:%sn",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:%sn",strerror(errno)); return -2; } ioctl(tty->fd,TIOCGSERIAL,&ss_set); dprintk("BAUD: success set baud to %d,custom_divisor=%d,baud_base=%dn", 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, }, }; |
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1101 浏览 0 评论
谁有3566+电池+POE充电的方案,有个项目需要用该功能的主板
1348 浏览 0 评论
RK3588的GMAC0与PHY的参考时钟电平匹配问题??????
6943 浏览 1 评论
请问各位大佬,如何解决,瑞芯微 RV1126B 使用 mpp 自带工具 调试时,内核直接报错崩溃!
2151 浏览 0 评论
使用rk3568开发板,核0\\1\\3运行linux,核2运行hal,在核0中怎么关闭核2
2698 浏览 0 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-14 08:13 , Processed in 0.479640 second(s), Total 41, Slave 34 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
2211