当前位置: 技术问答>linux和unix
菜鸟提问:关于read函数的问题
来源: 互联网 发布时间:2016-02-12
本文导语: 在linux下用串口接收数据的时候,采用read函数读取串口数据,但是一进入read的循环,程序总是停在那里,跳不出来.不知道为什么. 程序如下: void readshort(int fd) { unsigne...
在linux下用串口接收数据的时候,采用read函数读取串口数据,但是一进入read的循环,程序总是停在那里,跳不出来.不知道为什么.
程序如下:
void readshort(int fd)
{
unsigned int n=5000;
int nread;
char buff[512];
while (n) //循环读取数据
{
printf("start to read datan");
while((nread = read(fd, buff, 512))>0)
{
// printf("tLen %d",nread);
buff[nread] = '';
printf( "%s", buff);
}
n--;
}
printf("readshort completed");
}
程序执行到这个循环语句的时候,总是跳不出来.是不是我把要读的字节设成512太大了?因为串口那边的数据肯定是小于512的,理论上串口没有数据发过来的时候应该是可以结束读取的呀.
程序如下:
void readshort(int fd)
{
unsigned int n=5000;
int nread;
char buff[512];
while (n) //循环读取数据
{
printf("start to read datan");
while((nread = read(fd, buff, 512))>0)
{
// printf("tLen %d",nread);
buff[nread] = '';
printf( "%s", buff);
}
n--;
}
printf("readshort completed");
}
程序执行到这个循环语句的时候,总是跳不出来.是不是我把要读的字节设成512太大了?因为串口那边的数据肯定是小于512的,理论上串口没有数据发过来的时候应该是可以结束读取的呀.
|
INT32 ReadComPort (INT32 ComPort, void *data, INT32 datalength)
{
INT32 retval = 0;
static fs_read;
FD_ZERO (&fs_read);
FD_SET (fd[ComPort], &fs_read);
tv_timeout.tv_sec = 0;//TIMEOUT_SEC (datalength, GetBaudrate ());
tv_timeout.tv_usec = 150000;//TIMEOUT_USEC;
retval = select (fd[ComPort] + 1, &fs_read, NULL, NULL, &tv_timeout);
if (retval)
return (read (fd[ComPort], data, datalength));
else
return (-1);
}
{
INT32 retval = 0;
static fs_read;
FD_ZERO (&fs_read);
FD_SET (fd[ComPort], &fs_read);
tv_timeout.tv_sec = 0;//TIMEOUT_SEC (datalength, GetBaudrate ());
tv_timeout.tv_usec = 150000;//TIMEOUT_USEC;
retval = select (fd[ComPort] + 1, &fs_read, NULL, NULL, &tv_timeout);
if (retval)
return (read (fd[ComPort], data, datalength));
else
return (-1);
}
|
我曾写过一篇文章介绍过select,想了解的话请参考:select函数与I/O多路转接
http://blog.csdn.net/linyt/archive/2007/08/02/1722445.aspx
此外,也可以把它设为非阻塞的,代码如下:
void set_fl(int fd, int flags)
...{
int val;
//获取属性
if((val = fcntl(fd, F_GETFL, 0)) 0)
nread = read(fd, buff, status))
或则用select来控制超时.
http://blog.csdn.net/linyt/archive/2007/08/02/1722445.aspx
此外,也可以把它设为非阻塞的,代码如下:
void set_fl(int fd, int flags)
...{
int val;
//获取属性
if((val = fcntl(fd, F_GETFL, 0)) 0)
nread = read(fd, buff, status))
或则用select来控制超时.
|
tv_timeout.tv_sec:单位是秒
tv_timeout.tv_usec单位是百万分之一秒
合在一起就是表示总的时间
tv_timeout.tv_usec单位是百万分之一秒
合在一起就是表示总的时间