LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 6494|回复: 8

请教c语言的read函数的用法

[复制链接]
发表于 2004-4-9 13:39:51 | 显示全部楼层 |阅读模式
int main(int argc, char *argv[])
{
int fd;
int nread;
//void *buf;
char buff[512];
//buf=&buff;
//printf ("%d",buf);
char *dev ="/dev/ttyS1";
/* 打开指定的串口设备 */
fd = OpenDev(dev);

if (fd>0) {
set_speed(fd);
}
else {
printf("Can't Open Serial Port!\n");
exit(1);
}

/* 设置串口的参数 */
if (set_para(fd)== 1) {
printf("Set Parity Error\n");
exit(1);
}

/* 在后台守候,检查缓冲区内是否有内容,并将缓冲区的
内容显示出来*/
while(1) {
int nread;
while ((nread = read(fd,buff,512))>0) {
printf ("nnread is %d\n",nread);
buff[nread+1]='\0';

int i;
for (i=0;i<nread;i++ ){
printf ("buff is %c\n",buff);
}

printf ("buf is %s\n",buff);
}

}
}

上面是我写的一段程序,目的就是将串口收到的字符显示在控制台上。
现在我可以打印出nnread is "收到的字符的个数",但是无法打印出接收到的字符。
我想打印buff这个数组。但是无论如何也打印不出来。
我把这个数组定义成int形的。然后就可以打印出一些数字,我猜可能是ascii码值。
我没有看懂read函数的参数的具体的用法,特别是第二项那个指针。
请教高人指点!
发表于 2004-4-9 14:23:37 | 显示全部楼层
终端设备是用行缓冲的,用setbuf() OR setvbuf()设置。

_IOFBF complete buffer
_IOLBF line buffer
_IONBF not buffer.

具体的用法看手册,。。再来问。:rolleyes:
 楼主| 发表于 2004-4-9 14:36:56 | 显示全部楼层
用setvbuf的话,是不是要用fopen来打开终端设备??
用open不可以么?
fopen,fclose...和open,close到底有什么区别亚?



看手册?看哪本手册亚?
:(
谢谢!!!
发表于 2004-4-9 14:50:19 | 显示全部楼层
最初由 zysno1 发表
用setvbuf的话,是不是要用fopen来打开终端设备??
用open不可以么?
fopen,fclose...和open,close到底有什么区别亚?



看手册?看哪本手册亚?
:(
谢谢!!!

是的,用fopen and fclose.用man 2 fopen, man 2 fclose 看。。

对于流??我也不了解。。。懂得用不懂得理解。。。
 楼主| 发表于 2004-4-9 15:55:29 | 显示全部楼层
/*设置串口波特率*/
void set_speed(int fd)
{
          int status ;
          struct termios  Opt;
          tcgetattr(fd, &Opt);
          tcflush(fd, TCIOFLUSH);
    cfsetispeed(&Opt, B9600);
    cfsetospeed(&Opt, B9600);
    status = tcsetattr(fd, TCSANOW, &Opt);
   
        if  (status != 0)
                perror("tcsetattr fd1");
            
    tcflush(fd,TCIOFLUSH);   
}
如果用fopen打开的话,返回值是一个指针,但是上面这个设置串口参数的函数里面需要文件描述符作参数。这怎么办呀????
发表于 2004-4-9 17:29:18 | 显示全部楼层
用fileno()等到fd。
发表于 2004-4-10 12:39:54 | 显示全部楼层
把 printf() 改成 fprintf(stderr, .... ) 就没有缓冲了

或者每次 printf() 后, flush(stdout) ---> 这种方法比较好理解啦

读串口的话,还是要用 open read write 比较好,不要用 fopen ...
发表于 2004-12-9 12:42:01 | 显示全部楼层

请问FLUSH在那个文件!

请问使用flush () 需要使用哪个头文件啊?
发表于 2004-12-9 13:09:56 | 显示全部楼层
用 man 可以解决很多问题。
用 Linux 开发怎么能不记得用 man。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表