第7章 嵌入式uClinux及其应用开发(2)(3)

2019-05-18 21:41

Flags: 0x1 ( Load-to-Ram )

从显示的信息,可以看出文件lednxy的确是一个flat格式的文件,是可以在uClinux环境下运行的。 7.4.1 串行通信

所谓串行通信就是在传输数据的时候每次只传输一位,其传输的速率通常用“位/秒”来表示,即通常所说的“波特率”。

Linux对所有各类设备文件的输入输出操作,看上去就像对普通文件的输入输出一样,所以Linux对串口的操作,也是通过设备文件访问的。为了访问串口,只需要打开相应的设备文件即可。设备文件/dev/ttyS*是用于挂起Linux终端的文件。默认地,在Linux下,串行口COM1和COM2对应的设备分别为/dev/ttyS0和/dev/ttyS1。

在程序中,很容易配置串口的属性,这些属性定义在结构体struct termios中。为在程序中使用该结构体,需要包含文件,该头文件定义了结构体struct termios。

#define NCCS 19 struct termios {

tcflag_t c_iflag; /* input mode flags */ tcflag_t c_oflag; /* output mode flags */ tcflag_t c_cflag; /* control mode flags */ tcflag_t c_lflag; /* local mode flags */ cc_t c_line; /* line discipline */ cc_t c_cc[NCCS]; /* control characters */ };

下面对结构体中的各个成员做一个简单介绍。

在c_iflag中的输入模式标志符控制所有的输入处理过程,就是说,从设备发送的字符在被read函数读取之前要经过处理。类似的,成员c_oflag控制输出处理过程,c_cflag包含对端口的设置,如,波特率,字符位数,停止位等。存储在成员c_lflag的本地模式标志符决定是否显示字符,是否发送信号到应用程序等。数组c_cc包含了控制字符的定义和超时参数。成员c_line在POSIX(Portable Operating System Interface for UNIX)系

统中不使用。

下面结合一个简单的实例,说明如何对串口进行读写操作。

/******************************************************* * Institute of Automation, Chinese Academy of Sciences * File Name: serialcomm.c

* Description:communication with serial * Author: * Date:

Xueyuan Nie

*******************************************************/ #include #include #include #include #include

#define BAUDRATE B19200 #define SERIALDEVICE \int main() {

int fd,ncount;

struct termios oldtio,newtio;

char buf[]=\

fd = open(SERIALDEVICE, O_RDWR | O_NOCTTY );

if (fd <0)

{

perror(SERIALDEVICE); exit(-1);

}

tcgetattr(fd,&oldtio);

bzero(&newtio, sizeof(newtio));

newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD; newtio.c_iflag = IGNPAR | ICRNL; newtio.c_oflag = 0; newtio.c_lflag = ICANON; tcflush(fd, TCIFLUSH);

fcntl(fd,F_SETFL,0);

tcsetattr(fd,TCSANOW,&newtio); ncount=write(fd,buf,sizeof(buf));

printf(\

printf(\

perror(\

tcsetattr(fd,TCSANOW,&oldtio);

close (fd); }

return 0;

程序首先为波特率常数定义了宏值,为设备文件定义了设备名常数。有关波特率常数的定义可参见(该头文件包含在termios.h中)。 对于普通用户而言,是不允许访问设备文件的,如果要访问,要么以root

账号登录,要么需要改变文件的访问属性。假定设备文件是可以访问的,用open函数打开设备文件,返回一个文件描述符(file descriptors,fd),通过文件描述符来访问文件。O_RDWR标志表示对该文件可读可写,O_NOCTTY表示该程序不会成为控制终端,这样就避免了当在键盘输入类似ctrl+c的命令后,终止程序的运行。

然后用tcgetattr保存串口的当前设置,给端口设置新的属性,通过对c_cflag的赋值,设置波特率,字符大小(CS8表示8位数据位,1位停止位,没有奇偶校验位),使能本地连接,使能串行口驱动读取输入数据。 通过设置c_iflag ,控制端口对字符的输入处理过程,IGNPAR符号常量表示忽略奇偶性错误的字节,并不对输入数据进行任何校验,ICRNL 将回车符映射为换行符。

设置原始数据输出,使能规范输入。

在对struct termios结构体的各个成员赋值完毕后,调用tcsetattr函数选择新的设置,常数TCSANOW表示新设置立即生效。

调用write函数往串口发送数据,此时如果打开超级终端应该可以看到写入的字符串。对串口操作结束后,恢复原有的端口设置,关闭打开的设备文件。 以上是一个简单的对串口进行写操作的程序,因为通过超级终端来显示,所以没有调用read函数,如果接收数据的一端是其他设备的话,有可能需要读者再编写一个接收数据的程序,运行发送和接收程序的两台设备通过串行口进行连接。也可以将接收和发送的程序在同一台设备上运行,通过一根交叉线(就是将 TXD-数据传输信号和另一个端口的 RXD -接收数据信号相连起来)将两个串口接在一起。

下面就针对上述提到的情况,再举一个有关接收和发送数据的程序,通过串口交叉线的连接运行在不同设备(也可以是同一台设备)上的例子。 假设接收程序readtest.c运行在装有标准Linux的PC机上,发送程序writetest.c运行在目标板S3C4510B上,两台设备的串口通过交叉线连接在一起。

接收程序readtest.c的源码如下:

/******************************************************* * Institute of Automation, Chinese Academy of Sciences * File Name: readtest.c

* Description: receive data from the serial

* Author: * Date:

Xueyuan Nie

*******************************************************/ #include #include #include #include #include #include #include #include #include \ int spfd; int main() {

char fname[16],hd[16],*rbuf; int retv,i,ncount=0; struct termios oldtio; int realdata=0;

spfd=open(\ perror(\


第7章 嵌入式uClinux及其应用开发(2)(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:分子克隆实验标准步骤

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: