<?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 串口编程 用read函数读取数据被截断 怎样一次读完 ]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Mon, 22 Mar 2010 08:03:41 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	linux 串口读取数据被截断，怎样一次全部接收？<br/>打开串口后，用read读取串口数据，串口发来的<br/>数据为20，而用read读取到的数据却是分多次得到的？<br/>有时只读了8个数据便被截断了，这是为什么？？<br/>怎样一次全部接收？？ 谢谢<br/><br/>附代码：<br/><br/><div class="code">#include &lt;stdio.h&gt;<br/>#include &lt;unistd.h&gt; /*Unix标准函数定义*/<br/>#include &lt;sys/types.h&gt; /**/<br/>#include &lt;sys/stat.h&gt; /**/<br/>#include &lt;fcntl.h&gt; /*文件控制定义*/<br/>#include &lt;termios.h&gt; /*PPSIX终端控制定义*/<br/>#include &lt;errno.h&gt; /*错误号定义*/<br/>#include &lt;stdlib.h&gt;<br/>#include &lt;string.h&gt;<br/><br/>int main()<br/>&#123;<br/>int fd,readnum;<br/>char *dev=&quot;/dev/ttyS0&quot;,recv&#91;100&#93;;<br/>struct termios opt,oldopt;<br/><br/>fd = open( dev, O_RDWR ); <br/><br/>tcgetattr( fd,&amp;oldopt);<br/><br/>tcgetattr( fd,&amp;opt);<br/>cfsetispeed(&amp;opt, B9600);//9600<br/>cfsetospeed(&amp;opt, B9600);<br/><br/>opt.c_cflag &amp;= ~PARENB; //N<br/>opt.c_cflag &amp;= ~INPCK;<br/>opt.c_cflag &amp;= ~CSTOPB;//1<br/>opt.c_cflag &amp;= ~CSIZE;<br/>opt.c_cflag &#124;= CS8; //8<br/><br/>opt.c_iflag &amp;= ~(IXON &#124; IXOFF &#124; IXANY);<br/><br/>opt.c_cc&#91;VTIME&#93; = 0; <br/>opt.c_cc&#91;VMIN&#93; = 0; <br/><br/>opt.c_lflag &amp;= ~(ICANON &#124; ECHO &#124; ECHOE &#124; ISIG); /*Input*/<br/>opt.c_oflag &amp;= ~OPOST; /*Output*/<br/><br/>tcflush(fd, TCIOFLUSH);<br/>tcsetattr(fd, TCSANOW, &amp;opt);<br/><br/>while(1)<br/>&#123;<br/>bzero(recv,100);<br/>while((readnum = read(fd,recv,100))&gt;0)<br/>&#123;<br/>printf(&quot;%s&#92;n&quot;,recv);<br/>&#125;<br/>&#125;<br/><br/>tcflush(fd, TCIOFLUSH);<br/>tcsetattr(fd, TCSANOW, &amp;oldopt); <br/>close(fd);<br/>&#125;</div><br/><br/>一般地串口的读写模式有直接模式和缓存模式，在直接模式下，串口的读写都是单字节的，也就是说一次的read或write只能操作一个字节；另外大部份串口芯片都支持缓存模式，缓存模式一般同时支持中断聚合和超时机制，也就是说在有数据时，当缓存满或者超时时间到时，都会触发读或写中断。写的时候可以将要操作的数据先搬到缓存里，然后启动写操作，芯片会自动将一连串的数据写出，在读的时候类似，一次读到的是串口芯片缓存里的数据。串口设备的缓存一般有限，一次能read到的最大字节数就是缓存的容量。<br/>所以你串口芯片的缓存容量决定了你一次能收到的字节数。<br/><br/>楼主，你可以一个字节一读，使用一个全局计数器来保证收到8个字节的数据。<br/>可以使用select/poll来避免超时接收。<br/><br/>从通讯的角度来说，接受方必须自己解决如何识别一个祯的问题。<br/><br/>操作串口相当于操作物理层，OSI／ISO模型中的第一层，解决祯同步问题是第二层的任务，所以你需要自己搭一个第二层。<br/><br/>简单的说，你需要通过定义通讯协议，规定数据的内容自己分析什么时候收完了一次需要的数据。因为通讯过程中无法保证一次发送的数据肯定是一次接收的。<br/>
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] linux 串口编程 用read函数读取数据被截断 怎样一次读完 ]]></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>