guaguaguaguaxi 发表于 2012-07-25 15:16

关于linux串口驱动tty_read()函数的问题??

我打开的是串口设备:/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()函数,可是为什么我没有进入到该函数中呢??是因为我是阻塞模式没有数据阻在那里??还是得达到什么条件才能激活进入该函数??请大家帮我解答一下,十分感谢。。

xxw19840406 发表于 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()中会继续运行,将数据拷到用户空间

guaguaguaguaxi 发表于 2012-07-25 15:51

十分感谢的你的回复,可是在这里我的问题是程序压根就没跑进tty_read()里,后面的 n_tty_read()就更不可能被调用到了,我在我的tty_read()函数一进来的位置加了打印调试,可是并没有看到有打印。我就不知道这tty_read()是被哪个调用的,内核的东西太多,我都看晕了都。。想不通为什么没有运行到该函数?



回复 2# xxw19840406


   

xxw19840406 发表于 2012-07-25 16:06

你上层如果是open然后read的话接着就应该是会调到tty_read()---->n_tty_read()的
至于后面有数据了是不会再主动从头开始跑这个函数的

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

guaguaguaguaxi 发表于 2012-07-25 17:25

我这边是循环read数据的,如果第一次成功读到数据了,那第二次read的时候应该还是会重新调用tty_read()吧??还有我发现我的串口2用的是tty->icanon模式,是不是意味着如果没有接收换行符就不copy数据到用户空间呢??这个模式想修改的话是在哪里设置的呢??


回复 4# xxw19840406


   

guaguaguaguaxi 发表于 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?

hansion3406 发表于 2012-08-09 04:21

支持一下吧

diaochengdong 发表于 2012-09-11 09:55

请问楼主解决了吗,我也遇到了一模一样的问题。

guaguaguaguaxi 发表于 2012-09-20 09:46

我这边是应用程序有点问题,其实tty_read()是有被调用的,如果是读取不对,那么就是模式得更改。


回复 8# diaochengdong


   
页: [1]
查看完整版本: 关于linux串口驱动tty_read()函数的问题??