| 
 | 
 
 
发表于 2007-4-5 14:01:15
|
显示全部楼层
 
 
 
[quote:e99a88eebd="secpoint"]打开成功,读写有问题。有谁做过这样的东西吗?可否给我来个例子。[/quote] 
设置硬件驱动的问题吧, 
下面是串口的操作/dev/ttyS0 
 
 
 
[code:1] 
int OpenDev(char *); 
void Set_speed(int fd, int speed); 
int Set_Parity(int fd,int databits,int stopbits,int parity); 
 
int main(int argc, char **argv) 
{ 
        int fd; 
        int nread; 
        char buff[512]; 
        char *dev  = argv[1]; /* serial 2 */ 
         
        memset(buff,'a',sizeof(buff) - 1); 
        buff[sizeof(buff) - 1] = '\0'; 
         
        if (argc != 2) { 
                pritnf("Usage: %s serialport\n",argv[0]); 
                exit(1);         
        } 
         
        fd = OpenDev(argv[1]);        /* open the device */ 
        if (fd == -1) { 
                exit(1);         
        } 
         
        Set_speed(fd, 19200);        /* set serial baud */ 
         
        if (Set_Parity(fd, 8, 1, 'N') == FALSE) { 
                printf("Set Parity Error\n"); 
                exit (1); 
        } 
         
        while (1) {    
                puts("ready to read!\n"); 
                while ((nread = read(fd, buff, 512)) > 0) {  
                        printf("\nLen %d\n",nread);  
                        buff[nread+1] = '\0';    
                        printf( "\n%s", buff);    
                } 
        } 
         
        close(fd);   
        return 0; 
} 
 
/* open device */ 
int  
OpenDev(char *Dev) 
{ 
        int        fd = open( Dev, O_RDWR ); 
        //int fd = open(Dev, O_RDWR | O_NOCTTY | O_NDELAY);  
                 
        if (fd == -1) {                          
                perror("Can't Open Serial Port"); 
                return -1;                 
        }         
        else         
                return fd; 
} 
 
/** 
*@brief  设置串口通信速率 
*@param  fd     类型 int  打开串口的文件句柄 
*@param  speed  类型 int  串口速度 
*@return  void 
*/ 
 
void  
Set_speed(int fd, int speed) 
{ 
        int   i;  
        int   status;  
        struct termios   Opt; 
        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, }; 
         
        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 fd");   
                                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 get");      
                return(FALSE);   
        } 
        options.c_cflag &= ~CSIZE;  
         
        /* set databit */ 
        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);   
        } 
         
        /* set paritybit */ 
        switch (parity){    
                case 'n': 
                case 'N':                /* not parity */     
                        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);   
        }   
         
        /* set stop bit */   
        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;  
         
        tcflush(fd,TCIFLUSH); 
         
        /* set timeout 15 seconds */ 
        options.c_cc[VTIME] = 150;     
        options.c_cc[VMIN] = 0;  
         
        /* Update the options and do it NOW */ 
        if (tcsetattr(fd,TCSANOW,&options) != 0){  
                perror("SetupSerial set");    
                return (FALSE);   
        }  
         
        return (TRUE);   
} 
[/code:1] |   
 
 
 
 |