<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post//</link>
<title><![CDATA[linux串口的select读，Linux下用select查询串口数据]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Fri, 27 Aug 2010 16:05:40 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	前面介绍了串口的简单读写<br/><br/>今天研究了下串口的select读，跟大家分享如下<br/><br/>select读主要实现的功能是，在一定时间内不停地看串口有没有数据，有数据则进行读，当时间过去后还没有数据，则返回超时错误。<br/><br/>具体的函数如下;<br/><br/><br/><div class="code">int read_datas_tty(int fd,char *rcv_buf,int sec,int usec)<br/>&#123;<br/>int retval;<br/>unsigned char tempchar2;<br/>fd_set rfds;<br/>struct timeval tv;<br/>int ret,pos;<br/>tv.tv_sec = sec;//set the rcv wait time<br/>tv.tv_usec = usec;//100000us = 0.1s<br/>while(1)&#123;<br/>&nbsp;&nbsp; FD_ZERO(&amp;rfds);<br/>&nbsp;&nbsp; FD_SET(fd,&amp;rfds);<br/>&nbsp;&nbsp; retval = select(fd+1,&amp;rfds,NULL,NULL,&amp;tv);<br/>&nbsp;&nbsp; if(retval ==-1)<br/>&nbsp;&nbsp; &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;perror(&quot;select()&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;break;<br/>&nbsp;&nbsp; &#125;<br/>&nbsp;&nbsp; else if(retval)<br/>&nbsp;&nbsp; &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;ret= read(fd,rcv_buf,1);<br/>tempchar2 = rcv_buf;<br/>printf(&quot;rcv_buf is %s&#92;n&quot;,rcv_buf);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp; &#125;<br/>&nbsp;&nbsp; else<br/>&nbsp;&nbsp; &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;break;<br/>&nbsp;&nbsp; &#125;<br/>&#125;<br/>return 1;&nbsp;&nbsp;<br/>&#125;</div><br/><br/>在前面的普通读写里面加上这个函数就可以了<br/><br/>它的调用方式为：<br/><br/>read_datas_tty（fd,buff,10,10）;<br/><br/>这就表示等待时间为10S+10us<br/><br/><br/><br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;Linux下直接用read读串口可能会造成堵塞，或数据读出错误。然而用select先查询com口，再用read去读就可以避免，并且当com口延时时，程序可以退出，这样就不至于由于com口堵塞，程序就死了。我的代码如下：<br/><br/><br/><div class="code">bool ReadDevice( int hComm, unsigned long uLen, char* pData )<br/><br/>&#123;&nbsp;&nbsp;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nread = 0;<br/><br/>&nbsp;&nbsp; char&nbsp;&nbsp; inbuf&#91;uLen&#93;;<br/><br/>&nbsp;&nbsp; char&nbsp;&nbsp;buff&#91;uLen&#93;;<br/><br/>&nbsp;&nbsp; memset( inbuff,&nbsp;&nbsp;&#039;&#92;0&#039;, uLen );<br/><br/>&nbsp;&nbsp; memset( buff, &#039;&#92;0&#039;, uLen );<br/><br/>&nbsp;&nbsp; fd_set readset;<br/>&nbsp;&nbsp; struct timeval tv;<br/>&nbsp;&nbsp; int MaxFd = 0;<br/><br/>&nbsp;&nbsp; int c = 0;<br/>&nbsp;&nbsp; int z;<br/>&nbsp;&nbsp; do<br/>&nbsp;&nbsp; &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FD_ZERO( &amp;readset );<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( hComm &gt;= 0 )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FD_SET( hComm, &amp;readset );<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MaxFd = hComm + 1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tv.tv_sec = 0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tv.tv_usec = 500000;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; z = select( MaxFd, &amp;readset, 0, 0, &amp;tv);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;while( z==-1 &amp;&amp; errno==EINTR ); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( z == -1 )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;select(2)&#92;n&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( z == 0 )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hComm = -1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( hComm&gt;=0 &amp;&amp; FD_ISSET(hComm, &amp;readset) )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; z = read( hComm, buff, uLen - c );<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c += z;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( z == -1 )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hComm = -1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( z &gt; 0 )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buff&#91; z + 1 &#93; = &#039;&#92;0&#039;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcat( inbuff, buff );<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset( buff, 0x00, uLen );<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hComm = -1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp; &#125;while( hComm &gt;= 0 );<br/><br/>&nbsp;&nbsp; memcpy( pData, inbuff, c );<br/><br/>&nbsp;&nbsp; return true;<br/><br/>&#125;</div><br/><br/>来源：http://www.moon-soft.com/doc/51500.htm<br/>参考：http://hi.baidu.com/tc22/blog/item/6c82b51259bbc8c3c3fd7882.html<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://blog.sina.com.cn/s/blog_6b0cfdeb0100n3k1.html<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://blog.chinaunix.net/space.php?uid=20788636&amp;do=blog&amp;id=1841319<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://www.ibm.com/developerworks/cn/linux/l-serials/<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://hi.baidu.com/xdyang1986/blog/item/c863c125436bb621d4074290.html
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] linux串口的select读，Linux下用select查询串口数据]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>