当前位置: 主页 > 论文库 > 计算机 > 计算机理论 >

Linux下的串口驱动程序设计与编程

时间:2011-12-09 11:34 来源:www.lunwen163.com 作者:163论文网 点击:
摘要:论文首先分析了Linux下的特点,然后给出了Linux设备驱动程序的基本原理,以及串口的基本原理,进一步分析了串口技术,并且给出了串口编程的方法。 关键词:串口;linux;编程;驱动程序开发

0Linux简介
Linux是一套免费使用和自由传播的、主要基于Intelx86系列CPU的类Unix操作系统。这个系统是由世界各地的成千上万的程序员设计和实现的。Linux包含了Unix的全部功能和特性,Linux由于其具有内核强大且稳定,易于扩展和裁减,效率高,丰富的硬件支持等许多优点,在嵌人式系统中得到了广泛的。本文基于嵌人式操作系统下设备驱动程序的开发需要,阐述相关技术原理及设计要点,探求嵌人式Linux系统中设备驱动程序的构建方法。
1Linux设备驱动程序与串口
在Linux下编写设备驱动程序的原理和思想完全类似于其他的Unix系统,即基于I/O设备管理采用的分层模型。l/O设备管理软件位于内核中的最底层,设备驱动程序是操作系统内核和机器硬件之间的接El,设备驱动程序为应用程序屏蔽了硬件的细节。
Linux 操作系统从一开始就对串行口提供了很好的支持。串行口是计算机一种常用的接口,具有连接线少,通讯简单特点。常用的串口是 RS-232-C 接口。它的全名是"数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换 接口技术标准"该标准规定采用一个 25 个脚的 DB25 连接器,对连接器的每个引脚的信号内容加以规定,还对各种信号的电平加以规定。传输距离在码元畸变小于 4% 的情况下,传输电缆长度应为 50 英尺。
2Linux下串口的操作分析
1. 串口操作需要的头文件:
#include     <stdio.h>      /*标准输入输出定义*/
#include     <stdlib.h>     /*标准函数库定义*/
#include     <unistd.h>     /*Unix 标准函数定义*/
#include     <fcntl.h>      /*文件控制定义*/
#include     <termios.h>    /*PPSIX 终端控制定义*/
#include     <errno.h>      /*错误号定义*/
2. 打开串口
在 Linux 下串口文件是位于 /dev 下的串口1为 /dev/ttyS0 ,串口2 为 /dev/ttyS1。打开串口通过标准的文件打开函数操作:int fd; /*以读写方式打开串口*/
3. 设置串口
最基本的设置串口包括波特率设置,效验位和停止位设置。串口的设置主要是设置 struct termios 结构体的各成员值。
4. 波特率设置
下面是修改波特率的代码:
struct  termios Opt;tcgetattr(fd, &Opt);cfsetispeed(&Opt,B19200);
cfsetospeed(&Opt,B19200);tcsetattr(fd,TCANOW,&Opt);
5. 效验位和停止位的设置:

无效验 

8位 Option. C _c flag &= ~PARENB;
  Option. C _c flag &= ~CSTOPB;


奇效验(Odd) 

7位 Option. C _ c flag = ~PARENB;
  Option. C _c flag &= ~PARODD;
  Option. C _c flag = ~CS7;

Space效验 
7位 Option. C _c flag &= ~PARENB;
  Option. c_ c flag &= ~CSTOPB
  Option. c_ c flag &= &~CSIZE;
  Option. C _c flag = CS8;
3驱动程序的编写
前面的内容都是为了串口驱动程序的编写做准备,结合以上内容和Linux相关驱动程序的资料,编写串口驱动程序,下面是部分代码。
#include "cserialport.h"
#define TIMEOUT_SEC(buflen,baud) (buflen*20/baud+2)
CSerialPort::CSerialPort()
{}/* Open serial port ComPort at baudrate baud rate. */
int CSerialPort::OpenComPort (int ComPort, int baudrate, int databit,
const char *stopbit, char parity)
{   char *pComPort;   Int retval; 
 switch (ComPort)   {/* 寻找串口 */}
fd = open (pComPort, O_RDWR | O_NOCTTY | O_NONBLOCK);
if (-1 = fd){ fprintf (stderr, "cannot open port %s\n", pComPort);
  return (-1);}
tcgetattr (fd, &termios_old); /* save old termios value */
retval = SetPortAttr (baudrate, databit, stopbit, parity);
if (-1 = retval){ }
void CSerialPort::CloseComPort ()
{   tcsetattr (fd, TCSADRAIN, &termios_old);   close (fd); }
int CSerialPort::ReadComPort (void *data, int datalength)
{   int retval = 0;   FD_ZERO (&fs_read);
   tv_timeout.tv_sec = TIMEOUT_SEC (datalength, GetBaudrate ());
   retval = select (fd + 1, &fs_read, NULL, NULL, &tv_timeout);
   if (retval)   {     return (read (fd, data, datalength));   }
  else  return (-1); }
 
                   
4总结
Linux操作系统具有的开放性、多用户、多任务、良好的用户界面、设备独立、强大的网络功能,本文介绍了在Linux操作系统下开发设备驱动程序的步骤流程,对相关技术人员可以起到良好的借鉴意义。
参考文献
[1] 邹思秩著.嵌入式Linux设计与应用 [M].北京:清华大学出版社,2002
[2] 蒋敬,徐志伟著.操作系统一原理、技术与编程 [M].北京:机械工业出版社,2004