#include
#include
#include
#include
#include
#include
#include
#include
#define COM1 1 //"/dev/ttyS0" file://串口一
#define COM2 2 //"/dev/ttyS1" file://串口二
#define TURE 0
#define FALSE -1
void OpenSerialPort(); //打开串口
void CloseSerialPort(); //关闭串口
void ReadSerialPort(); //从串口中读取数据
void WriteSerialPort(); //向串口写入数据
void SetSerialPort();
struct termios opt;
int fd;
char buffR[512];
char buffW[512];
int LenR;
int LenW;
int OpenDev(char *Dev);
void setspeed(int fd,int speed);
int setParity(int fd,int databits,int stopbits,int parity);
/*==================================================================
私有函数 初始化串口
===================================================================*/
int OpenDev(char *Dev)
{
int fd = open( Dev, O_RDWR );
if (fd == -1)
{
perror("Can't Open Serial Port"); //打开串口文件时发生错误
return -1;
}
else
{
printf("open");
return fd; //返回文件ID
}
}
/*=========================================================================
设置串口通信速率
fd 类型 int 打开串口的文件句柄
speed 类型 int 串口速度
return void
==========================================================================*/
void setspeed(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 setParity(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 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);
setspeed(fd,B9600);
if(setParity(fd,8,1,'N') == -1)
{
printf("Set Parity Error\n");
exit(-1);
}
printf("open shecff");
}
/*---------------------------------------------------------
==========================================================
公有函数 读取串口信息
===========================================================
-------------------------------------------------------*/
void 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 WriteSerialPort(char *p)
{
char *buffw;
buffw =p;
if( write(fd,buffw,512))
{
printf("write is suff");
}
}
/*---------------------------------------------------------
==========================================================
公有函数 关闭串口
===========================================================
-------------------------------------------------------*/
void CloseSerialPort()
{
close(fd);
}
int main(void)
{
char *l="fdfdfdfdfdf";
OpenSerialPort(COM1);
WriteSerialPort(l);
ReadSerialPort();
}
yangbenet2006 于 2006-12-22 14:13:06发表:
没人知道吗?给点意见撒
yangbenet2006 于 2006-12-16 17:54:12发表:
我是帮同事发的,他说好像是自动识别端口的功能样。
cxqcxq0177 于 2006-12-16 17:16:43发表:
:0D1 ,你现还是介绍一下你的成学的主要功能吧