Chinaunix首页 | 论坛 | 博客
  • 博客访问: 48688
  • 博文数量: 25
  • 博客积分: 960
  • 博客等级: 准尉
  • 技术积分: 280
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-14 12:39
文章分类
文章存档

2011年(1)

2009年(20)

2008年(4)

我的朋友

分类: C/C++

2008-09-22 20:13:02

这命名为:SetSeial_Port.c

#include 
#include 
#include 
#include 
#include 
#include 
#include
#include

int openport(char *Dev)//打开串口
{
    int fd = open( Dev, O_RDWR|O_NOCTTY|O_NDELAY );
    if (-1 == fd)
    {   
        perror("Can''t Open Serial Port");
        return -1; 
    }
    else
        return fd;



int setport(int fd, int baud,int databits,int stopbits,int parity)//设置串口,波特率,数据位,停止位,校验
{
    int baudrate;
    struct   termios   newtio; 
    switch(baud)
    {
        case 300:
            baudrate=B300;
            break;
        case 600:
            baudrate=B600;
            break;
        case 1200:
            baudrate=B1200;
            break;
        case 2400:
            baudrate=B2400;
            break;
        case 4800:
            baudrate=B4800;
            break;
        case 9600:
            baudrate=B9600;
            break;
        case 19200:
            baudrate=B19200;
            break;
        case 38400:
            baudrate=B38400;
            break;
        default :
            baudrate=B9600; 
            break;
    }
    tcgetattr(fd,&newtio);
    bzero(&newtio,sizeof(newtio)); 
   //setting   c_cflag
    newtio.c_cflag   &=~CSIZE;   
    switch (databits) /*设置数据位数*/
    { 
        case 7: 
            newtio.c_cflag |= CS7; //7位数据位
            break;
        case 8:   
            newtio.c_cflag |= CS8; //8位数据位
            break; 
        default:  
            newtio.c_cflag |= CS8;
            break;   
    }
    switch (parity) //设置校验
    { 
        case 'n':
        case 'N':  
            newtio.c_cflag &= ~PARENB;   /* Clear parity enable */
            newtio.c_iflag &= ~INPCK;     /* Enable parity checking */
            break;
        case 'o': 
        case 'O':   
            newtio.c_cflag |= (PARODD | PARENB); /* 设置为奇效验*/
            newtio.c_iflag |= INPCK;             /* Disnable parity checking */
            break;
        case 'e':
        case 'E': 
            newtio.c_cflag |= PARENB;     /* Enable parity */  
            newtio.c_cflag &= ~PARODD;   /* 转换为偶效验*/   
            newtio.c_iflag |= INPCK;       /* Disnable parity checking */
            break;
        case 'S':
            case 's':  /*as no parity*/ 
                newtio.c_cflag &= ~PARENB;
                newtio.c_cflag &= ~CSTOPB;break;
        default: 
            newtio.c_cflag &= ~PARENB;   /* Clear parity enable */
            newtio.c_iflag &= ~INPCK;     /* Enable parity checking */
            break;  
    }
    switch (stopbits)//设置停止位
    { 
        case 1:  
            newtio.c_cflag &= ~CSTOPB;  //1
            break;
        case 2:  
            newtio.c_cflag |= CSTOPB;  //2
            break;
        default:
            newtio.c_cflag &= ~CSTOPB;
            break;
    }
    newtio.c_cc[VTIME] = 0;  
    newtio.c_cc[VMIN] = 0;
    newtio.c_cflag   |=   (CLOCAL|CREAD);
    newtio.c_oflag|=OPOST;
    newtio.c_iflag   &=~(IXON|IXOFF|IXANY);                   
    cfsetispeed(&newtio,baudrate); 
    cfsetospeed(&newtio,baudrate); 
    tcflush(fd,   TCIFLUSH);
    if (tcsetattr(fd,TCSANOW,&newtio) != 0) 
    {
        perror("SetupSerial 3");
        return -1;
    }
    return 0;
}
int readport(int fd,char *buf,int len,int maxwaittime)//读数据,参数为串口,BUF,长度,超时时间
{
    int no=0;
    int rc;
    int rcnum=len;
    struct timeval tv;//时间结构体
    fd_set readfd;
    tv.tv_sec=maxwaittime/1000;//秒
    tv.tv_usec=maxwaittime%1000*1000;//毫秒
    FD_ZERO(&readfd);//清除整个fd_set
    FD_SET(fd,&readfd);//设置fd_set
    rc=select(fd+1,&readfd,NULL,NULL,&tv);//等待I/O准备好
    if(rc>0)
    {
        while(len)//将数据读,放在&buf[]之中
        {
            rc=read(fd,&buf[no],1);
            if(rc>0)
                no=no+1;
            len=len-1;  
        }
        if(no!=rcnum)
            return -1;      //如果收到的长度与期望长度不一样,返回-1
        return rcnum;      //收到长度与期望长度一样,返回长度
    }
    else
    {
        return -1;
    }
    return -1;
}
int writeport(int fd,char *buf,int len)  //发送数据
{
    write(fd,buf,len);
}
void clearport(int fd)      //如果出现数据与规约不符合,可以调用这个函数来刷新串口读写数据
{
    tcflush(fd,TCIOFLUSH);
}
SetSerial_PortB() 
{
    int flag=20;
    int   fd,rc,i,ret;
    int wlen;
    unsigned char rbuf[256];
    unsigned char wbuf[256]="";
    for(i=0;i<256;i++)
        wbuf[i]=i;
    char *dev ="/dev/ttyS0";    //串口号 /dev/ttyS0  对应于串口1
    wlen=strlen(rbuf);
    fd  =  openport(dev);     //打开串口
    if(fd>0)
    {
        ret=setport(fd,4800,8,1,'n');  //设置串口,波特率,数据位,停止位,校验
        if(ret<0)
        {
            printf("Can't Set Serial Port!\n");
            exit(0);
        }
    }
    else
    {
        printf("Can't Open Serial Port!\n");
        exit(0);
    }
   
    while(flag)
    {
        rc=readport(fd,rbuf,8,500); //读取8个字节,超时时间为500毫秒
        if(rc>0)
        {
             writeport(fd,wbuf,rc);//发送数据
             Write_Data(rbuf);//写数据到磁盘之中
            printf("recv:%d\n",rc);
            for(i=0;i            printf("%02x ",rbuf[i]);//02x为十六进制无符输出
            printf("\n");
        }
        else{
            printf("recv none\n");
            flag--;
        }
    } 
    close(fd);
}

这个命名为:Write_Data.c

#include
#include
#include
#include
#include
#include
int Write_Data( char *rbuf)
{
    int fdw,len,nwrite;
    len=strlen(rbuf);
    fdw=open("data",O_CREAT | O_RDWR ,0766);
    if(fdw<0)
        perror("open error!\n");   
    else
        printf("open success\n");   
    lseek(fdw,2,SEEK_END);
    nwrite=write(fdw,rbuf,len);
    if(nwrite!=len)
        perror("write error!\n");
    else
        printf("write success!\n");   
    close(fdw);
}

这个是主要的命名为:Serial.c

#include /*标准输入输出定义*/
#include
int main()
{   
    SetSerial_PortB();//设置串口
    printf("Recver data is over!\n");
    exit(0);
}

这个为Makefile文件

CC=gcc
OBJC= SetSerial_PortB.o Serial.o Write_Data.o
Serial: $(OBJC)
    $(CC) -o Serial $(OBJC)
Serial.o: Serial.c
    $(CC) -c $<
SetSerial_PortB.o: SetSerial_PortB.c
    $(CC) -c $<
Write_Data.o: Write_Data.c
    $(CC) -c $<
clean:
    rm -f *.o Serial

这是我的第一个程序,呵呵~~~



阅读(810) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~