Chinaunix首页 | 论坛 | 博客
  • 博客访问: 329879
  • 博文数量: 145
  • 博客积分: 2500
  • 博客等级: 少校
  • 技术积分: 1510
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-19 11:12
文章分类

全部博文(145)

文章存档

2007年(75)

2006年(70)

我的朋友

分类: LINUX

2006-06-27 15:38:15

/*----------------------------------------
==========================================
Linux操作系统下串口编程
===========================================
--------------------------------------------*/

 

#include /*标准输入输出定义*/
#include /*标准函数库定义*/
#include /*Unix 标准函数定义*/
#include
#include
#include /*文件控制定义*/
#include /*PPSIX 终端控制定义*/
#include /*错误号定义*/

 

#define COM1 1 file://"/dev/ttyS0" 口一
#define COM2 2 file://"/dev/ttyS1" 口二

 

#define TURE 0
#define FALSE -1

 

class Ctermios
{
 public:
 Ctermios(); 造函数
 ~Ctermios(); 构函数
 void OpenSerialPort(int); 开串口
 void CloseSerialPort(); 闭串口
 void ReadSerialPort(); 串口中读取数据
 void WriteSerialPort(); 串口写入数据
 void SetSerialPort();
 
 private:
 struct termios opt;
 int fd;
 char buffR[512];
 char buffW[512];
 int LenR;
 int LenW;
 
 
 int OpenDev(char *Dev);
 void set_speed(int fd,int speed);
 int set_Parity(int fd,int databits,int stopbits,int parity);


};
/*--------------------------------------------------
构造函数
---------------------------------------------------*/
Ctermios::Ctermios()
{
 struct termios opt;
 LenR = 512;
 LenW = 512;
}

 

/*--------------------------------------------------
析构函数
----------------------------------------------------*/
Ctermios::~Ctermios()
{
 tcflush(fd,TCIOFLUSH); 数据机线并启动序列阜的设定
 if(close(fd)==0)
  exit(0);
}

 


/*==================================================================
私有函数 初始化串口
===================================================================*/


int Ctermios::OpenDev(char *Dev)
{
 int fd = open( Dev, O_RDWR );
  O_NOCTTY | O_NDELAY
 if (fd == -1)
 {
  perror("Can't Open Serial Port"); 开串口文件时发生错误
  return -1;
 }
 else
  return fd; 回文件ID
}

 


/*=========================================================================
设置串口通信速率

fd 类型 int 打开串口的文件句柄
speed 类型 int 串口速度
return void
==========================================================================*/
void Ctermios::set_speed(int fd,int speed)
{
 int i;
 int status;
 int name_arr[]={38400,19200,9600,4800,2400,1200,300, 38400,19200,9600,4800,2400,1200,300 ,};
 int speed_arr[]={B38400,B19200,B9600,B4800,B2400,B1200,B300, B38400,B19200,B9600,B4800,B2400,B1200,B300 ,};
 struct termios Opt;
 tcgetattr(fd,&Opt);
 for(i=0;i {
  if (speed==name_arr[i])
  {
   tcflush(fd,TCIOFLUSH);
   cfsetispeed(&Opt,speed_arr[i]);
   cfsetospeed(&Opt,speed_arr[i]);
   status=tcsetattr(fd,TCSANOW,&Opt);
   if (status!=0)
    perror("tcsetattr fd1");
   return;
  }
  tcflush(fd,TCIOFLUSH);
 }
}
/*=========================================================================*/

 

/*==================================================================

私有函数 设置校验位


*@brief 设置串口数据位,停止位和效验位
*@param fd 类型 int 打开的串口文件句柄
*@param databits 类型 int 数据位 取值 为 7 或者8
*@param stopbits 类型 int 停止位 取值为 1 或者2
*@param parity 类型 int 效验类型 取值为N,E,O,,S
=====================================================================*/
int Ctermios::set_Parity(int fd,int databits,int stopbits,int parity)
{
 struct termios options;
 
 if (tcgetattr(fd,&options)!=0)
 {
  perror("SetupSerial 1");
  return(FALSE);
 }
 options.c_cflag&=~CSIZE;
 
 switch(databits)
 {
  case 7:
   options.c_cflag|=CS7;
   break;
  case 8:
   options.c_cflag|=CS8;
   break;
  default:
   fprintf(stderr,"Unsuipported data size\n");
   return(FALSE);
 }
 
 switch(parity)
 {
  case'n':
  case'N':
   options.c_cflag&=~PARENB;
   options.c_iflag&=~INPCK;
   break;
  case'o':
  case'O':
   options.c_cflag|=(PARODD|PARENB);
   options.c_iflag|=INPCK;
   break;
  case'e':
  case'E':
   options.c_cflag|=PARENB;
   options.c_cflag&=~PARODD;
   options.c_iflag|=INPCK;
  break;
  case's':
  case'S':
   options.c_cflag&=~PARENB;
   options.c_cflag&=~CSTOPB;
   break;
  default:
   fprintf(stderr,"Unsupported parity\n");  
   return(FALSE);
 }
 
 switch(stopbits)
 {
  case 1:
   options.c_cflag&=~CSTOPB;
   break;
  case 2:
   options.c_cflag|=CSTOPB;
   break;
  default:
   fprintf(stderr,"Unsupported stop bits\n");  
   return(FALSE);
 }
 
 if (parity!='n')
  options.c_iflag|=INPCK;
  
 options.c_cc[VTIME]=150;
 options.c_cc[VMIN]=0;
 
 tcflush(fd,TCIFLUSH); 
 
 if(tcsetattr(fd,TCSANOW,&options)!=0)
 {
  perror("SetupSerial 3");
  return(FALSE);
 }
 
 return(TURE);
}

/*=========================================================================*/

 


/*---------------------------------------------------------
公有函数 打开串口
-------------------------------------------------------*/
void Ctermios::OpenSerialPort(int com)
{
 char *dev ;
 switch(com)
 {
  case COM1:
  dev = "/dev/ttyS0"; break;
  case COM2:
  dev = "/dev/ttyS1"; break;
  default:
  exit(-1);
 }
 fd=OpenDev(dev);
 set_speed(fd,B9600);
 
 
 if(set_Parity(fd,8,1,'N') == -1)
 {
  printf("Set Parity Error\n");
  exit(-1);
 }
}

 

/*---------------------------------------------------------
==========================================================
公有函数 设置串口属性
===========================================================
-------------------------------------------------------*/
void Ctermios::SetSerialPort()
{
 int sp;
 printf("please input baute rate\n");
 printf("default rate please input 9600");
 scanf("%d",&sp);
 set_speed(fd,sp);
 int dt,st;
 printf("please input databits stopbits \n");
 printf("default rate please input 8 1 ");
 scanf("%d %d",&dt,&st);
 if(set_Parity(fd,dt,st,'N')==FALSE)
 {
  printf("Set Parity Error\n");
  exit(0);
 }
}

 

/*---------------------------------------------------------
==========================================================
公有函数 读取串口信息
===========================================================
-------------------------------------------------------*/
void Ctermios::ReadSerialPort()
{
 int nread;
 while(nread!=0)
 {
  while((nread=read(fd,buffR,511)>0))
  {
   printf("\nLen %d\n",nread);
   buffR[nread+1]='\0';
   printf("\n%s",buffR);
  }
  if (nread==-1)
  {
   printf("read error!\n");
   exit(-1);
  }
 } 
}

 

/*---------------------------------------------------------
==========================================================
公有函数 发送串口信息
===========================================================
-------------------------------------------------------*/
void Ctermios::WriteSerialPort()
{
 int nwrite;
 char bb;
 int i;
 while(nwrite!=-1)
 {
  for(i=0;i<512;i++)
  {
   bb=getchar();
   buffW[i]=bb;
  }
  nwrite=write(fd,buffW,512);
 }
}

 

/*---------------------------------------------------------
==========================================================
公有函数 关闭串口
===========================================================
-------------------------------------------------------*/

void Ctermios::CloseSerialPort()
{
 close(fd);
}
 

阅读(845) | 评论(0) | 转发(0) |
0

上一篇:6/17

下一篇:Linux串口通信编程

给主人留下些什么吧!~~