这几天在跟进串口使能流控后收发异常问题,特简单梳理了下应用程序执行write操作的调用流程,在这简单记录下,平台为全志方案
tty_io.c tty_io.c n_tty.c serial_core.c sunxi_uart.c
tty_write()--->do_tty_write()--->n_tty_write()--->uart_write()--->uart_start()--->__uart_start()--->sw_uart_start_tx()
--->sw_uart_irq()--->sw_uart_handle_tx()
有几点注意事项:
1.流控里的RTS、CTS
RTS:request to send, 请求发送,输出口,告诉对端串口设备,本机已准备好接收数据,低有效
CTS: clear to send, 清除发送,输入口,告诉本机串口设备,对端已准备好接收数据,可开始发送数据,低有效
2.linux tty驱动
linux tty驱动内部维护着一个大小为4k的环形缓冲区(UART_XMIT_SIZE),用于临时保存应用层写下来的串口数据,若写满了,则应用层会被暂停写入
3.收发流程
初始时,RTS、CTS为低电平,本机开始发送数据,当对端设备缓冲区满时,会将自己的RTS拉高,告诉对方暂停发送数据。此时如果发送端的应用程序继续写数据的话,会将数据临时写入tty驱动中的环形缓冲区中,当对端处理完数据,重新拉低RTS时,再把缓冲区里的数据一次性发送出去
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)