大学嵌入式串口实验报告框架文档格式.docx
《大学嵌入式串口实验报告框架文档格式.docx》由会员分享,可在线阅读,更多相关《大学嵌入式串口实验报告框架文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
很多GPIB兼容的设备也带有RS-232口。
同时,串口通信协议也可以用于获取远程采集设备的数据。
串口通信的概念非常简单,串口按位(bit)发送和接收字节。
尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。
它很简单并且能够实现远距离通信。
比如IEEE488定义并行通行状态时,规定设备线总常不得超过20XX米,并且任意两个设备间的长度不得超过2米;
而对于串口而言,长度可达20XXXX00米。
典型地,串口用于ASCII码字符的传输。
通信使用3根线完成:
(1)地线,
(2)发送,(3)接收。
由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。
其他线用于握手,但是不是必须的。
串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。
对于两个进行通行的端口,这些参数必须匹配:
a,波特率:
这是一个衡量通信速度的参数。
它表示每秒钟传送的bit的个数。
例如300波特表示每秒钟发送300个bit。
当我们提到时钟周期时,我们就是指波特率例如如果协议需要4800波特率,那么时钟是4800Hz。
这意味着串口通信在数据线上的采样率为4800Hz。
通常电话线的波特率为20XXXX400,28800和36600。
波特率可以远远大于这些值,但是波特率和距离成反比。
高波特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB设备的通信。
b,数据位:
这是衡量通信中实际数据位的参数。
当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位。
如何设置取决于你想传送的信息。
比如,标准的ASCII码是0~20XXXX7(7位)。
扩展的ASCII码是0~255(8位)。
如果数据使用简单的文本(标准ASCII码),那么每个数据包使用7位数据。
每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。
由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。
c,停止位:
用于表示单个包的最后一位。
典型的值为1,1.5和2位。
由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。
因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。
适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。
d,奇偶校验位:
在串口通信中一种简单的检错方式。
有四种检错方式:
偶、奇、高和低。
当然没有校验位也是可以的。
对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。
例如,如果数据是020XXXX,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。
如果是奇校验,校验位位1,这样就有3个逻辑高位。
高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。
这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步.
Linux对所有设备的访问是通过设备文件来进行的,串口也是这样,为了访问串口,只需打开其设备文件即可操作串口设备。
在linux系统下面,每一个串口设备都有设备文件与其关联,设备文件位于系统的/dev目录下面。
如linux下的/ttyS0,/ttyS1分别表示的是串口1和串口2。
下面来详细介绍linux下是如何使用串口的:
1.
串口操作需要用到的头文件
#include
<
stdio.h>
/*标准输入输出定义*/
stdlib.h>
/*标准函数库定义*/
unistd.h>
/*Unix标准函数定义*/
sys/types.h>
sys/stat.h>
fcntl.h>
/*文件控制定义*/
termios.h>
/*POSIX终端控制定义*/
errno.h>
/*错误号定义*/
string.h>
/*字符串功能函数*/
2.
串口通讯波特率设置
波特率的设置定义在<
asm/termbits.h>
,其包含在头文件<
里。
常用的波特率常数如下:
B0-------à
0
B20XXXX00-------à
20XXXX00
B50-----à
50
B2400------à
2400
B75-----à
75
B4800------à
4800
B20XXXX0XX----à
20XXXX0XX
B20XXXX00------à
B20XXXX4----à
20XXXX4.5
B20XXXX20XX0-----à
20XXXX20XX0
B20XX0----à
20XX0
B38400------à
38400
B300----à
300
B57600------à
57600
B600----à
600
B76800------à
76800
B20XXXX00---à
20XXXX00
B20XXXX520XX0-----à
20XXXX520XX0
假定程序中想要设置通讯的波特率,使用cfsetispeed()和cfsetospeed()函数来操作,获取波特率信息是通过cfgetispeed()和cfgetospeed()函数来完成的。
比如可以这样来指定串口通讯的波特率:
#include<
//头文件定义
structtermiosopt;
/*定义指向termios结构类型的指针opt*/
/***************以下设置通讯波特率****************/
cfsetispeed(&
opt,B20XXXX00);
/*指定输入波特率,20XXXX00bps*/
cfsetospeed(&
opt,B20XXXX00);
/*指定输出波特率,20XXXX00bps*/
/************************************************/
一般来说,输入、输出的波特率应该是一致的。
3.
串口属性配置
在程序中,很容易配置串口的属性,这些属性定义在结构体structtermios中。
为在程序中使用该结构体,需要包含文件<
termbits.h>
,该头文件定义了结构体structtermios。
该结构体定义如下:
#defineNCCS20XXXX
structtermios{
tcflag_tc_iflag;
/*输入参数*/
tcflag_tc_oflag;
/*输出参数*/
tcflag_tc_cflag;
/*控制参数*/
tcflag_tc_ispeed;
/*输入波特率*/
tcflag_tc_ospeed;
/*输出波特率*/
cc_tc_line;
/*线控制*/
cc_tc_cc[NCCS];
/*控制字符*/
};
其中成员c_line在POSIX(PortableOperatingSystemInterfaceforUNIX)系统中不使用。
对于支持POSIX终端接口的系统中,对于端口属性的设置和获取要用到两个重要的函数是:
(1).inttcsetattr(intfd,intopt_DE,*ptr)
该函数用来设置终端控制属性,其参数说明如下:
l
fd:
待操作的文件描述符
opt_DE:
选项值,有三个选项以供选择:
TCSANOW:
不等数据传输完毕就立即改变属性
TCSADRAIN:
等待所有数据传输结束才改变属性
TCSAFLUSH:
清空输入输出缓冲区才改变属性
*ptr:
指向termios结构的指针
函数返回值:
成功返回0,失败返回-1。
(2).inttcgetattr(intfd,*ptr)
该函数用来获取终端控制属性,它把串口的默认设置赋给了termios数据数据结构,其参数说明如下:
4.
打开串口
在前面已经提到linux下的串口访问是以设备文件形式进行的,所以打开串口也即是打开文件的操作。
函数原型可以如下所示:
intopen(“DE_name”,intopen_Status)
参数说明:
(1).DE_name:
要打开的设备文件名
比如要打开串口1,即为/dev/ttyS0。
(2).open_Status:
文件打开方式,可采用下面的文件打开模式:
O_RDONLY:
以只读方式打开文件
O_WRONLY:
以只写方式打开文件
O_RDWR:
以读写方式打开文件
O_APPEND:
写入数据时添加到文件末尾
O_CREATE:
如果文件不存在则产生该文件,使用该标志需要设置访问权限位mode_t
O_EXCL:
指定该标志,并且指定了O_CREATE标志,如果打开的文件存在则会产生一个错误
O_TRUNC:
如果文件存在并且成功以写或者只写方式打开,则清除文件所有内容,使得文件长度变为0
O_NOCTTY:
如果打开的是一个终端设备,这个程序不会成为对应这个端口的控制终端,如果没有该标志,任何一个输入,例如键盘中止信号等,都将影响进程。
O_NONBLOCK:
该标志与早期使用的O_NDELAY标志作用差不多。
程序不关心DCD信号线的状态,如果指定该标志,进程将一直在休眠状态,直到DCD信号线为0。
成功返回文件描述符,如果失败返回-1
例如假定以可读写方式打开/dev/ttyS0设备,就可以这样操作:
#include<
//头文件包含
intfd