Linux中串口read怎样阻塞的方式读入数据

AldisZhan 2010-04-25 10:44:45

pthread_mutex_lock(&ptty->mt);
ret = read(ptty->fd, pbuf, 1); //由于read并不阻塞 要监听随时可能来数据的串口 得不停的循环的查看 效率好低
if(ret < 0)
{
//串口没有数据进来
}
else
{
//相关处理
}
/*
怎样加以控制使得,或使用什么函数
readfunction(ptty->fd, pbuf, ......);//使得这儿没有串口数据时阻塞,有串口数据了就读到
//避免不停的循环+sleep() 耗费ARM板资源,而且有时还漏读
//有的说用什么fcntl,ioctl 这两不太懂,希望可以解释清楚点
*/
pthread_mutex_unlock(&ptty->mt);


附加:那位大牛要是能告诉个大概的 Linux C 中哪些IO操作函数时阻塞 哪些不是
或能使用什么方法实现阻塞或不阻塞


...全文
2437 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lkncjy 2010-05-03
  • 打赏
  • 举报
回复
貌似阻塞与非阻塞读写有专门的函数,不记得了。
Final_x 2010-05-03
  • 打赏
  • 举报
回复
还有比manpages更好的手册么。。。
AldisZhan 2010-04-28
  • 打赏
  • 举报
回复
问题基本弄懂了 在设置open(...,Flag) 中 Flag 如果 设置了O_NONBLOCK 和
O_NDELAY属性会以忆非阻塞模式打开

求助一个非常详细的Linux 编程文档 链接 详细关键是详细把函数说名清楚 中英无所谓
kingstarer 2010-04-25
  • 打赏
  • 举报
回复
read阻塞啊 你是怎么知道它不阻塞的?
AldisZhan 2010-04-25
  • 打赏
  • 举报
回复
一楼和二楼的能说的明白点吗 怎样才能实现阻塞方式读
特别二楼的

options.c_cc[VTIME] = 0; /* 等待100ms* 该值等待时间就返回 */
options.c_cc[VMIN] = 1; /* 接收到该值数量字节就返回 */
/* 上面两个条件为非零时才有效,两个都为非零时任意一个条件达到都返回,如果两个条件都为零,则马上返回 */

//这说的好矛盾啊 “两个条件为非零时才有效”“两个都为非零时任意一个条件达到都返回”
// “两个条件都为零” 这3句话怎么这么别扭 就是没有说明 一个是0一个非0情况的效果

// options.c_cc[VMIN] = n 有人说设置这个能没读到n个数据就阻塞 读到n个了就返回
// 我用的事options.c_cc[VMIN] = 1 怎么没见他阻塞

ioctl(ptty->fd, FIONREAD, &bytes) 这函数是什么意思 在一个串口读数据函数看到的


Behard 2010-04-25
  • 打赏
  • 举报
回复

fd = open( Dev, O_RDWR | O_NOCTTY);

options.c_cc[VTIME] = 0; /* 等待100ms* 该值等待时间就返回 */
options.c_cc[VMIN] = 1; /* 接收到该值数量字节就返回 */
/* 上面两个条件为非零时才有效,两个都为非零时任意一个条件达到都返回,如果两个条件都为零,则马上返回 */

tcflush(fd,TCIFLUSH); /* Update the options and do it NOW */
if (tcsetattr(fd,TCSANOW,&options) != 0){
return ERRCOM_SETATTR;
}
return ERRCOM_OK;
rzsheng 2010-04-25
  • 打赏
  • 举报
回复
open(dev, O_NONBLOCK|O_RDWR)..... 非阻塞
帅得不敢出门 2010-04-25
  • 打赏
  • 举报
回复
Reading data from a port is a little trickier. When you operate the port in raw data mode, each read(2) system call will return however many characters are actually available in the serial input buffers. If no characters are available, the call will block (wait) until characters come in, an interval timer expires, or an error occurs. The read function can be made to return immediately by doing the following:

fcntl(fd, F_SETFL, FNDELAY);
The FNDELAY option causes the read function to return 0 if no characters are available on the port. To restore normal (blocking) behavior, call fcntl() without the FNDELAY option:

fcntl(fd, F_SETFL, 0);
This is also used after opening a serial port with the O_NDELAY option.
Behard 2010-04-25
  • 打赏
  • 举报
回复
两个都为非零时任意一个条件达到都返回
如果两个条件都为零,则马上返回
如果一个为非零,则仅仅关注该非零条件
kingstarer 2010-04-25
  • 打赏
  • 举报
回复
读写socket有比read和write更方便的函数,send recev,建议你研究一下
kingstarer 2010-04-25
  • 打赏
  • 举报
回复
不能这样看 因为每次read都获得了数据
如果你发现每次read都没获得数据就返回才叫非阻塞
AldisZhan 2010-04-25
  • 打赏
  • 举报
回复

while(1)
{
read(.......);
printf("Run here"); // 如果阻塞就不会不停的刷出 “Run here ” 我是这样得到的
}

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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