主题 : 关于应用程序打开驱动程序read会返回0的问题 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 92494
精华: 0
发帖: 4
金钱: 20 两
威望: 4 点
综合积分: 8 分
注册时间: 2013-05-31
最后登录: 2013-06-13
楼主  发表于: 2013-05-31 13:34

 关于应用程序打开驱动程序read会返回0的问题

最近写了一个 串口的字符设备驱动程序
驱动函数中的 read函数是这样处理的,一旦应用程序调用read ,则进入睡眠,直到条件满足会唤醒,只有在串口接收到数据后我才会去唤醒。
static uart1_read()
{
   wait_event_interruptible(read_waitq,read_wakeup);
   .....
  dosomething.
}

可是在应用程序里,我使用count = read(f_handler,buf,10); 这样去读取时,这时我串口没有任何数据,串口的RX引脚也为高电平,但是read会直接返回0 。求大神指导下啊 ,困扰许久了。。

专注于嵌入式&Linux
级别: 骑士
UID: 12802
精华: 3
发帖: 237
金钱: 1355 两
威望: 271 点
综合积分: 534 分
注册时间: 2010-01-13
最后登录: 2014-03-18
1楼  发表于: 2013-05-31 17:57
open()是非阻塞打开的??
应该用阻塞打开。
级别: 新手上路
UID: 92494
精华: 0
发帖: 4
金钱: 20 两
威望: 4 点
综合积分: 8 分
注册时间: 2013-05-31
最后登录: 2013-06-13
2楼  发表于: 2013-06-03 09:25
引用第1楼lknlfy于2013-05-31 17:57发表的  :
open()是非阻塞打开的??
应该用阻塞打开。

open 直接是 O_RDWR 属性打开的 ,非阻塞的话  是这个#define O_NONBLOCK    00004000
不过我没有选择这个属性。。这样的话应该就是阻塞开打了把??
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
3楼  发表于: 2013-06-03 12:15
也许你需要在wait_event_interruptible()前后加两句printk()看看了。
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 92494
精华: 0
发帖: 4
金钱: 20 两
威望: 4 点
综合积分: 8 分
注册时间: 2013-05-31
最后登录: 2013-06-13
4楼  发表于: 2013-06-03 13:23
引用第3楼kasim于2013-06-03 12:15发表的  :
也许你需要在wait_event_interruptible()前后加两句printk()看看了。

这个试过了。。前面有没有加忘了。。反正在返回的时候printk过了,确实没执行到,应用程序的read直接返回0了