23,120
社区成员
发帖
与我相关
我的任务
分享
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);
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) 这函数是什么意思 在一个串口读数据函数看到的
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;
while(1)
{
read(.......);
printf("Run here"); // 如果阻塞就不会不停的刷出 “Run here ” 我是这样得到的
}