<?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[C读写串口，编译通过，root运行OK]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Mon, 03 Nov 2008 07:43:38 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	<br/>int openport(char *Dev) //打开串口<br/><br/>int setport(int fd, int baud,int databits,int stopbits,int parity)//设置串口，波特率，数据位，停止位，校验<br/><br/>int readport(int fd,char *buf,int len,int maxwaittime)//读数据，参数为串口，BUF，长度，超时时间<br/><br/>int writeport(int fd,char *buf,int len)&nbsp;&nbsp;//发送数据<br/><br/>void clearport(int fd)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//如果出现数据与规约不符合，可以调用这个函数来刷新串口读写数据<br/><br/><br/><div class="code">#include&nbsp;&nbsp; &lt;stdio.h&gt;&nbsp;&nbsp;<br/>#include&nbsp;&nbsp; &lt;string.h&gt;&nbsp;&nbsp;<br/>#include&nbsp;&nbsp; &lt;unistd.h&gt;&nbsp;&nbsp;<br/>#include&nbsp;&nbsp; &lt;fcntl.h&gt;&nbsp;&nbsp;<br/>#include&nbsp;&nbsp; &lt;errno.h&gt;&nbsp;&nbsp;<br/>#include&nbsp;&nbsp; &lt;termios.h&gt;&nbsp;&nbsp;<br/>#include&nbsp;&nbsp; &lt;sys/time.h&gt;<br/>int openport(char *Dev)&nbsp;&nbsp;<br/> &#123;<br/> int fd = open( Dev, O_RDWR&#124;O_NOCTTY&#124;O_NDELAY );<br/> if (-1 == fd) <br/> &#123;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;perror(&quot;Can&#039;&#039;t Open Serial Port&quot;);<br/>&nbsp;&nbsp;return -1;&nbsp;&nbsp;<br/> &#125; <br/> else <br/>&nbsp;&nbsp;return fd;<br/><br/> &#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp; <br/>int setport(int fd, int baud,int databits,int stopbits,int parity)<br/>&#123;<br/> int baudrate;<br/> struct&nbsp;&nbsp; termios&nbsp;&nbsp; newtio;&nbsp;&nbsp;<br/> switch(baud)<br/> &#123;<br/> case 300:<br/>&nbsp;&nbsp;baudrate=B300;<br/>&nbsp;&nbsp;break;<br/> case 600:<br/>&nbsp;&nbsp;baudrate=B600;<br/>&nbsp;&nbsp;break;<br/> case 1200:<br/>&nbsp;&nbsp;baudrate=B1200;<br/>&nbsp;&nbsp;break;<br/> case 2400:<br/>&nbsp;&nbsp;baudrate=B2400;<br/>&nbsp;&nbsp;break;<br/> case 4800:<br/>&nbsp;&nbsp;baudrate=B4800;<br/>&nbsp;&nbsp;break;<br/> case 9600:<br/>&nbsp;&nbsp;baudrate=B9600;<br/>&nbsp;&nbsp;break;<br/> case 19200:<br/>&nbsp;&nbsp;baudrate=B19200;<br/>&nbsp;&nbsp;break;<br/> case 38400:<br/>&nbsp;&nbsp;baudrate=B38400;<br/>&nbsp;&nbsp;break;<br/> default :<br/>&nbsp;&nbsp;baudrate=B9600;&nbsp;&nbsp;<br/>&nbsp;&nbsp;break;<br/> &#125;<br/> tcgetattr(fd,&amp;newtio);&nbsp;&nbsp;&nbsp;&nbsp;<br/> bzero(&amp;newtio,sizeof(newtio));&nbsp;&nbsp;<br/>&nbsp;&nbsp; //setting&nbsp;&nbsp; c_cflag<br/> newtio.c_cflag&nbsp;&nbsp; &amp;=~CSIZE;&nbsp;&nbsp;&nbsp;&nbsp;<br/> switch (databits) /*设置数据位数*/<br/> &#123;&nbsp;&nbsp;<br/> case 7:&nbsp;&nbsp;<br/>&nbsp;&nbsp;newtio.c_cflag &#124;= CS7; //7位数据位<br/>&nbsp;&nbsp;break;<br/> case 8:&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;newtio.c_cflag &#124;= CS8; //8位数据位<br/>&nbsp;&nbsp;break;&nbsp;&nbsp;<br/> default:&nbsp;&nbsp; <br/>&nbsp;&nbsp;newtio.c_cflag &#124;= CS8;<br/>&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;<br/> &#125;<br/> switch (parity) //设置校验<br/> &#123;&nbsp;&nbsp;<br/> case &#039;n&#039;:<br/> case &#039;N&#039;:&nbsp;&nbsp; <br/>&nbsp;&nbsp;newtio.c_cflag &amp;= ~PARENB;&nbsp;&nbsp; /* Clear parity enable */<br/>&nbsp;&nbsp;newtio.c_iflag &amp;= ~INPCK;&nbsp;&nbsp;&nbsp;&nbsp; /* Enable parity checking */<br/>&nbsp;&nbsp;break; <br/> case &#039;o&#039;:&nbsp;&nbsp;<br/> case &#039;O&#039;:&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;newtio.c_cflag &#124;= (PARODD &#124; PARENB); /* 设置为奇效验*/ <br/>&nbsp;&nbsp;newtio.c_iflag &#124;= INPCK;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Disnable parity checking */<br/>&nbsp;&nbsp;break; <br/> case &#039;e&#039;: <br/> case &#039;E&#039;:&nbsp;&nbsp;<br/>&nbsp;&nbsp;newtio.c_cflag &#124;= PARENB;&nbsp;&nbsp;&nbsp;&nbsp; /* Enable parity */&nbsp;&nbsp; <br/>&nbsp;&nbsp;newtio.c_cflag &amp;= ~PARODD;&nbsp;&nbsp; /* 转换为偶效验*/&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;newtio.c_iflag &#124;= INPCK;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Disnable parity checking */<br/>&nbsp;&nbsp;break;<br/> case &#039;S&#039;:<br/> case &#039;s&#039;:&nbsp;&nbsp;/*as no parity*/&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp; newtio.c_cflag &amp;= ~PARENB;<br/>&nbsp;&nbsp;newtio.c_cflag &amp;= ~CSTOPB;break; <br/> default:&nbsp;&nbsp;<br/>&nbsp;&nbsp;newtio.c_cflag &amp;= ~PARENB;&nbsp;&nbsp; /* Clear parity enable */<br/>&nbsp;&nbsp;newtio.c_iflag &amp;= ~INPCK;&nbsp;&nbsp;&nbsp;&nbsp; /* Enable parity checking */<br/>&nbsp;&nbsp;break;&nbsp;&nbsp; <br/> &#125;<br/> switch (stopbits)//设置停止位<br/> &#123;&nbsp;&nbsp;<br/> case 1:&nbsp;&nbsp; <br/>&nbsp;&nbsp;newtio.c_cflag &amp;= ~CSTOPB;&nbsp;&nbsp;//1<br/>&nbsp;&nbsp;break; <br/> case 2:&nbsp;&nbsp; <br/>&nbsp;&nbsp;newtio.c_cflag &#124;= CSTOPB;&nbsp;&nbsp;//2<br/>&nbsp;&nbsp;&nbsp;&nbsp;break;<br/> default: <br/>&nbsp;&nbsp;newtio.c_cflag &amp;= ~CSTOPB; <br/>&nbsp;&nbsp;break; <br/> &#125;<br/> newtio.c_cc&#91;VTIME&#93; = 0;&nbsp;&nbsp; <br/> newtio.c_cc&#91;VMIN&#93; = 0;<br/> newtio.c_cflag&nbsp;&nbsp; &#124;=&nbsp;&nbsp; (CLOCAL&#124;CREAD);<br/> newtio.c_oflag&#124;=OPOST;<br/> newtio.c_iflag&nbsp;&nbsp; &amp;=~(IXON&#124;IXOFF&#124;IXANY);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;cfsetispeed(&amp;newtio,baudrate);&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;cfsetospeed(&amp;newtio,baudrate);&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;tcflush(fd,&nbsp;&nbsp; TCIFLUSH);<br/> if (tcsetattr(fd,TCSANOW,&amp;newtio) != 0)&nbsp;&nbsp;<br/> &#123;<br/>&nbsp;&nbsp;perror(&quot;SetupSerial 3&quot;); <br/>&nbsp;&nbsp;return -1; <br/> &#125; <br/> return 0;<br/>&#125;<br/>int readport(int fd,char *buf,int len,int maxwaittime)//读数据，参数为串口，BUF，长度，超时时间<br/>&#123;<br/> int no=&quot;0&quot;;int rc;int rcnum=&quot;len&quot;;<br/> struct timeval tv;<br/> fd_set readfd;<br/> tv.tv_sec=maxwaittime/1000;&nbsp;&nbsp;&nbsp;&nbsp;//SECOND<br/> tv.tv_usec=maxwaittime%1000*1000;&nbsp;&nbsp;//USECOND<br/> FD_ZERO(&amp;readfd);<br/> FD_SET(fd,&amp;readfd);<br/> rc=select(fd+1,&amp;readfd,NULL,NULL,&amp;tv);<br/> if(rc&gt;0)<br/> &#123;<br/>&nbsp;&nbsp;while(len)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp; rc=read(fd,&amp;buf&#91;no&#93;,1);<br/>&nbsp;&nbsp; if(rc&gt;0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;no=no+1;<br/>&nbsp;&nbsp; len=len-1;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;if(no!=rcnum)<br/>&nbsp;&nbsp; return -1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//如果收到的长度与期望长度不一样，返回-1<br/>&nbsp;&nbsp;return rcnum;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//收到长度与期望长度一样，返回长度<br/> &#125;<br/> else<br/> &#123;<br/>&nbsp;&nbsp;return -1;<br/> &#125;<br/> return -1;<br/>&#125;<br/>int writeport(int fd,char *buf,int len)&nbsp;&nbsp;//发送数据<br/>&#123;<br/> write(fd,buf,len);<br/>&#125;<br/>void clearport(int fd)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//如果出现数据与规约不符合，可以调用这个函数来刷新串口读写数据<br/>&#123;<br/> tcflush(fd,TCIOFLUSH);<br/>&#125;<br/>main()&nbsp;&nbsp;<br/>&#123;&nbsp;&nbsp;<br/> int&nbsp;&nbsp; fd,rc,i,ret;&nbsp;&nbsp;<br/> unsigned char rbuf&#91;256&#93;;<br/> unsigned char wbuf&#91;256&#93;=&quot;&quot;;<br/> for(i=0;i&lt;256;i++)<br/>&nbsp;&nbsp;wbuf&#91;i&#93;=i;<br/> char *dev =&quot;/dev/ttyS0&quot;;&nbsp;&nbsp;&nbsp;&nbsp;//串口号 /dev/ttyS0&nbsp;&nbsp;对应于串口1<br/>&nbsp;&nbsp;&nbsp;&nbsp;fd&nbsp;&nbsp;=&nbsp;&nbsp;openport(dev);&nbsp;&nbsp;&nbsp;&nbsp; //打开串口<br/> if(fd&gt;0)<br/> &#123;<br/>&nbsp;&nbsp;ret=setport(fd,4800,8,1,&#039;o&#039;);&nbsp;&nbsp;//设置串口，波特率，数据位，停止位，校验<br/>&nbsp;&nbsp;if(ret&lt;0)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp; printf(&quot;Can&#039;t Set Serial Port!&#92;n&quot;);<br/>&nbsp;&nbsp; exit(0);<br/>&nbsp;&nbsp;&#125;<br/> &#125;<br/> else<br/> &#123;<br/>&nbsp;&nbsp;printf(&quot;Can&#039;t Open Serial Port!&#92;n&quot;);<br/>&nbsp;&nbsp;exit(0);<br/> &#125;<br/> while(1)&#123; <br/>&nbsp;&nbsp;rc=readport(fd,rbuf,5,500);&nbsp;&nbsp; //读取5个字节，超时时间为500毫秒<br/>&nbsp;&nbsp;if(rc&gt;0)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp; writeport(fd,wbuf,rc);<br/>&nbsp;&nbsp; printf(&quot;recv:%d&#92;n&quot;,rc);<br/>&nbsp;&nbsp; for(i=0;i&lt;rc;i++)<br/>&nbsp;&nbsp; printf(&quot;%02x &quot;,rbuf&#91;i&#93;);<br/>&nbsp;&nbsp; printf(&quot;&#92;n&quot;);<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;else<br/>&nbsp;&nbsp; printf(&quot;recv none&#92;n&quot;); <br/> &#125;&nbsp;&nbsp;<br/> close(fd);&nbsp;&nbsp;<br/>&#125;&nbsp;&nbsp; </div>
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] C读写串口，编译通过，root运行OK]]></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>