博客首页
注册
建议与交流
排行榜
加入友情链接
推荐
投诉
搜索:
帮助
枪炮与玫瑰
gentoo archlinux 嵌入式 吉他
axlrose.cublog.cn
管理博客
发表文章
留言
收藏夹
博客圈
音乐
相册
文章
· archlinux
· arm
· 嵌入式相关
· 嵌入式linux
· emacs
· gentoo
· python
· uCOSII
· vim
首页
关于作者
姓名:阿波 职业:电子 年龄:linux 位置:海南省五指山市 个性介绍:linux
||
<<
>>
||
我的分类
文章列表 - 嵌入式linux
[转载]Linux下的串口通信学习笔记
<span style="font-family: arial;">Linux下的串口通信学习笔记</span><br style="font-family: arial;"><span style="font-family: arial;">作者:姜江</span><br style="font-family: arial;"><span style="font-family: arial;">E-mail:jznsmail@tom.com</span><br style="font-family: arial;"><span style="font-family: arial;">QQ:457283</span><br style="font-family: arial;"><span style="font-family: arial;">Blog:http://blog.csdn.net/jznsmail</span><br style="font-family: arial;"><br style="font-family: arial;"><br style="font-family: arial;"><span style="font-family: arial;">一、什么是串口通信</span><br style="font-family: arial;"><span style="font-family: arial;"> 串口通信是指计算机主机与外设之间以及主机系统与主机系统之间数据的串行传送。使用串口通信时,发送和接收到的每一个字符实际上都是一次一位的传送的,每一位为1或者为0。</span><br style="font-family: arial;"><br style="font-family: arial;"><span style="font-family: arial;">二、串口通信的分类</span><br style="font-family: arial;"><span……
查看全文
发表于:2007-12-08 ┆
阅读(242)
┆
评论(0)
[转载]Linux下的串口通信学习笔记
<span style="font-family: arial;">Linux下的串口通信学习笔记</span><br style="font-family: arial;"><span style="font-family: arial;">作者:姜江</span><br style="font-family: arial;"><span style="font-family: arial;">E-mail:jznsmail@tom.com</span><br style="font-family: arial;"><span style="font-family: arial;">QQ:457283</span><br style="font-family: arial;"><span style="font-family: arial;">Blog:http://blog.csdn.net/jznsmail</span><br style="font-family: arial;"><br style="font-family: arial;"><br style="font-family: arial;"><span style="font-family: arial;">一、什么是串口通信</span><br style="font-family: arial;"><span style="font-family: arial;"> 串口通信是指计算机主机与外设之间以及主机系统与主机系统之间数据的串行传送。使用串口通信时,发送和接收到的每一个字符实际上都是一次一位的传送的,每一位为1或者为0。</span><br style="font-family: arial;"><br style="font-family: arial;"><span style="font-family: arial;">二、串口通信的分类</span><br style="font-family: arial;"><span style="font-family: arial;"> 串口通信可以分为同步通信和异步通信两类。同步通信是按照软件识别同步字符来实现数据的发送和接收,异步通信是一种利用字符的再同步技术的通信方式。</span><br style="font-family: arial;"><span style="font-family: arial;"> 2.1同步通信</span><br style="font-family: arial;"><span style="font-family: arial;"> 同步通信是一种连续串行传送数据的通信方式,一次通信只传送一帧信息。这里的信息帧与异步通信中的字符帧不同,通常含有若干个数据字符。如图:</span><br style="font-family: arial;"><br style="font-family: arial;"><span style="font-family: arial;">单同步字符帧结构</span><br style="font-family: arial;"><div><span style="font-family: arial;">+-----+------+-------+------+-----+--------+-------+-------+</span></div><div><span style="font-family: arial;">|同步|数据 |数据 |数据 | ... |数据 |CRC1|CRC2|</span></div><div><span style="font-family: arial;">|字符|字符1|字符2|字符3| |字符N| | |</span></div><div><span style="font-family: arial;">+-----+------+-------+------+-----+--------+-------+-------+</span></div><br style="font-family: arial;"><span style="font-family: arial;">双同步字符帧结构</span><br style="font-family: arial;"><span style="font-family: arial;">+-----+--------+------+-------+---+-------+-------+--------+</span><br style="font-family: arial;"><span style="font-family: arial;">|同步 |同步 |数据 |数据 | ... |数据 |CRC1|CRC2|</span><br style="font-family: arial;"><span style="font-family: arial;">|字符1|字符2|字符1|字符2| |字符N| | |</span><br style="font-family: arial;"><span style="font-family: arial;">+-----+--------+------+-------+---+-------+-------+--------+</span><br style="font-family: arial;"><span style="font-family: arial;"> 它们均由同步字符、数据字符和校验字符(CRC)组成。其中同步字符位于帧开头,用于确认数据字符的开始。数据字符在同步字符之后,个数没有限制,由所需传输的数据块长度来决定;校验字符有1到2个,用于接收端对接收到的字符序列进行正确性的校验。</span><br style="font-family: arial;"><span style="font-family: arial;"> 同步通信的缺点是要求发送时钟和接收时钟保持严格的同步。</span><br style="font-family: arial;"><span style="font-family: arial;"> 2.2异步通信</span><br style="font-family: arial;"><span style="font-family: arial;"> 异步通信中,数据通常以字符或者字节为单位组成字符帧传送。字符帧由发送端逐帧发送,通过传输线被接收设备逐帧接收。发送端和接收端可以由各自的时钟来控制数据的发送和接收,这两个时钟源彼此独立,互不同步。</span><br style="font-family: arial;"><span style="font-family: arial;"> 接收端检测到传输线上发送过来的低电平逻辑"0"(即字符帧起始位)时,确定发送端已开始发送数据,每当接收端收到字符帧中的停止位时,就知道一帧字符已经发送完毕。</span><br style="font-family: arial;"><span style="font-family: arial;"> 在异步通行中有两个比较重要的指标:字符帧格式和波特率。</span><br style="font-family: arial;"><span style="font-family: arial;"> (1)字符帧,由起始位、数据位、奇偶校验位和停止位组成。如图:</span><br style="font-family: arial;"><br style="font-family: arial;"><span style="font-family: arial;">无空闲位字符帧</span><br style="font-family: arial;"><span style="font-family: arial;">+--+---+---+---+---+--+--+--+--+--+--+--+---+---+---+--+--+</span><br style="font-family: arial;"><span style="font-family: arial;">|D7|0/1| 1 | 0 |D0|D1|D2|D3|D4|D5|D6|D7|0/1| 1 | 0 |D0|D1|</span><br style="font-family: arial;"><span style="font-family: arial;">+--+---+---+---+--+--+--+--+--+--+--+--+---+---+---+--+--+</span><br style="font-family: arial;"><span style="font-family: arial;"> 奇偶 停 起 奇偶 停 起</span><br style="font-family: arial;"><span style="font-family: arial;"> 校验 止 始 校验 止 始</span><br style="font-family: arial;"><span style="font-family: arial;"> 位 位 位 位</span><br style="font-family: arial;"><br style="font-family: arial;"><span style="font-family: arial;">有空闲位字符帧</span><br style="font-family: arial;"><span style="font-family: arial;">+---+---+--+--+--+--+--+--+--+--+---+---+---+---+---+---+--+</span><br style="font-family: arial;"><span style="font-family: arial;">| 1 | 0 |D0|D1|D2|D3|D4|D5|D6|D7|0/1| 1 | 1 | 1 | 1 | 0 |D0|</span><br style="font-family: arial;"><span style="font-family: arial;">+---+---+--+--+--+--+--+--+--+--+---+---+---+---+---+---+--+</span><br style="font-family: arial;"><span style="font-family: arial;"> 空 起 奇偶 停 空 闲 位 起</span><br style="font-family: arial;"><span style="font-family: arial;"> 闲 始 校验 止 始</span><br style="font-family: arial;"><span style="font-family: arial;"> 位 位 位 位</span><br style="font-family: arial;"><br style="font-family: arial;"><span style="font-family: arial;"> 1.起始位:位于字符帧开头,占1位,始终为逻辑0电平,用于向接收设备表示发送端开始发送一帧信息。</span><br style="font-family: arial;"><span style="font-family: arial;"> 2.数据位:紧跟在起始位之后,可以设置为5位、6位、7位、8位,低位在前高位在后。</span><br style="font-family: arial;"><span style="font-family: arial;"> 3.奇偶校验位:位于数据位之后,仅占一位,用于表示串行通信中采用奇校验还是偶校验。</span><br style="font-family: arial;"><br style="font-family: arial;"><span style="font-family: arial;"> (2)波特率,波特率是每秒钟传送二进制数码的位数,单位是b/s。</span><br style="font-family: arial;"><span style="font-family: arial;"> 异步通信的优点是不需要传送同步脉冲,字符帧长度也不受到限制。缺点是字符帧中因为包含了起始位和停止位,因此降低了有效数据的传输速率。</span><br style="font-family: arial;"><br style="font-family: arial;"><span style="font-family: arial;">三、什么是RS-232</span><br style="font-family: arial;"><span style="font-family: arial;"> RS-232-C 接口(又称 EIA RS-232-C)它是在 1970 年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是"数据终端设备(DTE)和 数据通讯设备(DCE)之间串行二进制数据交换接口技术标准"该标准规定采用一个 25 个脚的 DB25 连接器,对连接器的每个引脚的信号内容加以规定,还对各种信号的电平加以规定。传输距离在码元畸变小于 4% 的情况下,传输电缆长度应为 50 英尺。 </span><br style="font-family: arial;"><br style="font-family: arial;"><span style="font-family: arial;">四、计算机串口引脚说明</span><br style="font-family: arial;"><span style="font-family: arial;"> 引出号 说明</span><br style="font-family: arial;"><span style="font-family: arial;"> 1 接地</span><br style="font-family: arial;"><span style="font-family: arial;"> 2 TXD输出</span><br style="font-family: arial;"><span style="font-family: arial;"> 3 RXD输入</span><br style="font-family: arial;"><span style="font-family: arial;"> 4 RTS请求发送</span><br style="font-family: arial;"><span style="font-family: arial;"> 5 CTS请求接收 </span><br style="font-family: arial;"><span style="font-family: arial;"> 6 DSR数据序列就绪</span><br style="font-family: arial;"><span style="font-family: arial;"> 7 GND逻辑地</span><br style="font-family: arial;"><span style="font-family: arial;"> 8 DCD数据负载检测</span><br style="font-family: arial;"><span style="font-family: arial;"> 9 保留 </span><br style="font-family: arial;"><span style="font-family: arial;"> 10 保留</span><br style="font-family: arial;"><span style="font-family: arial;"> 11 未定义</span><br style="font-family: arial;"><span style="font-family: arial;"> 12 后备DCD</span><br style="font-family: arial;"><span style="font-family: arial;"> 13 后备CTS</span><br style="font-family: arial;"><span style="font-family: arial;"> 14 后备TXD</span><br style="font-family: arial;"><span style="font-family: arial;"> 15 传输时钟</span><br style="font-family: arial;"><span style="font-family: arial;"> 16 后备RXD</span><br style="font-family: arial;"><span style="font-family: arial;"> 17 接收时钟</span><br style="font-family: arial;"><span style="font-family: arial;"> 18 未定义</span><br style="font-family: arial;"><span style="font-family: arial;"> 19 后备RTS</span><br style="font-family: arial;"><span style="font-family: arial;"> 20 DTR数据终端就绪</span><br style="font-family: arial;"><span style="font-family: arial;"> 21 信号质量检测</span><br style="font-family: arial;"><span style="font-family: arial;"> 22 闹钟检测</span><br style="font-family: arial;"><span style="font-family: arial;"> 23 数据速率选择</span><br style="font-family: arial;"><span style="font-family: arial;"> 24 传输时钟</span><br style="font-family: arial;"><span style="font-family: arial;"> 25 未定义</span><br style="font-family: arial;"><br style="font-family: arial;"><span style="font-family: arial;">五、全双工与半双工</span><br style="font-family: arial;"><span style="font-family: arial;"> 1.全双工,表示机器可以同时发送数据也可以接收数据,有两个独立的数据通道(一个用于发送,一个用于接收)</span><br style="font-family: arial;"><span style="font-family: arial;"> 2.半双工,表示机器不能在发送数据的同时也接收数据。</span><br style="font-family: arial;"><span style="font-family: arial;"> </span><br style="font-family: arial;"><span style="font-family: arial;">六、流量控制</span><br style="font-family: arial;"><span style="font-family: arial;"> 1.使用软件方法</span><br style="font-family: arial;"><span style="font-family: arial;"> 使用特殊的字符来标记数据流的开始和结束,比如XON,DC1,八进制021来标志开始,用X0FF,DC3,八进制023来标志结束。</span><br style="font-family: arial;"><span style="font-family: arial;"> 2.使用硬件方法</span><br style="font-family: arial;"><span style="font-family: arial;"> 使用RS232的CTS和RTS信号来代替特殊字符控制。当接收方准备接收更多数据时,设置CTS为0,反之设置成1。对应的发送端准备发送数据时,设置RTS为0。</span><br style="font-family: arial;"><br style="font-family: arial;"><span style="font-family: arial;">七、串口的访问</span><br style="font-family: arial;"><span style="font-family: arial;"> 串口设备在LINUX下与所有设备一样都是通过设备文件来进行访问。</span><br style="font-family: arial;"><span style="font-family: arial;"> 7.1打开串口</span><br style="font-family: arial;"><span style="font-family: arial;"> LINUX系统下串口设备是通过open函数来打开的,不过需要注意的是,一般用户是没有权限访问设备文件的,需要将打开的串口设备的访问权限设置成一般用户可以访问的权限。</span><br style="font-family: arial;"><span style="font-family: arial;"> open函数</span><br style="font-family: arial;"><span style="font-family: arial;"> 头文件</span><br style="font-family: arial;"><span style="font-family: arial;"> #include <sys/types.h></span><br style="font-family: arial;"><span style="font-family: arial;"> #include <sys/stat.h></span><br style="font-family: arial;"><span style="font-family: arial;"> #include <fcntl.h></span><br style="font-family: arial;"><span style="font-family: arial;"> 函数原型</span><br style="font-family: arial;"><span style="font-family: arial;"> int open(const char *pathname, int oflag, .../*, mode_t mode*/);</span><br style="font-family: arial;"><span style="font-family: arial;"> 参数</span><br style="font-family: arial;"><span style="font-family: arial;"> const char *pathname - 要打开文件的文件名称,例如/dev/ttyS0</span><br style="font-family: arial;"><span style="font-family: arial;"> int oflag - 文件打开方式,可用标志如下:</span><br style="font-family: arial;"><span style="font-family: arial;"> O_RDONLY 以只读方式打开文件</span><br style="font-family: arial;"><span style="font-family: arial;"> O_WRONLY 以只写方式打开文件</span><br style="font-family: arial;"><span style="font-family: arial;"> O_RDWR 以读写方式打开文件</span><br style="font-family: arial;"><span style="font-family: arial;"> O_APPEND 写入数据时添加到文件末尾</span><br style="font-family: arial;"><span style="font-family: arial;"> O_CREATE 如果文件不存在则产生该文件,使用该标志需要设置访问权限位mode_t</span><br style="font-family: arial;"><span style="font-family: arial;"> O_EXCL 指定该标志,并且指定了O_CREATE标志,如果打开的文件存在则会产生一个错误</span><br style="font-family: arial;"><span style="font-family: arial;"> O_TRUNC 如果文件存在并且成功以写或者只写方式打开,则清除文件所有内容,使得文件长度变为0</span><br style="font-family: arial;"><span style="font-family: arial;"> O_NOCTTY 如果打开的是一个终端设备,这个程序不会成为对应这个端口的控制终端,如果没有该标志,任何一个输入,例如键盘中止信号等,都将影响进程。</span><br style="font-family: arial;"><span style="font-family: arial;"> O_NONBLOCK 该标志与早期使用的O_NDELAY标志作用差不多。程序不关心DCD信号线的状态,如果指定该标志,进程将一直在休眠状态,直到DCD信号线为0。</span><br style="font-family: arial;"><span style="font-family: arial;"> O_SYNC 对I/O进行写等待</span><br style="font-family: arial;"><span style="font-family: arial;"> 返回值</span><br style="font-family: arial;"><span style="font-family: arial;"> 成功返回文件描述符,如果失败返回-1</span><br style="font-family: arial;"><br style="font-family: arial;"><span style="font-family: arial;"> 例如:以可读写方式打开/dev/ttyS0设备</span><br style="font-family: arial;"><span style="font-family: arial;"> int fd; /* 文件描述符 */</span><br style="font-family: arial;"><span style="font-family: arial;"> fd = open("/dev/ttyS0", O_RDWR | 0_NOCTTY | O_NONBLOCK);</span><br style="font-family: arial;"><br style="font-family: arial;"><span style="font-family: arial;"> 7.2关闭串口</span><br style="font-family: arial;"><span style="font-family: arial;"> Linux系统下通过close函数来关闭串口设备</span><br style="font-family: arial;"><span style="font-family: arial;"> close函数</span><br style="font-family: arial;"><span style="font-family: arial;"> 头文件</span><br style="font-family: arial;"><span style="font-family: arial;"> #include <unistd.h></span><br style="font-family: arial;"><span style="font-family: arial;"> 函数原型</span><br style="font-family: arial;"><span style="font-
查看全文
发表于:2007-12-08 ┆
阅读(321)
┆
评论(0)