linux tty通过VTIME VMIN实现阻塞与非阻塞接收

本文详细介绍了串口通信中如何通过调整c_cc[VMIN]和c_cc[VTIME]来实现阻塞与非阻塞读取。通过具体示例说明了这两个参数如何影响数据读取过程,并解释了在不同场景下的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在串口设置中,有以下两个参数可以决定是否阻塞。

在打开串口时不加O_NODELAY,可用下面的方法,来进行阻塞/非阻塞的设定

 c_cc[VTIME非规范模式读取时的超时时间(单位:百毫秒),可以这么理解,从接收到后一个字节开始计时,如果超时,则退出READ

 c_cc[VMIN]  非规范模式读取时的最小字符数,设为0则为非阻塞,如果设为其它值则阻塞,直到读到到对应的数据

关键代码

 iFd = open(cSerialName, O_RDWR | O_NOCTTY);                       

    opt.c_cc[VMIN]   =   0;//DATA_LEN;                                     
    opt.c_cc[VTIME]  =   30;//每个单位是0.1秒  30就是3秒

通过上面的设置,如果在 len=read(fd, tmp,124);   无任何数据,则会3秒钟后退出READ,但是如果串口有读取到数据则会立即返回

 

c_cc[VMIN],就像一个阀值一样,比如设为8,如果只接收到3个数据,那么它是不会返回的,只有凑齐8个数据后一齐才READ返回,阻塞在那儿了.

    opt.c_cc[VMIN]   =   8;//DATA_LEN;                                     
    opt.c_cc[VTIME]  =   30;//每个单位是0.1秒  30就是3秒

如果这样设置,就完全阻塞了,只有串口收到至少8个数据才会对READ立即返回,或才少于8个数据时,超时3秒也会有返回

再来说下 read(fd, tmp,xx);如果其中的xx设为1,则只要串口有一个数据,即使opt.c_cc[VMIN]=8,它也会立即返回,无需凑足8bytes,如果这个数为1024,只要实际接收的数据超出opt.c_cc[VMIN]设定的值后,也会立即返回,而不用凑足1024,我个人感觉这个值设为1比较好,用于阻塞方式的读取,如果非阻塞,当然是0

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值