Chinaunix

标题: 为什么程序会自动退出(循环发送数据到SOCK) [打印本页]

作者: cjjnjust    时间: 2009-12-24 17:20
标题: 为什么程序会自动退出(循环发送数据到SOCK)
    while (1)
    {
            nread = read(fd, buff, 20);
            nsend = write(sock,buff,nread);
            usleep(10000);
    }



读是从串口中读数据,写到SOCK中。只写一次,程序就自动退出。并不是正常的退出退出循环。请高手帮忙下。
作者: heiniaoyuyoulin    时间: 2009-12-24 18:08
标题: 回复 #1 cjjnjust 的帖子
看不出什么问题,你把程序完整贴出来
作者: kouu    时间: 2009-12-24 18:48
对方关闭连接,导致SIGPIPE?
作者: cjjnjust    时间: 2009-12-25 10:18
void *uart_send(void *data) {
    struct termios newtio;
    printf("enter send\n\r");
    while (STOP == FALSE) {
        fd = open("/dev/ttyS0", O_RDWR); //| O_NOCTTY |O_NONBLOCK);

        if (fd < 0) {
            printf("cannot open ttyS0\n\r");
            exit(-1);
        }

        tcgetattr(fd, &oldtio); /* save current modem settings */
        newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;/*ctrol flag*/
        newtio.c_iflag = IGNPAR | ICRNL; /*input flag*/
        newtio.c_oflag &= ~OPOST; /*output flag*/
        newtio.c_lflag = 0;
        newtio.c_cc[VMIN] = 1;
        newtio.c_cc[VTIME] = 0;
        /* now clean the modem line and activate the settings for modem */
        tcflush(fd, TCIFLUSH);
        tcsetattr(fd, TCSANOW, &newtio);/*set attrib*/
        char *c = "helloworld";
        write(fd, c, 10);
        usleep(1000000);
        printf("send\n\r");
        tcsetattr(fd, TCSANOW, &oldtio);
        close(fd);
    }
    return NULL;
}

这个是宿主机发送代码。应该没什么问题。。。一直在发送,目标机关闭后,在MINICOM上一直还在输出helloworld.
下面我贴下目标机上的代码。
[code][/code]
void* uart_to_net(void* data) {
&nbsp;&nbsp;&nbsp;&nbsp;int nread;
&nbsp;&nbsp;&nbsp;&nbsp;int nsend;
&nbsp;&nbsp;&nbsp;&nbsp;int file;

&nbsp;&nbsp;&nbsp;&nbsp;char buff[512];
&nbsp;&nbsp;&nbsp;&nbsp;struct sockaddr_in remote_addr;

&nbsp;&nbsp;&nbsp;&nbsp;printf("enter uart_to_net\n\r");

&nbsp;&nbsp;&nbsp;&nbsp;if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("error:cannot obtain socket descriptor\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;bzero(&remote_addr, sizeof(remote_addr));
&nbsp;&nbsp;&nbsp;&nbsp;remote_addr.sin_family = AF_INET;
&nbsp;&nbsp;&nbsp;&nbsp;remote_addr.sin_port = htons(5000);
&nbsp;&nbsp;&nbsp;&nbsp;remote_addr.sin_addr.s_addr = inet_addr("192.168.0.55");

&nbsp;&nbsp;&nbsp;&nbsp;if (connect(sock, (struct sockaddr *) &remote_addr, sizeof(struct sockaddr_in))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;== -1) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("connect to remote addr failed\n\r");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(0);
&nbsp;&nbsp;&nbsp;&nbsp;} else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("connect to server ...\n\r");

&nbsp;&nbsp;&nbsp;&nbsp;while (STOP==FALSE)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nread = read(fd, buff, 20);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nsend = write(sock,buff,nread);
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;close(sock);
&nbsp;&nbsp;&nbsp;&nbsp;printf("end uart to net\n\r");
&nbsp;&nbsp;&nbsp;&nbsp;return NULL;
}


打开串口什么的就不贴了。太多了。
main 调用如下
int main() {
&nbsp;&nbsp;&nbsp;&nbsp;pthread_t th_kb,th_send;
&nbsp;&nbsp;&nbsp;&nbsp;void *retval;

&nbsp;&nbsp;&nbsp;&nbsp;char *dev = "/dev/ttyS0";
&nbsp;&nbsp;&nbsp;&nbsp;fd = OpenDev(dev);

&nbsp;&nbsp;&nbsp;&nbsp;usleep(200000);
&nbsp;&nbsp;&nbsp;&nbsp;tcgetattr(fd, &oldtio); /* save current modem settings */
&nbsp;&nbsp;&nbsp;&nbsp;set_speed(fd, 115200);
&nbsp;&nbsp;&nbsp;&nbsp;if (set_Parity(fd, 8, 1, 'N') == FALSE) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Set Parity Error\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(0);
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;pthread_create(&th_send,NULL,uart_to_net,0);
&nbsp;&nbsp;&nbsp;&nbsp;pthread_create(&th_kb,NULL,kb,0);
&nbsp;&nbsp;&nbsp;&nbsp;pthread_join(th_send,&retval);
&nbsp;&nbsp;&nbsp;&nbsp;pthread_join(th_kb,&retval);

&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}

作者: cjjnjust    时间: 2009-12-25 10:25
标题: 下面的问题帮我看下有没可能
我的发送函数是每次都打开串口在关闭串口。会不会一关闭,那么目标机的另一端就收到二楼说的sigpipe,结果这边就挂了。
那么我应该怎么做,屏蔽这个信号不管?还是?
我试着写发送函数的时候不用上面的方法,就是打开一个串口,然后一直循环传输,可是这样的话,目标机却什么都收不到呀。我做了如下的实验。
程序:目标机上接受宿主机发送的数据,然后写到文件中。
运行程序,然后关掉MINICOM以免占用串口。
然后再在宿主机上运行循环发送数据。
这样发送了一段时间,关闭发送程序。  再去看接受程序的结果。 一个数据都没收到。
是不是我对串口的流程理解有问题?
作者: emmoblin    时间: 2009-12-25 17:39
先解决你的串口读入问题吧。
每次反复的打开我觉得有点慢吧。

为什么一直打开会收不到数据?

先解决这个把
作者: emmoblin    时间: 2009-12-25 17:42
再一个,改成udp传输试试




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2