Linux串口通信

Win8.1-PL2303-树莓派,9600波特率通信正常

参考IBM:http://www.ibm.com/developerworks/cn/linux/l-serials/

 

#include     <stdio.h>      
#include     <stdlib.h>    
#include     <unistd.h>    
#include     <sys/types.h> 
#include     <sys/stat.h>   
#include     <fcntl.h>     
#include     <termios.h>    
#include     <errno.h>      
#include      <string.h>

#define TRUE 0  
#define FALSE -1  

int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300,
        B38400, B19200, B9600, B4800, B2400, B1200, B300, };
int name_arr[] = {38400,  19200,  9600,  4800,  2400,  1200,  300,
        38400,  19200,  9600, 4800, 2400, 1200,  300, };

void set_speed(int fd, int speed){
    
    int   i;
    int   status;
    struct termios   Opt;
    
    tcgetattr(fd, &Opt);
    
    for( i= 0;  i < sizeof(speed_arr) / sizeof(int);  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 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,"Unsupported data size\n");return FALSE;
    }
    
    switch (parity){
        case 'n':
        case 'N':
            options.c_cflag &= ~PARENB;   /* Clear parity enable */
            options.c_iflag &= ~INPCK;     /* Enable parity checking */
            break;
        case 'o':
        case 'O':
            options.c_cflag |= (PARODD | PARENB);  /* 设置为奇效验*/ 
            options.c_iflag |= INPCK;             /* Disnable parity checking */
            break;
        case 'e':
        case 'E':
            options.c_cflag |= PARENB;     /* Enable parity */
            options.c_cflag &= ~PARODD;   /* 转换为偶效验*/  
            options.c_iflag |= INPCK;       /* Disnable parity checking */
            break;
        case 'S':
        case 's':  /*as no parity*/
            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;
        }
    /* Set input parity option */
    if (parity != 'n')
          options.c_iflag |= INPCK;
        options.c_cc[VTIME] = 150; // 15 seconds
        options.c_cc[VMIN] = 0;

        tcflush(fd,TCIFLUSH); /* Update the options and do it NOW */
    
    if(tcsetattr(fd,TCSANOW,&options) != 0){
          perror("SetupSerial 3");
        return FALSE;
    }
    
    return TRUE;
 }

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 main(int argc, char **argv){    
    
    int fd;
    int nread;
    char buff[512];
    char *dev = "/dev/ttyAMA0";
    
    fd = OpenPort(dev);
    
    if(fd>0){
        set_speed(fd,9600);
    }else{
        printf("Can't Open Serial Port!\n");
        exit(0);
    }
  
    if(set_Parity(fd,8,1,'N')== FALSE){
        printf("Set Parity Error\n");
        exit(1);
    }
  
    while(1){
           while((nread = read(fd,buff,512))>0){    
    
              printf("\n长度:%d\n",nread);
              buff[nread+1]='\0';
            printf("\n内容为:%s\n",buff);
            memset(buff,0,512);
        
            }
      }
    close(fd);
    exit(0);
}

 

 

posted @ 2014-06-23 20:42  hiwjy  阅读(2603)  评论(0编辑  收藏  举报