搜索
bottom↓
回复: 25

在调用netconn_write函数后就死掉了

[复制链接]

出0入0汤圆

发表于 2010-6-18 17:18:04 | 显示全部楼层 |阅读模式
可以ping通的

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2010-6-19 16:35:40 | 显示全部楼层
具体是什么情况?把代码列出来。

出0入0汤圆

 楼主| 发表于 2010-6-21 09:23:38 | 显示全部楼层
/* 这个函数处理进入的连接 */
static void process_connection(struct netconn *conn)
{
        struct netbuf *inbuf;
        char *rq;
        u16_t len;
        while(1)
        {
                /* 从这个连接读取数据到inbuf,我们假定在这个netbuf中包含完整的请求 */
                inbuf = netconn_recv(conn);
                /* 获取指向netbuf中第一个数据片断的指针,在这个数据片段里我们希望包含这个请求 */
                netbuf_data(inbuf, &rq, &len);
                /* 检查这个请求是不是HTTP "GET /\r\n" */
                if( rq[0] == 'G' &&
                rq[1] == 'E' &&
                rq[2] == 'T' &&
                rq[3] == ' ')// &&
                //rq[4] == '/' &&
                //rq[5] == '\r' &&
                //rq[6] == '\n')
                {
                        /* 发送头部数据 */
                        //netconn_write(conn, http_html_hdr, sizeof(http_html_hdr), NETCONN_NOCOPY);
                        /* 发送实际的web页面 */
                        netconn_write(conn, indexdata, sizeof(indexdata), NETCONN_NOCOPY);
                        /* 关闭连接 */
                        netconn_close(conn);
                        break;
                }
        }
}

出0入0汤圆

 楼主| 发表于 2010-6-21 09:25:20 | 显示全部楼层
收到get后就发送数据然后进进入了


void rt_hw_hard_fault_exception(struct stack_contex* contex)
{
        rt_kprintf("psr: 0x%08x\n", contex->psr);
        rt_kprintf(" pc: 0x%08x\n", contex->pc);
        rt_kprintf(" lr: 0x%08x\n", contex->lr);
        rt_kprintf("r12: 0x%08x\n", contex->r12);
        rt_kprintf("r03: 0x%08x\n", contex->r3);
        rt_kprintf("r02: 0x%08x\n", contex->r2);
        rt_kprintf("r01: 0x%08x\n", contex->r1);
        rt_kprintf("r00: 0x%08x\n", contex->r0);

        rt_kprintf("hard fault on thread: %s\n", rt_current_thread->name);
#ifdef RT_USING_FINSH
        list_thread();
#endif
        while (1);
}

出0入0汤圆

发表于 2010-6-21 09:45:24 | 显示全部楼层
你的indexdata是如何定义的?fault打印的信息是什么样的?

出0入0汤圆

 楼主| 发表于 2010-6-21 16:13:45 | 显示全部楼层
/* 这是实际的web页面数据。大部分的编译器会将这些数据放在ROM里 */
const static char indexdata[] = "<html> \
<head><title>A test page</title></head> \
<body> \
This is a small test page. \
</body> \
</html>";
const static char http_html_hdr[] = "Content-type: text/html\r\n\r\n";

出0入0汤圆

 楼主| 发表于 2010-6-21 16:14:45 | 显示全部楼层
psr: 0x21000000
pc: 0x0000069c
lr: 0x000005f5
r12: 0x00000000
r03: 0xffffffff
r02: 0x20000334
r01: 0x00000061
r00: 0x00000004
hard fault on thread: etx
thread  pri  status      sp     stack size max used   left tick  error
-------- ---- ------- ---------- ---------- ---------- ---------- ---
tcpip    0x16 suspend 0x00000230 0x00000400 0x00000270 0x00000006 000
tidle    0x1f ready   0x00000050 0x00000100 0x00000050 0x0000000a 000
tshell   0x14 suspend 0x00000230 0x00000800 0x00000230 0x00000064 000
lwip     0x16 suspend 0x000000f8 0x00000800 0x0000011c 0x00000014 000
my_task  0x14 suspend 0x00000078 0x00000400 0x00000078 0x00000008 -02
etx      0x17 ready   0x00000090 0x00000200 0x00000090 0x00000010 000
erx      0x17 suspend 0x00000090 0x00000200 0x000000d0 0x00000010 000

出0入0汤圆

 楼主| 发表于 2010-6-21 16:20:57 | 显示全部楼层
etx和erx是什么进程??

出0入0汤圆

发表于 2010-6-22 07:43:25 | 显示全部楼层
下面这个是STM32 Radio上成功的代码:
/* 使用最小限度API实现的一个简单的HTTP/1.0服务器 */
#include <lwip/api.h>
#include <finsh.h>

/*  这是实际的web页面数据。大部分的编译器会将这些数据放在ROM里 */
const static char indexdata[] = "<html> \
        <head><title>A test page</title></head> \
        <body> \
        This is a small test page. \
        </body> \
        </html>";
const static char http_html_hdr[] = "Content-type: text/html\r\n\r\n";

/*  这个函数处理进入的连接 */
static void process_connection(struct netconn *conn)
{
        struct netbuf *inbuf;
        char *rq;
        rt_uint16_t len;

        /*  从这个连接读取数据到inbuf,我们假定在这个netbuf中包含完整的请求 */
        inbuf = netconn_recv(conn);

        /*  获取指向netbuf中第一个数据片断的指针,在这个数据片段里我们希望包含这个请求 */
        netbuf_data(inbuf, (void**)&rq, &len);

        /*  检查这个请求是不是HTTP "GET /\r\n"  */
        if( rq[0] == 'G' &&
                rq[1] == 'E' &&
                rq[2] == 'T' &&
                rq[3] == ' ')
        {
                /*  发送头部数据 */
                netconn_write(conn, http_html_hdr, sizeof(http_html_hdr), NETCONN_NOCOPY);
                /*  发送实际的web页面 */
                netconn_write(conn, indexdata, sizeof(indexdata), NETCONN_NOCOPY);

                /*  关闭连接 */
                netconn_close(conn);
        }
}

/* 线程入口 */
void lw_thread(void* paramter)
{
        struct netconn *conn, *newconn;

        /*  建立一个新的TCP连接句柄 */
        conn = netconn_new(NETCONN_TCP);

        /*  将连接绑定在任意的本地IP地址的80端口上 */
        netconn_bind(conn, NULL, 80);

        /*  连接进入监听状态 */
        netconn_listen(conn);

        /*  循环处理 */
        while(1)
        {
                /*  接受新的连接请求 */
                newconn = netconn_accept(conn);

                /*  处理进入的连接 */
                process_connection(newconn);

                /*  删除连接句柄 */
                netconn_delete(newconn);
        }
}

void websrv()
{
        rt_thread_t tid;

        tid = rt_thread_create("websrv", lw_thread, RT_NULL,
                1024, 25, 5);
        if (tid != RT_NULL) rt_thread_startup(tid);
}
FINSH_FUNCTION_EXPORT(websrv, startup a simple web server);

也能够从STM32 Radio example中直接取出完整的工程。注意,这个例子只能适用于IE。因为代码给出的HTML头部太简单了,FireFox不认。

出0入0汤圆

发表于 2010-6-22 07:45:12 | 显示全部楼层
回复【7楼】wswh2o  水之影
etx和erx是什么进程??
-----------------------------------------------------------------------

ethernet 发送和接收线程。

出0入0汤圆

 楼主| 发表于 2010-6-22 09:22:31 | 显示全部楼层
恩,我这个就是从文档上的webserver上直接拷贝的,能接受,但是发送就死

出0入0汤圆

 楼主| 发表于 2010-6-22 09:23:17 | 显示全部楼层
/* 线程入口 */
void lw_thread(void* paramter)
{
        struct netconn *conn, *newconn;
        /* 建立一个新的TCP连接句柄 */
        conn = netconn_new(NETCONN_TCP);
        /* 将连接绑定在任意的本地IP地址的80端口上 */
        netconn_bind(conn, NULL, 80);
        /* 连接进入监听状态 */
        netconn_listen(conn);
        /* 循环处理 */
        while(1)
        {
                /* 接受新的连接请求 */
                newconn = netconn_accept(conn);
                /* 处理进入的连接 */
                process_connection(newconn);
                /* 删除连接句柄 */
                netconn_delete(newconn);
        }
}       





int rt_application_init()
{
        rt_thread_t init_thread;

        init_thread = rt_thread_create("init",
                                                                rt_init_thread_entry, RT_NULL,
                                                                1024, 21, 20);
        rt_thread_startup(init_thread);
       
        init_thread = rt_thread_create("my_task",
                                                my_task, RT_NULL,
                                                1024, 20, 20);
        rt_thread_startup(init_thread);
       
        init_thread = rt_thread_create("lwip",
                                                lw_thread, RT_NULL,
                                                2048, 22, 20);
        rt_thread_startup(init_thread);
        return 0;
}

出0入0汤圆

 楼主| 发表于 2010-6-22 09:24:36 | 显示全部楼层
是不是初始化有问题?

出0入0汤圆

 楼主| 发表于 2010-6-22 09:26:30 | 显示全部楼层
我看调用netconn_write后是在其中往邮箱发送个消息,然后会切换到那个线程?是etx吗?

出0入0汤圆

发表于 2010-6-22 09:31:05 | 显示全部楼层
学习

出0入0汤圆

发表于 2010-6-22 09:53:27 | 显示全部楼层
如果我上面给的那个代码依然不行,你就把lwip的log打开吧(在lwipopts.h文件中)。

出0入0汤圆

 楼主| 发表于 2010-6-22 14:12:58 | 显示全部楼层
莫名的好了

出0入0汤圆

发表于 2010-6-22 23:17:48 | 显示全部楼层
会不会是你其他的代码出现了内存越界?这类问题最好仔细查查

出0入0汤圆

 楼主| 发表于 2010-6-23 08:52:43 | 显示全部楼层
是把最后一个参数由NOCOPY改成COPY就好了

出0入0汤圆

 楼主| 发表于 2010-6-23 15:32:43 | 显示全部楼层
连着发送2包有时候会丢一包,晕啊

出0入0汤圆

发表于 2010-6-23 23:21:13 | 显示全部楼层
不应该啊,建议把lwip的log打开,打开后自己也能够更深入的分析下lwip的行为了

出0入0汤圆

 楼主| 发表于 2010-6-24 09:51:09 | 显示全部楼层
发现写成这样子,就算是nocopy也可以
netconn_write(conn, "1234567890098765432112345678900987654321", 10, NETCONN_NOCOPY);
但是写成这样子,
netconn_write(conn, http_html_hdr, strlen(http_html_hdr), NETCONN_COPY);
就不行

出0入0汤圆

发表于 2011-3-3 17:20:46 | 显示全部楼层
回复【19楼】wswh2o 水之影
-----------------------------------------------------------------------

我遇到了和你差不多的问题,我连续发送四个字符串,只有显示第一个,请问你的问题是怎么解决的

出0入0汤圆

发表于 2012-8-31 16:03:35 | 显示全部楼层
我遇到同样的问题,是不是移植问题?

出0入0汤圆

发表于 2013-4-13 23:03:40 | 显示全部楼层
同样的问题,NETCONN_NOCOPY不行,和楼主一样,改成NETCONN_COPY,数据就发出去了

请看代码


void rt_netsever_thread_entry(void* parameter)
{
        err_t err;
           u8 Login_info[] = "(011100000002BP05000011100000002080524V2232.9806N11404.9355E000.1101241323.8700000000L00000000)";

        struct netconn *conn;

        while(netif_default->ip_addr.addr == 0)
        {
                rt_thread_delay(10);
        }
        conn = netconn_new(NETCONN_TCP);
        netconn_bind(conn,(struct ip_addr *)&(netif_default->ip_addr.addr), 12345);
        err = netconn_connect(conn,IP_ADDR_SEVER,1000);

        if(ERR_OK == err)
        {
                rt_kprintf("connect sever ok\n");
        }
        else
        {
                rt_kprintf("connect sever err\n");
        }
        while(1)
        {
//                struct netbuf *buf;
//
                err = netconn_write(conn,Login_info,sizeof(Login_info),NETCONN_COPY);

                if(ERR_OK == err)
                {
                        rt_kprintf("connect send ok\n");
                }
                else
                {
                        rt_kprintf("connect send err\n");
                }
//
//                /* 接收数据直到其它主机关闭连接*/
//                while((buf = netconn_recv(conn)) != NULL)
//                {
//                        /* 对这些数据进行一些处理*/
//                //        do_something(buf);
//                }
//                /* 连接现在已经被其它终端关闭,因此也关闭我们自己的连接*/
//                netconn_close(conn);

                rt_thread_delay(1000);
        }
}

出0入0汤圆

发表于 2013-4-13 23:05:24 | 显示全部楼层
NETCONN_NOCOPY数据完全发不出去,各位老大,帮忙看看,我看了一个晚上,没找出问题,也是对代码还不够熟悉的原因。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 22:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表