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

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

在打开串口时不加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
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Linux非阻塞读是指在读取设备文件时,使用非阻塞方式进行读取操作。在非阻塞方式下,如果设备文件没有数据可读,则读取操作会立即返回,而不会阻塞进程。如果设备文件有数据可读,则读取操作会返回实际读取的字节数。\[2\] 在Linux中,可以通过在调用open()函数时添加O_NONBLOCK的mode参数来使用非阻塞方式读取设备文件。例如,使用以下代码可以打开终端设备文件并以非阻塞方式进行读取操作: ```c #include <unistd.h> #include <fcntl.h> #include <errno.h> #include <string.h> #include <stdlib.h> #include <stdio.h> int main(void) { char buf\[10\]; int fd, n; fd = open("/dev/tty", O_RDONLY | O_NONBLOCK); if (fd < 0) { perror("open /dev/tty"); exit(1); } n = read(fd, buf, 10); if (n < 0) { if (errno == EAGAIN) { // 如果设备文件没有数据可读,则返回EAGAIN错误 // 可以在这里进行其他操作,如等待一段时间后再次尝试读取 } else { perror("read /dev/tty"); exit(1); } } // 处理读取到的数据 close(fd); return 0; } ``` 在上述代码中,如果read()函数返回-1,并且errno被设置为EAGAIN,说明设备文件没有数据可读。可以根据需要进行相应的处理,如等待一段时间后再次尝试读取。\[1\] #### 引用[.reference_title] - *1* [linux下的阻塞非阻塞](https://blog.csdn.net/qq_45761493/article/details/120645210)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [linux阻塞非阻塞文件读写](https://blog.csdn.net/weixin_44713496/article/details/124096950)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Linux非阻塞读操作](https://blog.csdn.net/zxy131072/article/details/108534032)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值