<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://www.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://www.jackxiang.com/post//</link>
<title><![CDATA[linux串口编程，相当重要。。。]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Fri, 26 Jun 2009 11:34:23 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	 来源：http://blog.21ic.com/user1/2613/archives/2008/48341.html<br/> 这个是单个，先弄懂，然后再弄懂多个，在该链接下面有少量的介绍<br/> Asynchronous Input 异步输入模式<br/><br/>＃i nclude &lt;termios.h&gt;&nbsp;&nbsp;&nbsp;&nbsp;<br/>＃i nclude &lt;stdio.h&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>＃i nclude &lt;unistd.h&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>＃i nclude &lt;fcntl.h&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>＃i nclude &lt;sys/signal.h&gt;&nbsp;&nbsp;&nbsp;&nbsp; <br/>＃i nclude &lt;sys/types.h&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>#define BAUDRATE B38400&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>#define MODEMDEVICE &quot;/dev/ttyS1&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/><br/>#define _POSIX_SOURCE 1 /* POSIX compliant source */&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>#define FALSE 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>#define TRUE 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/><br/>volatile int STOP=FALSE;<br/>void signal_handler_IO (int status);&nbsp;&nbsp; /* definition of signal handler */&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 定义信号处理程序<br/>int wait_flag=TRUE;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* TRUE while no signal received */&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// TRUE 代表没有受到信号，正在等待中&nbsp;&nbsp; <br/>main()&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/> int fd,c, res;&nbsp;&nbsp; <br/> struct termios oldtio,newtio;&nbsp;&nbsp;<br/> struct sigaction saio;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/> /* definition of signal action */&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/> // 定义信号处理的结构 <br/> char buf[255];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/> <br/> /* open the device to be non-blocking (read will return immediatly) */&nbsp;&nbsp;&nbsp;&nbsp; <br/> // 是用非阻塞模式打开设备 read 函数立刻返回，不会阻塞&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;fd = open(MODEMDEVICE, O_RDWR &amp;#124; O_NOCTTY &amp;#124; O_NONBLOCK);&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (fd &lt;0) {perror(MODEMDEVICE); exit(-1); }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/> <br/> /* install the signal handler before making the device asynchronous */&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;// 在进行设备异步传输前，安装信号处理程序&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;saio.sa_handler = signal_handler_IO;&nbsp;&nbsp;&nbsp;&nbsp; <br/> saio.sa_mask = 0;&nbsp;&nbsp;<br/> saio.sa_flags = 0;&nbsp;&nbsp;&nbsp;&nbsp; <br/> saio.sa_restorer = NULL;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;sigaction(SIGIO,&amp;saio,NULL);&nbsp;&nbsp; <br/><br/> /* allow the process to receive SIGIO */ <br/> // 允许进程接收 SIGIO 信号&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/> fcntl(fd, F_SETOWN, getpid());&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;/* Make the file descriptor asynchronous (the manual page says only&nbsp;&nbsp;<br/> O_APPEND and O_NONBLOCK, will work with F_SETFL...) */&nbsp;&nbsp; <br/> // 设置串口的文件描述符为异步，man上说，只有 O_APPEND 和 O_NONBLOCK 才能使用F_SETFL<br/> fcntl(fd, F_SETFL, FASYNC);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/> tcgetattr(fd,&amp;oldtio); /* save current port settings */&nbsp;&nbsp; <br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;/* set new port settings for canonical input processing */&nbsp;&nbsp; <br/> // 设置新的串口为标准输入模式&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/> newtio.c_cflag = BAUDRATE &amp;#124; CRTSCTS &amp;#124; CS8 &amp;#124; CLOCAL &amp;#124; CREAD;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/> newtio.c_iflag = IGNPAR &amp;#124; ICRNL;&nbsp;&nbsp;&nbsp;&nbsp; <br/> newtio.c_oflag = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/> newtio.c_lflag = ICANON;&nbsp;&nbsp;<br/> newtio.c_cc[VMIN]=1;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;newtio.c_cc[VTIME]=0;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;tcflush(fd, TCIFLUSH);&nbsp;&nbsp;&nbsp;&nbsp; <br/> tcsetattr(fd,TCSANOW,&amp;newtio);&nbsp;&nbsp;&nbsp;&nbsp; <br/> <br/> /* loop while waiting for input. normally we would do something&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/> useful here 循环等待输入，通常我们会在这里做些其它的事情 */ <br/> while (STOP==FALSE) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;printf(&quot;.&#92;n&quot;);usleep(100000);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;/* after receiving SIGIO, wait_flag = FALSE, input is availableand can be read */<br/>&nbsp;&nbsp;// 在收到 SIGIO 信号后，wait_flag = FALSE, 表示有输入进来，可以读取了 <br/>&nbsp;&nbsp;if (wait_flag==FALSE) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp; res = read(fd,buf,255);&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp; buf[res]=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp; printf(&quot;:%s:%d&#92;n&quot;, buf, res);&nbsp;&nbsp;<br/>&nbsp;&nbsp; if (res==1) STOP=TRUE; /* stop loop if only a CR was input */&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp; wait_flag = TRUE;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* wait for new input 等待新的输入*/&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/> /* restore old port settings */&nbsp;&nbsp;&nbsp;&nbsp; <br/> tcsetattr(fd,TCSANOW,&amp;oldtio);&nbsp;&nbsp;<br/>}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/><br/>/***************************************************************************&nbsp;&nbsp;&nbsp;&nbsp;<br/> * signal handler. sets wait_flag to FALSE, to indicate above loop that&nbsp;&nbsp;&nbsp;&nbsp;*<br/> * characters have been received.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* <br/>***************************************************************************/&nbsp;&nbsp; <br/><br/>// 信号处理函数，设置 wait_flag 为 FALSE, 以告知上面的循环函数串口收到字符了&nbsp;&nbsp;<br/>void signal_handler_IO (int status)&nbsp;&nbsp; {&nbsp;&nbsp; <br/> printf(&quot;received SIGIO signal.&#92;n&quot;);&nbsp;&nbsp;&nbsp;&nbsp; <br/> wait_flag = FALSE;&nbsp;&nbsp;<br/>}<br/><br/><br/><br/><br/><br/>
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] linux串口编程，相当重要。。。]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>