您的位置 首页 汽车

嵌入式linux串口使用编程设计

本文基于嵌入式linux下串口应用编程进行了研究,详细介绍了串口设置的步骤,可以更好的理解串口的工作原理。一、引言串口是一种常用的接口,常用的串口有RS-232-C接口。S3C24

  本文依据嵌入式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标志位用于界说终端的作业形式类型,假如设置这一位阐明终端作业与标准形式下,假如过铲除该标志标明终端作业在非标准形式下。默许状况是作业在标准形式下。

  在标准形式下,对输入是经过行的办法进行处理的。在输入行结束符(包含回车符、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的十分之一秒,read函数就会回来,其间回来值为读取到的字节数。假如在有数据可读前超时,则read()函数回来值为0.

  (4)MIN和TIME全都大于0:只要满意如下两种景象之一时,read()函数才会回来 :缓存区中有MIN个字节,或许在两个字符之间超时TIME个十分之一秒。

  从严厉意义上来讲,原始形式是一种特别的非标准形式。在原始形式下,对输入数据的处理办法是按字节为单位,而且终端是不行回显的。经过调用cfmakeraw()函数就能够将把终端的该作业形式设置为原始形式。

  三、简略的串口设置详解流程

  下面以指纹识别体系为例介绍下串口的操作流程。

  本体系中,对串口的操作和运用能够分为如下几个部分:串口的初始化(包含串口设备的翻开、串口设备特点的设置)、串口数据单字节读取、串口数据的多字节读取、串口数据的单字节写入、串口数据的多字节写入、串口设备的封闭。

  1.串口设备的初始化进程

  (1)翻开串口

  在Linux体系中,对设备的操作好像一般文件相同,在本体系中翻开串口设备的代码如下所示:

  #define DEVICENAME0 “/dev/s3c2410_serial1″f d = o p e n ( D E V I C E N A M E 0 , O _ R D W R | O _NONBLOCK);

  DEVICENAME0表明要翻开的串口设备称号,这个和特定的设备相关,在Linux桌面体系上一般为/dev/ttyS*,而在嵌入式体系中,这个依据UART驱动对的板级信息不同而不同,没有一致的规则,在本体系中是/dev/s3c2410_serial1.

  O_RDWR表明以读写办法翻开串口设备O_NONBLOCK标志代表将今后的读写操作全以非堵塞形式。留意,这儿有必要挑选非堵塞办法翻开,不然会导致程序运转犯错。

  为了读写串口设备,需求康复串口读写办法为堵塞状况,以用于等候数据,可用fcntl()函数完结:

  (2)装备串口设备的特点

  在翻开串口设备之后,需求对串口设备的特点进行装备。首要包含设置波特率、设置字符巨细、设置奇偶校验位、设置中止位以及设置最小字符和等候时间等。

  设置串口设备之前,需求先获取当时串口设备的特点,这是由于结构体termios的成员都是和特定寄存器对应的,假如不先获取曾经的状况,可能将寄存器中的值悉数掩盖,然后导致通讯失利,而且在操作完串口设备今后,需求将串口设备的特点康复到曾经的值。获取当时串口设备特点的进程如下:

  tcgetattr(fd,&new_cfg); / /从f d代表的串口设备中获取当时的状况并将其保存在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“);

  return 1;

  }

  串口初始化、串口特点的设置的流程图,如图1所示。

  2.串口的读写和封闭

  使用串口通讯的进程便是对串口设备的读写进程,只需求使用read()函数和write()函数对翻开的串口设备的文件描述符操作即可。

  在操作完串口退出程序时,需求将翻开的串口封闭,这个进程和封闭一般的文件相同,调用close()函数即可完结。

  四、结束语

  本文以指纹识别体系的串口编程为例,论述了Linux体系下,串口编程的详细设置办法,在本文的基础上再增加上层软件的规划即可完结一个指纹识别体系。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/283315.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部