本文基于嵌入式linux下并口应用编程进行了研究,详尽介绍了并口设置的步骤,可以更好的理解并口的工作原理。
一、引言
并口是一种常用的插口,常用的并口有RS-232-C插口。S3C2410X内部具有两个独立的UART控制器,每位控制器都可以工作在Interrupt(中断)模式或则DMA(直接储存访问)模式。同时,每位UART均具有16字节的FIFO(先入先出寄存器),支持的最高波特率可达到230.4kb/s.
UART的操作主要可分为以下几个部份:数据发送、数据接收、产生中断、设置码率、Loopback模式、红外模式以及硬软流控模式。
在linux中,所有的设备文件通常都坐落“/dev”下,其中并口1和并口2对应的设备名依次为“/dev/ttyS0”和“/dev/ttyS1”,但是USB转并口的设备名一般为“/dev/ttyUSB0”
和“/dev/ttyUSB1”,下边就详尽讲解并口应用编程。
二、串口设置解读
读写并口设备时须要设置并口的码率、校验码、停止位等等,对于应用程序开发来说,对于并口设备的设置主要通过如下的结构体完成的:
termios是POSIX定义的标准插口,是对虚拟终端、串口等终端类设备的一种具象。终端有规范模式、非规范模式和原始模式这三种工作模式。上述结构体成员的c_lflag的ICANNON标志位用于定义终端的工作模式类型,假如设置这一位说明终端工作与规范模式下,假如过去除该标志表明终端工作在非规范模式下。默认情况是工作在规范模式下。
在规范模式下linux shell,对输入是通过行的形式进行处理的。在输入行结束符(包括回车符、EOF等)之前,系统调用read()函数是读不到输入的数据。在非规范模式下,输入全部都是即时生效的,既不须要额外输入行结束符,也不须要进行行编辑。在该模式下,用户可以通过对参数MIN(c_cc[VMIN])和TIME(c_cc[VTIME])的设置来决定调用read()函数的形式。下边是4中不同的设置情况。
(1)MIN以及TIME全部为0的情况下:
read()函数立刻返回。若有可读的数据时,则读取数据并返回被读取的字节数,否则读取失败并返回0.
(2)MIN小于0,TIME为0:read()函数会等待到有MIN个字节可以被读取,否则始终处于阻塞状态。
(3)MIN为0,而TIME>0:只要满足两种情形下:a、存在数据可读;b、阻塞TIME的非常之1秒,read函数都会返回linux串口怎么使用,其中返回值为读取到的字节数。若果在有数据可读前超时,则read()函数返回值为0.
(4)MIN和TIME全都小于0:只有满足如下两种情形之一时,read()函数才能返回:缓存区中有MIN个字节,或则在两个字符之间超时TIME个非常之1秒。
从严格意义上来讲,原始模式是一种特殊的非规范模式。在原始模式下,对输入数据的处理方法是按字节为单位,而且终端是不可回显的。通过调用cfmakeraw()函数就可以将把终端的该工作模式设置为原始模式。
三、简单的并口设置解读流程
下边以指纹辨识系统为例介绍下并口的操作流程。
本系统中linux串口怎么使用,对并口的操作和使用可以分为如下几个部份:并口的初始化(包括并口设备的打开、串口设备属性的设置)、串口数据单字节读取、串口数据的多字节读取、串口数据的单字节写入、串口数据的多字节写入、串口设备的关掉。
1.并口设备的初始化过程
(1)打开并口
在Linux系统中,对设备的操作就像普通文件一样,在本系统中打开并口设备的代码如下所示:
#defineDEVICENAME0“/dev/s3c2410_serial1″fd=open(DEVICENAME0,O_RDWR|O_NONBLOCK);
DEVICENAME0表示要打开的并口设备名称,这个和特定的设备相关,在Linux桌面系统上通常为/dev/ttyS*,而在嵌入式系统中,这个按照UART驱动对的板级信息不同而不同,没有统一的规定,在本系统中是/dev/s3c2410_serial1.
O_RDWR表示以读写方法打开并口设备O_NONBLOCK标志代表将之后的读写操作全以非阻塞模式。注意,这儿必须选择非阻塞方法打开,否则会造成程序运行出错。
为了读写并口设备,须要恢复并口读写方法为阻塞状态,以用于等待数据,可用fcntl()函数实现:
(2)配置并口设备的属性
在打开并口设备以后,须要对并口设备的属性进行配置。主要包括设置码率、设置字符大小、设置奇偶校准位、设置停止位以及设置最小字符和等待时间等。
设置并口设备之前linux ftp,须要先获取当前并口设备的属性,这是由于结构体termios的成员都是和特定寄存器对应的,假如不先获取曾经的状态,可能将寄存器中的值全部覆盖,因而造成通讯失败,但是在操作完并口设备之后,须要将并口设备的属性恢复到先前的值。获取当前并口设备属性的过程如下:
tcgetattr(fd,&new_cfg);//从fd代表的并口设备中获取当前的状态并将其保存在new_cfg中。
接出来是将并口设备设置为原始模式,在本系统中须要使用原始模式进行通讯。
cfmakeraw(&new_cfg);
将并口通讯的字符大小设为8个字符new_cfg.c_cflag&=~CSIZE;
new_cfg.c_cflag|=CS8;
设置码率
cfsetispeed(&new_cfg,BARDRATE);//设
置输入码率
cfsetospeed(&new_cfg,BARDRATE);//设
置输出码率
设置奇偶校准位,不适用奇偶校准
new_cfg.c_cflag&=~PARENB;
new_cfg.c_iflag&=~INPCK;
设置停止位,使用一个byte
new_cfg.c_cflag&=~CSTOPB;
设置读取字符大小以及等待时间
new_cfg.c_cc[VTIME]=50;//两个字符之间
等待超过5s返回
new_cfg.c_cc[VMIN]=1;//最少读取一个
字符
去除并口缓存
该操作是必不可少的,否则会造成并口通讯失败。
tcflush(fd,TCIOFLUSH);
其中TCIOFLUSH表示清空串口的缓存。
接出来须要激活配置if((tcsetattr(fd,TCSANOW,&new_cfg))!=0)
//perror(”tcsetattr“);
return1;
并口初始化、串口属性的设置的流程图,如图1所示。
2.并口的读写和关掉
借助并口通讯的过程就是对并口设备的读写过程,只须要借助read()函数和write()函数对打开的并口设备的文件描述符操作即可。
在操作完并口退出程序时,须要将打开的并口关掉,这个过程和关掉普通的文件一样,调用close()函数即可完成。
四、结束语
本文以指纹辨识系统的并口编程为例,探讨了Linux系统下,并口编程的具体设置方式,在本文的基础上再添加下层软件的设计即可完成一个指纹辨识系统。