免费注册 查看新帖 |

Chinaunix

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

为什么程序会自动退出(循环发送数据到SOCK) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-24 17:20 |只看该作者 |倒序浏览
    while (1)
    {
            nread = read(fd, buff, 20);
            nsend = write(sock,buff,nread);
            usleep(10000);
    }



读是从串口中读数据,写到SOCK中。只写一次,程序就自动退出。并不是正常的退出退出循环。请高手帮忙下。

论坛徽章:
0
2 [报告]
发表于 2009-12-24 18:08 |只看该作者

回复 #1 cjjnjust 的帖子

看不出什么问题,你把程序完整贴出来

论坛徽章:
0
3 [报告]
发表于 2009-12-24 18:48 |只看该作者
对方关闭连接,导致SIGPIPE?

论坛徽章:
0
4 [报告]
发表于 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;
}

论坛徽章:
0
5 [报告]
发表于 2009-12-25 10:25 |只看该作者

下面的问题帮我看下有没可能

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

论坛徽章:
0
6 [报告]
发表于 2009-12-25 17:39 |只看该作者
先解决你的串口读入问题吧。
每次反复的打开我觉得有点慢吧。

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

先解决这个把

论坛徽章:
0
7 [报告]
发表于 2009-12-25 17:42 |只看该作者
再一个,改成udp传输试试
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP