免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1322 | 回复: 1
打印 上一主题 下一主题

求助!串口通讯问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-04-12 13:00 |只看该作者 |倒序浏览
2台机器通过串口线连接(PC上标识是COM1,COM2口),目的是进行通讯.使用raw mode方式只能写不能读.
/* 写端 */
int
main(int argc, char **argv)
{
        int fd;
        int nwrite,nread;
        int len;
        char buff[128] = "send infomation\n";        /* send buffer */
        struct termios options;
       
        if(argc != 2){
                printf("Usage: %s serialport\n",argv[0]);
                exit(1);       
        }
        len = strlen(buff);
       
        fd = OpenDev(argv[1]);        /* open the device */
        if(fd == -1){
                exit(1);       
        }
       
        Set_speed(fd,19200);        /* set serial baud */
       
        if  ( tcgetattr( fd,&options)  !=  0) {
                perror("SetupSerial get");     
                return(FALSE);  
        }
       
       
        /* 设置软件流缓冲 */       
        options.c_iflag |= (IXON | IXOFF | IXANY);
        options.c_cflag &= ~CSIZE;
       
        /* raw mode */       
        options.c_lflag  &= ~(ICANON | ECHO | ECHOE | ISIG);  /*Input*/
        options.c_oflag  &= ~OPOST;   /*Output*/
       
        if (tcsetattr(fd,TCSANOW,&options) != 0){
                perror("SetupSerial set");   
                return (FALSE);  
        }
       
        if (Set_Parity(fd,8,1,'N') == FALSE){
                printf("Set Parity Error\n");
                exit (1);
        }
       
        while (1){   
                int tol = 0;
                puts("Ready to write!");
                if((nwrite = write(fd, buff, len)) < 0){
                        perror("write");
                        exit(1);  
                }
                printf("nwrite == %d\n",nwrite);
                printf("buff == %s\n\n",buff);

                sleep(3);
        }
       
        close(fd);  
        return 0;
}

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);  
        }
       
        /* 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;  /* one stopbit */
                        break;  
                case 2:   
                        options.c_cflag |= CSTOPB;          /* two stopbit */
                           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 for read */
        //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);  
}

论坛徽章:
0
2 [报告]
发表于 2006-04-12 13:01 |只看该作者
/* read */
int
main(int argc, char **argv)
{
        int fd,tol;
        int nwrite,nread;
        char buff1[1024];        /* receive buffer */
        struct termios options;
       
        if(argc != 2){
                printf("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  ( tcgetattr( fd,&options)  !=  0) {
                perror("SetupSerial get");     
                return(FALSE);  
        }

        /* 设置软件流缓冲 */       
        options.c_iflag |= (IXON | IXOFF | IXANY);
        options.c_cflag &= ~CSIZE;
        /* raw mode */       
        options.c_lflag  &= ~(ICANON | ECHO | ECHOE | ISIG);  /*Input*/
        options.c_oflag  &= ~OPOST;   /*Output*/
       
        if (tcsetattr(fd,TCSANOW,&options) != 0){
                perror("SetupSerial set");   
                return (FALSE);  
        }
       
        if (Set_Parity(fd,8,1,'N') == FALSE){
                printf("Set Parity Error\n");
                exit (1);
        }
       
//        while (1){   

                puts("ready to read\n");
                if((nread = read(fd, buff1, 512)) > 0){
                        tol = tol + nread;
                        buff1[nread] = '\0';
                        printf("read ok %d bytes\n",nread);
                        printf("write %d bytes\n\n",tol);       
                }
                printf("nread == %d\n",nread);
                sleep(3);
//        }
       
        close(fd);  
        return 0;
}

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;
}

[ 本帖最后由 homing 于 2006-4-12 13:15 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP