关于linux的串口阻塞与非阻塞通信设置问题

sz_hiter 2009-10-30 03:15:19
大家好:
关于linux的串口通信设置有一个问题不明白,还请大家帮忙看下:
要设置为阻塞型读取:
方式1:那么open的时候不带 O_NODELY/O_NOBLOCK 这个参数,如果带了就是非阻塞
方式2:通过设置c_cc[VMIN] > 0为阻塞, =0 时为非阻塞
方式3:open时带了O_NODELY/O_NOBLOCK ,然后通过fcntl(fd, F_SETFL, 0)来恢复。

问题是:
我自己测试下来发现设置c_cc[VMIN] > 0后,不管open的时候带不带O_NODELY/O_NOBLOCK ,都为阻塞型了。也就是说这3种方式的本质其实就是设置c_cc[VMIN]决定阻塞还是不阻塞?是这样么?
...全文
1803 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
在串口中哪种类型的数据接收发送一定要是阻塞类型
旭子 2011-10-12
  • 打赏
  • 举报
回复
看一下Linux 内核代码 设备IO这一块
说明了2个条件
1.标志位置起为阻塞,反之非阻塞模式
2.阻塞的前提 c_cc[VMIN] > 0.


if (检查标志位)
{
if (id_io->c_cc[VMIN] > 0)
{
enter..
call you driver..
wait_for_data at least more than 1
leave..
}

copy_to_user


}
shraky 2011-05-22
  • 打赏
  • 举报
回复
我测试的c_cc[VMIN] = 1;
这样不行,还是非阻塞的,前两种可以的。
sz_hiter 2009-11-02
  • 打赏
  • 举报
回复
希望有更多的朋友来发发言哦。。。。。!
我这里说的“c_cc[VMIN] > 0为阻塞, =0 时为非阻塞”是termios结构体中的控制特性
Caballeroo 2009-10-31
  • 打赏
  • 举报
回复
设置串口的时候一般需要设置的就是波特率,奇偶校验,停止位,硬件控制流等。

而对于打开时的属性如阻塞与非阻塞,可以通过open()来设置,如

int fd;
fd=open("filename",O_NONBLOCK);

或者通过fcntl()来设置。

int flags;

if((flags=fcntl(fd,F_GETFL,0))==-1){
PERROR("fcntl ERR:get the fd attribute failure\n");
PDEBUG("errno=%d\n",errno);
return flags;
}
else{ /*set the socket to be the specific I/O mode*/
fcntl(fd,F_SETFL,flags|IO_MODE);
}

4,465

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧