免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7631 | 回复: 8
打印 上一主题 下一主题

关于linux串口驱动tty_read()函数的问题?? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-07-25 15:16 |只看该作者 |倒序浏览
我打开的是串口设备:/dev/ttyAMA1,用的是阻塞模式。

然后循环不断的read数据,我可以确定的是串口是有接收到数据的,但是我在应用程式中就是read不到,在内核驱动中跟踪打印,有进入到以下这些函数:serial_in()-->serial8250_handle_port()--->receive chars()--->uart_insert_char()---->tty_insert_flip_char()-->tty_flip_buffer_push()-->flush_to_ldisc()--->n_tty_receive_buf()--->n_tty_receive_char()

可是就是没有进入到tty_read()函数,我网上查到的资料是用户空间的read函数对应的就是内核中的tty_read()函数,可是为什么我没有进入到该函数中呢??是因为我是阻塞模式没有数据阻在那里??还是得达到什么条件才能激活进入该函数??请大家帮我解答一下,十分感谢。。

论坛徽章:
0
2 [报告]
发表于 2012-07-25 15:41 |只看该作者
tty_read()读不到东西会阻塞
tty_read() ----> ld->ops->read() ----> n_tty_read()
n_tty_read()中add_wait_queue(&tty->read_wait, &wait)没有数据的时候上层的read进程阻塞在此

而在串口有数据来的时候n_tty_receive_buf()--->wake_up_interruptible(&tty->read_wait),唤醒上面的read进程
n_tty_read()中会继续运行,将数据拷到用户空间

论坛徽章:
0
3 [报告]
发表于 2012-07-25 15:51 |只看该作者
十分感谢的你的回复,可是在这里我的问题是程序压根就没跑进tty_read()里,后面的 n_tty_read()就更不可能被调用到了,我在我的tty_read()函数一进来的位置加了打印调试,可是并没有看到有打印。我就不知道这tty_read()是被哪个调用的,内核的东西太多,我都看晕了都。。想不通为什么没有运行到该函数?



回复 2# xxw19840406


   

论坛徽章:
0
4 [报告]
发表于 2012-07-25 16:06 |只看该作者
你上层如果是open然后read的话  接着就应该是会调到tty_read()---->n_tty_read()的
至于后面有数据了是不会再主动从头开始跑这个函数的

因为读进程睡在这个函数里面,唤醒之后会从休眠的地方开始往下跑,所以不会重新进入

论坛徽章:
0
5 [报告]
发表于 2012-07-25 17:25 |只看该作者
我这边是循环read数据的,如果第一次成功读到数据了,那第二次read的时候应该还是会重新调用tty_read()吧??还有我发现我的串口2用的是tty->icanon模式,是不是意味着如果没有接收换行符就不copy数据到用户空间呢??这个模式想修改的话是在哪里设置的呢??


回复 4# xxw19840406


   

论坛徽章:
0
6 [报告]
发表于 2012-07-27 11:04 |只看该作者
一直在看内核关于串口终端读写方面的内容,在网上看资料说tty有两种模式,原始模式(raw)和加工模式(cannon),原始模式还分raw和real_raw两种。倚着real_raw,raw,cannon的顺序,代表对终端原始输入的预处理力度。real raw不做任何处理,raw只做一点处理,cannon做很多的处理. 不知道大家有没有读写过RS485设备,通常读取RS485数据可以通过读串口即可(至于RS485和串口间的数据转换不需要了解),哪像这种读取数据是用哪种模式呢??raw? real_raw?还是cannon?

论坛徽章:
0
7 [报告]
发表于 2012-08-09 04:21 |只看该作者
支持一下吧

论坛徽章:
0
8 [报告]
发表于 2012-09-11 09:55 |只看该作者
请问楼主解决了吗,我也遇到了一模一样的问题。

论坛徽章:
0
9 [报告]
发表于 2012-09-20 09:46 |只看该作者
我这边是应用程序有点问题,其实tty_read()是有被调用的,如果是读取不对,那么就是模式得更改。


回复 8# diaochengdong


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP