wswh2o 发表于 2010-6-18 17:18:04

在调用netconn_write函数后就死掉了

可以ping通的

luxinsun 发表于 2010-6-19 16:35:40

具体是什么情况?把代码列出来。

wswh2o 发表于 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 == 'G' &&
                rq == 'E' &&
                rq == 'T' &&
                rq == ' ')// &&
                //rq == '/' &&
                //rq == '\r' &&
                //rq == '\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;
                }
        }
}

wswh2o 发表于 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);
}

ffxz 发表于 2010-6-21 09:45:24

你的indexdata是如何定义的?fault打印的信息是什么样的?

wswh2o 发表于 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";

wswh2o 发表于 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
threadpristatus      sp   stack size max used   left tickerror
-------- ---- ------- ---------- ---------- ---------- ---------- ---
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_task0x14 suspend 0x00000078 0x00000400 0x00000078 0x00000008 -02
etx      0x17 ready   0x00000090 0x00000200 0x00000090 0x00000010 000
erx      0x17 suspend 0x00000090 0x00000200 0x000000d0 0x00000010 000

wswh2o 发表于 2010-6-21 16:20:57

etx和erx是什么进程??

ffxz 发表于 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 == 'G' &&
                rq == 'E' &&
                rq == 'T' &&
                rq == ' ')
        {
                /*发送头部数据 */
                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不认。

ffxz 发表于 2010-6-22 07:45:12

回复【7楼】wswh2o水之影
etx和erx是什么进程??
-----------------------------------------------------------------------

ethernet 发送和接收线程。

wswh2o 发表于 2010-6-22 09:22:31

恩,我这个就是从文档上的webserver上直接拷贝的,能接受,但是发送就死

wswh2o 发表于 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;
}

wswh2o 发表于 2010-6-22 09:24:36

是不是初始化有问题?

wswh2o 发表于 2010-6-22 09:26:30

我看调用netconn_write后是在其中往邮箱发送个消息,然后会切换到那个线程?是etx吗?

eworker 发表于 2010-6-22 09:31:05

学习

ffxz 发表于 2010-6-22 09:53:27

如果我上面给的那个代码依然不行,你就把lwip的log打开吧(在lwipopts.h文件中)。

wswh2o 发表于 2010-6-22 14:12:58

莫名的好了

ffxz 发表于 2010-6-22 23:17:48

会不会是你其他的代码出现了内存越界?这类问题最好仔细查查

wswh2o 发表于 2010-6-23 08:52:43

是把最后一个参数由NOCOPY改成COPY就好了

wswh2o 发表于 2010-6-23 15:32:43

连着发送2包有时候会丢一包,晕啊

ffxz 发表于 2010-6-23 23:21:13

不应该啊,建议把lwip的log打开,打开后自己也能够更深入的分析下lwip的行为了

wswh2o 发表于 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);
就不行

kammari 发表于 2011-3-3 17:20:46

回复【19楼】wswh2o 水之影
-----------------------------------------------------------------------

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

ranhao22 发表于 2012-8-31 16:03:35

我遇到同样的问题,是不是移植问题?

biao_l 发表于 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);
        }
}

biao_l 发表于 2013-4-13 23:05:24

NETCONN_NOCOPY数据完全发不出去,各位老大,帮忙看看,我看了一个晚上,没找出问题,也是对代码还不够熟悉的原因。
页: [1]
查看完整版本: 在调用netconn_write函数后就死掉了