跳至主要内容

【转】select问题

问:
该串口初始化如下
ioctl(comm2Fd,FIOBAUDRATE,9600)
ioctl(comm2Fd,FIOSETOPTIONS,OPT_RAW)

使用如下

FD_ZERO   (&readFds);
FD_SET   (comm2Fd,   &readFds);  
width   =   comm2Fd   +   1;
FD_ISSET   (comm2Fd,   &readFds);

FOREVER
{
if(timeoutvalue==0)
{
printf("\nselect   start!\n");
selectnum   =   select   (width,   &readFds,   NULL,   NULL,   NULL);
printf("\nselect   over!\n");
}

                                ...........
}

现在的状况是程序跑一段时间后会死机或这个串口通讯任务死掉,每次死机都是"select   start!"打印出来,而"select   over!"打印不出来,在仅这个串口通讯任务死掉的情况下,用comm1Fd超级终端登陆,查询任务状态,会发现tExcTask任务居然处于挂起状态???
哪位大哥帮忙分析一下或给予一点提示,小弟不胜感激!!
答:
select函数在设备读(或写)操作未就绪时应该处于阻塞状态,也就是说你的进程在串口没有收到数据时会处于挂起状态,一旦select监测到有数据可读(或可写如),进程就会转为运行态,继续执行。

从你描述的现象上看,进程本身因该没有当掉,而是底层驱动没有收到数据供应用层读取。不知道你用的是CPU自带串口还是扩展串口。建议你查查串口驱动,有可能的话把中断信号牵出来看看,是不是每次中断都能正确响应。

问:
avbsp您好,我还有一个问题,我上面给出的代码是不是有些问题?
FD_ZERO       (&readFds);  
FD_SET       (comm2Fd,       &readFds);     这两句是不是应该写在FOREVER   循环中?
答:
是的。每次都清除
问:
请问,如果不清除,按照我当前的代码来写,会有什么问题吗?能解释一下吗?谢谢
问:
详细函数如下:
static   STATUS   RecvDataWithTimeOut(UINT16   datacount,UINT16   timeoutvalue)
{
              ....
              ....

timeout.tv_sec   =   timeoutvalue;
timeout.tv_usec   =   0;
FD_ZERO   (&readFds);
FD_SET   (comm2Fd,   &readFds);  
width   =   comm2Fd   +   1;
FD_ISSET   (comm2Fd,   &readFds);

FOREVER
{
if(timeoutvalue==0)
selectnum   =   select   (width,   &readFds,   NULL,   NULL,   NULL);
else
selectnum   =   select   (width,   &readFds,   NULL,   NULL,   &timeout);

if   (selectnum   ==   ERROR)
{
                                    #ifdef   DEBUG_PRINT
        printErr("ERROR:An   select   error   has   occurred   in   received   data   from   COM2!\n");
   

评论

此博客中的热门博文

【转】smb协议栈使用示例

/*  * * uncdownload.c  * *  * * Utility for downloading files from SMB shares using libsmbclient  * *  * * Copyright(C) 2006 Sophos Plc, Oxford, England.  * *  * * This program is free software; you can redistribute it and/or modify it under the terms of the  * * GNU General Public License Version 2 as published by the Free Software Foundation.  * *  * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without  * * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  * * See the GNU General Public License for more details.  * *  * * You should have received a copy of the GNU General Public License along with this program; if not,  * * write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA  * *  * */ # include < sys / types . h > # include < sys / time . h > # include ...

【转】Ether Types

Ether Types (last updated 2008-09-09) NOTE: Please see [RFC5342] for current information and registration procedures. This registry will be revised soon and will be replaced with up-to-date information. Many of the networks of all classes are Ethernets (10Mb) or Experimental Ethernets (3Mb). These systems use a message "type" field in much the same way the ARPANET uses the "link" field. If you need an Ether Type, contact: IEEE Registration Authority IEEE Standards Department 445 Hoes Lane Piscataway, NJ 08854 Phone +1 732 562 3813 Fax: +1 732 562 1571 Email: <ieee-registration-authority& ieee.org > http://standards.ieee.org/regauth/index.html The following list of EtherTypes is contributed unverified information from various sources. Another list of EtherTypes is maintained by Michael A. Patton and is accessible at: <URL: http://www.cavebear.com/CaveBear/Ethernet/ > <URL: ftp://ftp.cavebear.com/pub/Ethernet-codes > Assign...

【转】tcphdr结构详解

位于:/usr/src/linux/include/linux/tcp.h struct tcphdr { __be16 source; __be16 dest; __be32 seq; __be32 ack_seq; #if defined(__LITTLE_ENDIAN_BITFIELD) __u16   res1:4, doff:4, fin:1, syn:1, rst:1, psh:1, ack:1, urg:1, ece:1, cwr:1; #elif defined(__BIG_ENDIAN_BITFIELD) __u16   doff:4, res1:4, cwr:1, ece:1, urg:1, ack:1, psh:1, rst:1, syn:1, fin:1; #else #error "Adjust your <asm/byteorder.h> defines"