免费注册 查看新帖 |

Chinaunix

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

[应用] 急!!linux下多串口编程的问题。还请高人相助! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-06-11 15:07 |只看该作者 |倒序浏览
[i=s] 本帖最后由 fantansy 于 2010-06-11 23:31 编辑 [/i]

程序具体思路是这样的:板子上有4个串口,1个调试串口+3个232串口。
   我的具体想法是将3个串口中的数据读出来,然后通过网口发送到服务器端。板子是作为客户端的。
  代码如下:
client端(板子上):
      #define SER_ADDR "192.168.2.32"//定义服务器IP
#define MYPORT 3492
#define BUFSIZE 512
#define BUFSIZE1 1024

#define  MAX_FD(fd1,fd2,fd3)  fd1>=fd2?(fd1>=fd3?fd1:fd3):(fd2>=fd3?fd2:fd3)

void setTermios(struct termios * pNewtio, unsigned short uBaudRate)
{
        bzero(pNewtio, sizeof(struct termios)); /* clear struct for new port settings */

        //8N1
        pNewtio->c_cflag = uBaudRate | CS8 |  CREAD | CLOCAL;
        pNewtio->c_iflag = IGNPAR;
       
        pNewtio->c_oflag = 0;
        pNewtio->c_lflag = 0; //non ICANON
        /*
        initialize all control characters
        default values can be found in /usr/include/termios.h, and
        are given in the comments, but we don't need them here
        */
        pNewtio->c_cc[VINTR]    = 0;     /* Ctrl-c */
        pNewtio->c_cc[VQUIT]    = 0;     /* Ctrl-\ */
        pNewtio->c_cc[VERASE]   = 0;     /* del */
        pNewtio->c_cc[VKILL]    = 0;     /* @ */
        pNewtio->c_cc[VEOF]     = 4;     /* Ctrl-d */
        pNewtio->c_cc[VTIME]    = 5;     /* inter-character timer, timeout VTIME*0.1 */
        pNewtio->c_cc[VMIN]     = 0;     /* blocking read until VMIN character arrives */
        pNewtio->c_cc[VSWTC]    = 0;     /* '\0' */
        pNewtio->c_cc[VSTART]   = 0;     /* Ctrl-q */
        pNewtio->c_cc[VSTOP]    = 0;     /* Ctrl-s */
        pNewtio->c_cc[VSUSP]    = 0;     /* Ctrl-z */
        pNewtio->c_cc[VEOL]     = 0;     /* '\0' */
        pNewtio->c_cc[VREPRINT] = 0;     /* Ctrl-r */
        pNewtio->c_cc[VDISCARD] = 0;     /* Ctrl-u */
        pNewtio->c_cc[VWERASE]  = 0;     /* Ctrl-w */
        pNewtio->c_cc[VLNEXT]   = 0;     /* Ctrl-v */
        pNewtio->c_cc[VEOL2]    = 0;     /* '\0' */
}
//以上为设置串口的函数。
int main(int argc ,char *argv[])
{       
        int fd1;
        int fd2;
        int fd3;
        int client_socket;
        struct sockaddr_in server_addr;
        int  nCount;
        char buf1[BUFSIZE1];
        char buf2[BUFSIZE];
        char buf3[BUFSIZE];

        struct termios oldtio,newtio;

        struct timeval tv;
                fd_set rfds,watchset;

        if(fd1=open("/dev/ttyS1",O_RDWR | O_NOCTTY)<0){
                perror("open");
                exit(-1);
                }
        if(fd2=open("/dev/ttyS2",O_RDWR | O_NOCTTY)<0){
                perror("open");
                exit(-1);
                }
        if(fd3=open("/dev/ttyS3",O_RDWR | O_NOCTTY)<0){
                perror("open");
                exit(-1);
                }                    //分别打开串口S1,S2,S3

        tcgetattr(fd1,&oldtio);
        setTermios(&newtio,B115200);//设置串口1的波特率
        tcflush(fd1, TCIFLUSH);
        tcsetattr(fd1,TCSANOW,&newtio);
       
        tcgetattr(fd2,&oldtio);
        setTermios(&newtio,B115200);
        tcflush(fd2, TCIFLUSH);
        tcsetattr(fd2,TCSANOW,&newtio);
       
        tcgetattr(fd3,&oldtio);
        setTermios(&newtio,B115200);
        tcflush(fd3, TCIFLUSH);
        tcsetattr(fd3,TCSANOW,&newtio);
               
                FD_ZERO(&rfds);       
                FD_ZERO(&watchset);       
                FD_SET(fd1,&watchset);       
                FD_SET(fd2,&watchset);
                FD_SET(fd3,&watchset);
client_socket = socket(AF_INET,SOCK_STREAM,0);//建立套接字。
        if(client_socket < 0){
                perror("socket");
                exit(-1);
                }
        printf("socket success!!:%d\n",client_socket);
        memset(&server_addr,0,sizeof(server_addr));
        server_addr.sin_family = AF_INET;
        server_addr.sin_port   = htons(MYPORT);
        server_addr.sin_addr.s_addr = inet_addr(SER_ADDR);  

if(connect(client_socket,(struct sockaddr*)&server_addr,sizeof(server_addr))<0){
                perror("connect");
                exit(-1);
                }
       


        while (1)
        {       
                tv.tv_sec=20;
                        tv.tv_usec=0;
                        rfds = watchset;
       
        if(select(MAX_FD(fd1,fd2,fd3)+1,&rfds,NULL,NULL,&tv)>0)
                        {
                                if(FD_ISSET(fd1,&rfds))
                                  {       
                                        nCount=read(fd1, buf1, 512);
                                        printf("readlength=%d\n\r",nCount);
                                        buf1[nCount]='\0';
                                        printf("%s\n\r",buf1);
                                }
                                if(FD_ISSET(fd2,&rfds))
                                  {       
                                        nCount=read(fd2, buf2, 512);
                                        printf("readlength=%d\n\r",nCount);
                                       
                                        buf2[nCount]='\0';
                                        printf("%s\n\r",buf2);
                                               
                                                                       
                                }
                                if(FD_ISSET(fd3,&rfds))
                                  {       
                                        nCount=read(fd3, buf3, 512);
                                        printf("readlength=%d\n\r",nCount);

                                        printf("%s\n\r",buf3);
                                }
                        //}
                        strcpy(buf1,buf2);
                        strcpy(buf1,buf3);
                }
       
        if(!fork())
        {
        if(write(client_socket,buf1,BUFSIZE)<0){
                perror("write");
                exit(-1);
                                }
       


        close(client_socket);
        waitpid(-1,NULL,WNOHANG);
        }
}
        tcsetattr(fd1,TCSANOW,&oldtio);
        tcsetattr(fd2,TCSANOW,&oldtio);
        tcsetattr(fd3,TCSANOW,&oldtio);
       
        return 0;
}

服务器端:server
#define MYPORT   3492
#define LOGFILE "/var/log/data_backup"
int main(int argc ,char *argv[])
{
        int listen_socket , data_socket;
        FILE *log_fp;
        char *log_file = LOGFILE;
        struct sockaddr_in server_addr;
        char buf[BUFSIZE];
        int buf_rd_len,buf_wr_len;
       
/*open log_file*/
        if((log_fp = fopen(LOGFILE,"a+")) == NULL){   //以追加方式打开文件,目的是保存接收到的数据
                perror("open ");
                exit(-1);
                }
        if((listen_socket = socket(AF_INET,SOCK_STREAM,0))<0){
                perror("socket");
                exit(-1);
                }
        memset(&server_addr,0,sizeof(server_addr));
        server_addr.sin_family = AF_INET;
        server_addr.sin_port   = htons(MYPORT);
        server_addr.sin_addr.s_addr = INADDR_ANY;
       
        if((bind(listen_socket,(struct sockaddr *)&server_addr,sizeof(server_addr)))<0){
                perror("bind");
                exit(-1);
                        }
        if(listen(listen_socket,5)<0){
                perror("listen");
                exit(-1);
                }
        while(1)
        {
        if((data_socket = accept(listen_socket,NULL,0))<0){
                perror("accept");
                exit(-1);
                }
        printf("server: got connection from %s ", inet_ntoa(server_addr.sin_addr));

        if((buf_rd_len = read(data_socket,buf,BUFSIZE))<0){
                perror("read");
                continue;
                }
        if((buf_wr_len = fputs(buf,log_fp)) == EOF){
                perror("fputs");
                continue;
                }

                close(data_socket);
        }
        return(0);
}
但是程序执行后,无反应,好像进入死循环一样。本人菜鸟,还望高人指点!

论坛徽章:
2
2015年亚洲杯之阿曼
日期:2015-03-23 18:11:212015亚冠之大阪钢巴
日期:2015-09-07 13:54:16
2 [报告]
发表于 2010-06-11 21:59 |只看该作者
printf

论坛徽章:
0
3 [报告]
发表于 2010-06-11 23:32 |只看该作者
printf
CN薰様 发表于 2010-06-11 21:59



    printf???

论坛徽章:
0
4 [报告]
发表于 2010-06-12 15:57 |只看该作者
网络连接没问题吗??
应该是connect和accept阻塞了~~

论坛徽章:
0
5 [报告]
发表于 2010-06-13 11:10 |只看该作者
网络连接没问题吗??
应该是connect和accept阻塞了~~
weihuishi110 发表于 2010-06-12 15:57


网络连接没问题。我也在想是不是某个地方阻塞了,或者send ,accept 或者select..不知道如何解决。昨天又调了一下,发现串口数据读取正常,就是发送的时候无法实现循环发送,即,我想实现的是:在主机上实时地接收三个串口读到的数据。还请高手指点。

论坛徽章:
0
6 [报告]
发表于 2010-06-13 16:11 |只看该作者
你客户端为什么要调用fork创建线程呢,而且还在while循环里面创建~
你贴的代码格式太丑了~~看的眼累!~~呵呵~~
我刚做了一个类似的东西,不管是Linux和Windows哪一个做客户端哪一个做服务端都就可以正常的连接~代码和你的也差不多~~

论坛徽章:
0
7 [报告]
发表于 2010-06-13 16:17 |只看该作者
网络连接没问题。我也在想是不是某个地方阻塞了,或者send ,accept 或者select..不知道如何解决。昨天又 ...
fantansy 发表于 2010-06-13 11:10



    有可能是你串口阻塞了,你那个select,如果串口没有可读数据就会阻塞~~

论坛徽章:
0
8 [报告]
发表于 2010-06-13 16:22 |只看该作者
感觉整个流程有点问题,你已经连接了,然后再select串口,如果串口阻塞,但是你的服务端一直在read数据,而你的客户端又没有数据~~应该会一直等待吧~~
最好是先串口有数据时再去连接服务器!这样就不会让服务器阻塞了~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP