基于嵌入式Linux下串口应用编程的研究

发布者:创意旅程最新更新时间:2013-12-06 来源: dzsc关键字: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)配置串口设备的属性

  在打开串口设备之后,需要对串口设备的属性进行配置。主要包括设置波特率、设置字符大小、设置奇偶校验位、设置停止位以及设置最小字符和等待时间等。[page]

  设置串口设备之前,需要先获取当前串口设备的属性,这是因为结构体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系统下,串口编程的具体设置方法,在本文的基础上再添加上层软件的设计即可完成一个指纹识别系统。

关键字:Linux  串口应用编程  串口设置 引用地址:基于嵌入式Linux下串口应用编程的研究

上一篇:入门知识分享之CAN总线
下一篇:基于USB接口的锂离子电池充电电路设计方案

推荐阅读最新更新时间:2024-05-02 22:52

嵌入式Linux的GDB远程调试的实现
  远程调试环境由宿主机GDB和目标机调试stub共同构成,两者通过串口或TCP连接。使用GDB标准远程串行协议协同工作,实现对目标机上的系统内核和上层应用的监控和调试功能。调试stub是嵌入式系统中的一段代码,作为宿主机GDB和目标机调试程序间的一个媒介而存在。     就目前而言,嵌入式Linux系统中,主要有三种远程调试方法,分别适用于不同场合的调试工作:用ROM Monitor调试目标机程序、用KGDB调试系统内核和用gdbserver调试用户空间程序。这三种调试方法的区别主要在于,目标机远程调试stub的存在形式的不同,而其设计思路和实现方法则是大致相同的。     而我们最常用的是调试应用程序。就是采用gdb+gdbs
[单片机]
嵌入式Linux的SOHO路由器电路设计
  针对目前SOHO 路由器设计方案难以满足高速接入网用户要求和存在系统稳定性方面的不足,以嵌入式Linux 操作系统为基础,提出一种新的SOHO(Small Office and Home Office)路由器设计方案,有效地提高了系统的稳定性和安全性。   利用Linux 内核支持IP Masquerade技术实现NAT 转换,实现多台主机共享访问因特网。IP Masquerade 工作原理:客户机将实现IP Masquerade 的Linux 机器设置为缺省网关,当IP Masquerade 的Linux 机器收到客户机的数据包时,对其进行改写,将源地址替换为自己的IP 地址,将源端口号换成一个新的端口号,并且对该过程进行记
[电源管理]
嵌入式<font color='red'>Linux</font>的SOHO路由器电路设计
基于Arm-Linux的嵌入式智能家居控制系统的设计
嵌入式系统以其占用资源少、专用性强、功耗低的特点使其广泛应用在移动通信、工业生产、安全监控等领域。针对人们对高效、舒适、安全、便利、环保的居住环境的要求,提出了以Arm-Linux为平台的智能家居控制系统的设计。 1 智能家居控制器的总体设计 Arm-Linux嵌入式系统以其在性能、体积及功耗等方面的优势在智能家居领域得到越来越广泛的应用。系统采用基于ARM的嵌入式linux方案,系统分为五层分别为硬件层,系统引导层,系统层,应用支撑层及应用层。如图1所示应用层在Qtopia图形系统、SQLite数据库等的支撑下完成了电话报警、照明控制、安防控制、门禁控制以及网络浏览等应用。 2 系统硬件的设计 CPU处理器选用
[单片机]
基于Arm-<font color='red'>Linux</font>的嵌入式智能家居控制系统的设计
arm-linux gdb调试工具的安装
开发环境:AT91SAM9X25开发板:安装linux2.6.39; pc的虚拟机:Linux version 2.6.18-194.el5 (gcc version 4.1.2 20080704 (Red Hat 4.1.2-48)) ,arm-linux-gcc的版本为version 4.4.3 二、安装 (1)解压:tar zxvf gdb-6.8a.tar.gz (2)配置安装gdb: cd gdb-6.8 ./configure --target=arm-linux make make install (3)配置安装gdbserver: cd gdb cd gdbserver ./configure --target
[单片机]
arm-<font color='red'>linux</font> gdb调试工具的安装
嵌入式Linux ARM汇编(四)——ARM汇编程序设计
汇编程序有顺序、循环、分支、子程序四种结构形式。 一、顺序结构 程序实例: AREA Buf,DATA,READWRITE;定义数据段Buf Array DCB 0x11,0x22,0x33,0x44;定义12个字节的数组Array DCB 0x55,0x66,0x77,0x88 DCB 0x00,0x00,0x00,0x00 AREA hello,CODE32,READONLY ENTRY LDR R0,=Array;取得数组Array的首地址 LDR R2, ;装载数组第1字节数据给R2 MOV R1,#1 LDR R3, ;装载数组第5字节数据给R3 ADD R2,R2,R3 MOV R1,#8 STR R2, ;
[单片机]
s5pv210----串口设置之输入输出字符
第一节 S5PV210 UART相关说明 通用异步收发器简称UART,即UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER,它用来传输串行数据。发送数据时,CPU 将并行数据写入UART,UART按照一定的格式在一根电线上串行发出;接收数据时,UART检测另一根电线的信号,将串行收集在缓冲区中,CPU 即可读取UART获得这些数据。 在S5PV210 中,UART提供了4 对独立的异步串口I/O 端口,有 4 个独立的通道,每个通道可以工作于DMA 模式或者中断模式。其中,通道0 有256byte 的的发送FIFO和256byte 的接收FIFO,通道1 有64byte的的发送FIF
[单片机]
s5pv210----<font color='red'>串口</font><font color='red'>设置</font>之输入输出字符
基于FPGA与ARM的遥测数据网络化采集
    以太网接口通信速度快,传输可靠,使用和配置方便,对于20 Mb/s以下的码速率,100 Mb/s的网卡可以进行不丢包转发,采用TCP包格式还可使设备小型化,便于数据的转发,因此有必要扩展设备的以太网功能。 1 整体模块设计 1.1 系统设计     系统设计框图如图1所示。其中,采编器或接收机解调输出的PCM信号及时钟输入到FPGA中进行帧同步,IRIG—B码信息也送到FPGA中进行解调,得到时间信息。数据与时间一起存入SRAM乒乓缓冲区中,达到一定大小后,FPGA向ARM处理器发器中断,ARM中运行的Linux系统,将数据取走,进行TCP/IP打包,发送给接收计算机。     在设备开始工作前,需要在计算机端进行参
[单片机]
基于FPGA与ARM的遥测数据网络化采集
Boost下载安装编译配置使用指南(含Windows、Linux以及ARM Linux
——更新于2011/7/19,目前我已对boost的安装和使用有了新的认识,因此也会对两年前写的这篇文章做大幅修改,网上转载版本泛滥,请以本文为准。 ——更新于2013/3/20,增加ARM Linux下的编译配置方法。 理论上,本文适用于boost的各个版本,尤其是最新版本1.48.0;适用于各种C++编译器,如VC6.0(部分库不支持),VS2003,VS2005,VS2008,VS2010,V2012,gcc,arm-linux-gcc,C++ Builder等。 先总结一下Windows系统。 一、下载 首先从boost官方主页 http://www.boost.org/ 下载最新版boost安装包,或者使用Subv
[单片机]
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved