<?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串口编程（要点总结）]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Tue, 30 Jun 2009 10:13:01 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	串口编程<br/>查询硬件的方式：查询方式、中断方式、DMA方式。串口很多是使用中断方式，这种方式一般来讲对CPU比较有效。<br/><br/>UART的操作主要包括以下几个部分：<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;数据发送；数据接受；产生中断；产生波特率；Loopback模式；红外模式；自动流控模式；<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;串口参数的配置主要包括：波特率、数据位、停止位、流控协议。<br/><br/>在linux下操作串口与操作文件相同。<br/><br/>在使用串口之前必须设置相关配置，包括：波特率、数据位、校验位、停止位等。串口设置由下面结构体实现。<br/>&nbsp;&nbsp;&nbsp;&nbsp; Struct termios&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tcflag_t c_iflag;&nbsp;&nbsp;/* input flags */<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tcflag_t c_oflag;&nbsp;&nbsp;/* output flags */<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tcflag_t c_cflag;&nbsp;&nbsp;/* control flags */<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tcflag_t c_lflag;&nbsp;&nbsp;/* local flags */<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cc_t&nbsp;&nbsp;c_cc[NCCS]; /* control character */<br/>&nbsp;&nbsp;&nbsp;&nbsp; &#125;;<br/><br/>串口配置流程<br/>&nbsp;&nbsp;&nbsp;&nbsp;1、保存原先串口配置，使用tcgetattr(fd,&oldtio)函数<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct termios newtio,oldtio;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tcgetattr(fd,&oldtio);<br/>&nbsp;&nbsp;&nbsp;&nbsp; 2、激活选项，有CLOCAL 和CREAD，用于本地连接和接收使能。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newtio.c_cflag &#124;= CLOCAL &#124; CREAD<br/>&nbsp;&nbsp;&nbsp;&nbsp; 3、设置波特率，使用函数cfsetispeed、cfsetospeed。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cfsetipeed(&newtio, B115200);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cfsetospeed(&newtio, B115200);<br/>&nbsp;&nbsp;&nbsp;&nbsp; 4、设置数据位，需要使用掩码设置。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newtio.c_cflag &= ~CSIZE;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newtio.c_cflag &#124;= CS8;<br/>&nbsp;&nbsp;&nbsp;&nbsp; 5、设置奇偶校验位，使用c_cflag和c_iflag。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;设置奇校验：<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newtio.c_cflag &#124;= PARENB;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newtio.c_cflag &#124;= PARODD;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newtio.c_iflag &#124;= (INPCK &#124; ISTRIP);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置欧校验：<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newtio.c_iflag &#124;= (INPCK &#124; ISTRIP);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newtio.c_cflag &#124;= PARENB;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newtio.c_cflag &= ~PARODD;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6、设置停止位，通过激活c_cflag中的CSTOPB实现。若停止位为1，则清楚CSTOPB，若停止位为2，则&nbsp;&nbsp;激活CSTOPB。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newtio.c_cflag &= ~CSTOPB;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7、设置最少字符和等待时间，对于接受字符和等待时间没有特别要求时，可设为0。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newtio.c_cc[VTIME] = 0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newtio.c_cc[VMIN] = 0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8、处理要写入的引用对象<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tcflush函数刷清（抛弃）输入缓存（终端驱动程序已接收到，但用户程序尚未读）<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 或输出缓存（用户程序已写，但尚未发送）。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int tcflush(int filedes, int queue)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;queue数应当是下列三个常数之一：<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TCIFLUSH 刷清输入队列。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TCOFLUSH 刷清输出队列。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TCIOFLUSH 刷清输入、输出队列。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9、激活配置。在完成配置后，需激活配置使其生效。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用tsettattr()函数。原型：<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int tcgetattr(int filedes, struct termios *termptr);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int tcgetattr(int filedes, int opt, const struct termios * termptr);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tcsetattr的参数opt使我们可以指定在什么时候新的终端属性才起作用。opt可以指定wei下列常数中的一&nbsp;&nbsp;个：<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TCSANOW 更改立即发生。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TCSADRAIN 发送了所有输出后更改才发生。若更改输出参数则应使用此选择项。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TCSAFLUSH 发送了所有输出后更改才发生。更进一步，在更改发生时未读的宋有输入数据都被删除（刷清）<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;使用如：tcsetattr(fd, TCSANOW, &newtio)<br/><br/>打开串口<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f d = open("/dev/ttyS0", O_RDWR&#124;O_NOCTTY&#124;O_NDELAY);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; open函数中除普通参数外，另有两个参数O_NOCTTY和O_NDELAY。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; O_NOCTTY：通知linux系统，这个程序不会成为这个端口的控制终端。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;O_NDELAY：通知linux系统不关心DCD信号线所处的状态（端口的另一端是否激活或者停止）<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然后，恢复串口的状态为阻塞状态，用于等待串口数据的读入。用fcntl函数：<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fcntl(fd, F_SETFEL, 0);<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 接着, 测试打开的文件描述符是否引用一个终端设备,以进一步确认串口是否正确打开.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isatty(STDIN_FILENO);<br/><br/><br/>串口读写<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;串口的读写与普通文件的读写是一样的，使用read，write函数。<br/><br/><br/>本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/zhanghuiliang/archive/2008/05/21/2467040.aspx
]]>
</description>
</item><item>
<link>http://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://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>