LinuxSir.cn,穿越时空的Linuxsir!

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

一个串口编程问题

[复制链接]
发表于 2009-11-4 09:57:28 | 显示全部楼层 |阅读模式
fd_set rfds;                    ???这个到底是什么东西?有什么用呢?

int tttt=1;
        while (tttt)        //(TRUE)
                {
                printf("wait...\n");
                FD_ZERO(&rfds);
                FD_SET(fd, &rfds);
                if (select(1+fd, &rfds, NULL, NULL, &tv)>0)     //在这里应该实现了判断是否有数据传来,但是具体如何实现的呢?
                        {
                        //printf("wait...\n");
                        if (FD_ISSET(fd, &rfds))
                                {
                                nread=read(fd, buff, BUFSIZE);
                                printf("readlength=%d\n", nread);
                                buff[nread]='\0';
                                printf("%s\n", buff);
                                }
                        }
                sleep(1);

                tttt=0;
                }


上面是一个网上找到的程序,我现在就比较纳闷的是它如何实现等待的呢?里面的那个FD——SET、FD——ZERO、FD——ISSET都是干啥的啊,怎么用呢?请高手给解答一下。多谢
发表于 2009-11-4 14:33:14 | 显示全部楼层

由系统实现,中断触发?

我也刚学,现在碰到问题,有一串不定的字符串如: str,格式为 "00 AA 2D FF ..." 这样的格式,我如何把这串东西写进串口,然后串口那边用 hex查看就是上面 str的内容: 00 AA 2D FF ...
回复 支持 反对

使用道具 举报

发表于 2009-11-4 15:49:13 | 显示全部楼层
Linux下无论文件、管道、Socket、端口,它们的编程方式是一至的。从你给出的代码看,fd应该是句柄, &rfds应该是一个结构体或者类。

FD_ZERO(&rfds); 应该是尝试打开串口。
FD_SET(fd, &rfds); 应该是设置波特率,效验位和停止位。
FD_ISSET(fd, &rfds) 应该是测试串口是否已经打开并正确设置。
这三个都应该是用户定义的函数,到头文件中找去找它们。

和文件读写不同的地方是你需要了解struct termio这个结构体。可以看一下termio.h。
回复 支持 反对

使用道具 举报

发表于 2009-11-4 19:50:58 | 显示全部楼层
大家都从新手过来,何必要取笑人家。
对楼主说:google是一个很好的老师。
回复 支持 反对

使用道具 举报

发表于 2009-11-5 16:44:08 | 显示全部楼层
版主,难道是在说我?我有取笑楼主的意思?
回复 支持 反对

使用道具 举报

发表于 2009-11-5 21:15:25 | 显示全部楼层
man FD_SET; 在bigining_linux_programming中有详细说明;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-11-5 22:27:36 | 显示全部楼层
谢谢proge、谢谢realtang、谢谢zpcat,多谢大家热心的指点,在这里真的学到不少东西。
回复 支持 反对

使用道具 举报

发表于 2009-11-5 23:03:38 | 显示全部楼层
Post by proge;2042837
版主,难道是在说我?我有取笑楼主的意思?


斑竹可能是以为二楼在取笑一楼。。。

不过我看二楼是真不懂,不是取笑一楼的。
回复 支持 反对

使用道具 举报

发表于 2009-11-6 09:11:29 | 显示全部楼层
呵呵,版主是高手。。。。

我刚学4天。

正也想问问大家如何写一个函数,我都头晕了,不知道如何弄,

就是一个16进的字符串,变成 char ?
回复 支持 反对

使用道具 举报

发表于 2009-11-6 17:38:52 | 显示全部楼层
Post by xuyaosong;2042437
fd_set rfds;                    ???这个到底是什么东西?有什么用呢?

int tttt=1;
        while (tttt)        //(TRUE)
                {
                printf("wait...\n");
                FD_ZERO(&rfds);
                FD_SET(fd, &rfds);
                if (select(1+fd, &rfds, NULL, NULL, &tv)>0)     //在这里应该实现了判断是否有数据传来,但是具体如何实现的呢?
                        {
                        //printf("wait...\n");
                        if (FD_ISSET(fd, &rfds))
                                {
                                nread=read(fd, buff, BUFSIZE);
                                printf("readlength=%d\n", nread);
                                buff[nread]='\0';
                                printf("%s\n", buff);
                                }
                        }
                sleep(1);

                tttt=0;
                }


上面是一个网上找到的程序,我现在就比较纳闷的是它如何实现等待的呢?里面的那个FD——SET、FD——ZERO、FD——ISSET都是干啥的啊,怎么用呢?请高手给解答一下。多谢

man select !
select是用同步信号量实现的,在select的实现里会用semGet住一个信号量,当相应的fd上有数据过来时,相应程序必须semGive这个信号量,这样程序就会往下走,相应的read就立马读到数据了。

这样做是因为read本身是一个死等的实现,如果没有数据的话,read会一直耗在等数据的操作上直到有数据到来为止。这样就白白消耗了cpu。而select可以让没有数据的时候让度出cpu,交给有需要的任务进程去干事情,这样就提高了系统的效率。

而那个FD_SET只是一个监视注册器,比如说你往我这个监视器里注册了串口,套接口1,套接口2,那么串口,套接口1、套接口2的数据就会在我这个select中监测,你套接口3没注册,我select就不管!
不知道说清楚了没有!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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