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中。为在程序中使用该结构体,需要包含文件
#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
#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;
程序首先为波特率常数定义了宏值,为设备文件定义了设备名常数。有关波特率常数的定义可参见
账号登录,要么需要改变文件的访问属性。假定设备文件是可以访问的,用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
char fname[16],hd[16],*rbuf; int retv,i,ncount=0; struct termios oldtio; int realdata=0;
spfd=open(\ perror(\