<?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 下串口中断和查询两种方式读取串口的程序Demo写法]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[系统架构与硬件]]></category>
<pubDate>Sat, 13 Mar 2010 14:32:10 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	我个人觉得如果是单片机来说中断和查询的写法可能会让单片机在效率上有些不同，毕竟单片机的资源有限，但是对于上位机的PC监控来说呢，查询的消耗并没有消耗多少（这儿是相对于中断来说的），但是如果严谨些，是应该用中断来代替查询的，这儿分别列出中断和查询在linux上的不同写法，以区分出来，以下是示例代码：<br/><br/><br/><br/><div class="code"><br/>#include &lt;stdio.h&gt; <br/>#include &lt;stdlib.h&gt; <br/>#include &lt;string.h&gt; <br/>#include &lt;signal.h&gt; <br/>#include &lt;unistd.h&gt; <br/>#include &lt;fcntl.h&gt; <br/>#include &lt;sys/ioctl.h&gt; <br/>#include &lt;termio.h&gt; <br/><br/>int tty_mode(int how) <br/>&#123; <br/>static struct termios original_mode; <br/>if(how==0) <br/>tcgetattr(0,&amp;original_mode); <br/>else return tcsetattr(0,TCSANOW,&amp;original_mode); <br/>&#125; <br/>void set_crmode() <br/>&#123; <br/>struct termios ttystate; <br/>tcgetattr(0,&amp;ttystate); <br/>ttystate.c_lflag &amp;= ~ICANON; <br/>ttystate.c_lflag &amp;=~ECHO; <br/>ttystate.c_cc&#91;VMIN&#93;=1; <br/>tcsetattr(0,TCSANOW,&amp;ttystate); <br/>&#125; <br/><br/>int signal_io(int sig) <br/>&#123; <br/>static char buf&#91;128&#93;,ch=0; <br/>static int len=0; <br/>//memset(buf,0,sizeof(buf)); <br/>//printf(&quot;aaaa&#92;n&quot;); <br/>if(read(0,&amp;ch,1)==1) <br/>&#123; <br/>if(ch!=127) <br/>&#123; <br/>printf(&quot;%c&quot;,ch); <br/>buf&#91;len++&#93;=ch; <br/>&#125; <br/>else &#123; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(len&gt;0) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf&#91;--len&#93;=0; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;&#92;b &#92;b&quot;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; <br/>&#125; <br/>//perror(NULL); <br/>//printf(&quot;%d&#92;n&quot;,ch); <br/>fflush(stdout); <br/>&#125; <br/>int main() <br/>&#123; <br/>int flag=0; <br/>tty_mode(0); <br/>set_crmode(); <br/>signal(SIGIO,signal_io); <br/>fcntl(0,F_SETOWN,getpid()); <br/>flag=fcntl(0,F_GETFL); <br/>fcntl(0,F_SETFL,flag&#124;O_ASYNC); <br/>while(1) <br/>pause(); <br/>tty_mode(1); <br/>&#125; <br/><br/></div><br/><br/>下面贴出串口查询的代码：<br/><br/><br/><div class="code"><br/>/****************************************************** <br/>*file name:recerve.c <br/>*Description:Recerve data from Serial_Port <br/>*Date: <br/>*******************************************************/ <br/>/********************头文件定义************************/ <br/>#include &lt;stdio.h&gt; <br/>#include &lt;string.h&gt; <br/>#include &lt;malloc.h&gt; <br/>#include &lt;sys/types.h&gt; <br/>#include &lt;fcntl.h&gt; <br/>#include &lt;unistd.h&gt; <br/>#include &lt;termios.h&gt; <br/>#include &#039;math.h&#039; <br/>#define max_buffer_size 100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*定义缓冲区最大宽度*/ <br/>/******************************************************/ <br/><br/>int fd,s; <br/>int open_serial(int k) <br/>/*********************************************** <br/>*open serial function. <br/>*input k k=0open serial1,k=1,openserial2 <br/>*return -1 false, return 0 success <br/>**********************************************/ <br/>&#123; <br/>&nbsp;&nbsp;if (k=0) <br/>&nbsp;&nbsp;&#123; <br/>&nbsp;&nbsp;&nbsp;&nbsp;int fd=open(&quot;/dev/ttys0&quot;,O_RDWR&#124;O_NOCTTY); <br/>&nbsp;&nbsp;&nbsp;&nbsp;perror(&quot;open /dev/ttys0&quot;); <br/>&nbsp;&nbsp;&#125; <br/>&nbsp;&nbsp;else <br/>&nbsp;&nbsp;&#123; <br/>&nbsp;&nbsp;&nbsp;&nbsp;fd=open(&quot;/dev/ttys1&quot;,O_RDWR&#124;O_NOCTTY); <br/>&nbsp;&nbsp;&nbsp;&nbsp;perror(&quot;open /dev/ttys1&quot;); <br/>&nbsp;&nbsp;&#125; <br/>&nbsp;&nbsp;if(fd==-1)/*打开失败*/ <br/>&nbsp;&nbsp;&nbsp;&nbsp;return -1; <br/>&nbsp;&nbsp;else <br/>&nbsp;&nbsp;&nbsp;&nbsp;return 0; <br/><br/>&#125; <br/><br/>/**************************************************************/ <br/><br/><br/>int main() <br/>&#123; <br/>char hd&#91;max_buffer_size&#93;,*rbuf; /*定义接收缓冲区*/ <br/>int flag_close, retv,i,ncount=0; <br/>struct termios opt; <br/>int realdata=0; <br/><br/>/*******************************************************************/ <br/>open_serial(0); /*打开串口1*/ <br/>/*******************************************************************/ <br/><br/>tcgetattr(fd,&amp;opt); <br/>cfmakeraw(&amp;opt); <br/><br/>/*****************************************************************/ <br/>cfsetispeed(&amp;opt,B9600); /*波特率设置为9600bps*/ <br/>cfsetospeed(&amp;opt,B9600); <br/>/*******************************************************************/ <br/><br/>tcsetattr(fd,TCSANOW,&amp;opt); <br/>rbuf=hd; /*数据保存*/ <br/>printf(&quot;ready for receiving data...&#92;n&quot;); <br/>retv=read(fd,rbuf,1); /*接收数据*/ <br/>if(retv==-1) <br/>&#123; <br/>&nbsp;&nbsp;perror(&quot;read&quot;); /*读状态标志判断*/ <br/>&#125; <br/>/*************************开始接收数据******************************/ <br/><br/>while(*rbuf!=&#039;&#92;n&#039;) /*判断数据是否接收完毕*/ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123; <br/>ncount+=1; <br/>rbuf++; <br/>retv=read(fd,rbuf,1); <br/>if(retv==-1) <br/>&#123; <br/>perror(&quot;read&quot;); <br/>&#125; <br/>&#125; <br/>/*******************************************************************/ <br/>printf(&quot;The data received is:&#92;n&quot;); /*输出接收到的数据*/ <br/>for(i=0;i &lt;ncount;i++) <br/>&#123; <br/>printf(&quot;%c&quot;,hd&#91;i&#93;); <br/>&#125; <br/>printf(&quot;&#92;n&quot;); <br/>flag_close =close(fd); <br/>if(flag_close ＝＝－1) /*判断是否成功关闭文件*/ <br/>printf(&quot;Close the Device failur！&#92;n&quot;); <br/>return 0; <br/>&#125; <br/><br/><br/></div>
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] Linux 下串口中断和查询两种方式读取串口的程序Demo写法]]></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>