在调用netconn_write函数后就死掉了
可以ping通的 具体是什么情况?把代码列出来。 /* 这个函数处理进入的连接 */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;
}
}
} 收到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);
} 你的indexdata是如何定义的?fault打印的信息是什么样的? /* 这是实际的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"; 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 etx和erx是什么进程?? 下面这个是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不认。 回复【7楼】wswh2o水之影
etx和erx是什么进程??
-----------------------------------------------------------------------
ethernet 发送和接收线程。 恩,我这个就是从文档上的webserver上直接拷贝的,能接受,但是发送就死 /* 线程入口 */
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;
} 是不是初始化有问题? 我看调用netconn_write后是在其中往邮箱发送个消息,然后会切换到那个线程?是etx吗? 学习 如果我上面给的那个代码依然不行,你就把lwip的log打开吧(在lwipopts.h文件中)。 莫名的好了 会不会是你其他的代码出现了内存越界?这类问题最好仔细查查 是把最后一个参数由NOCOPY改成COPY就好了 连着发送2包有时候会丢一包,晕啊 不应该啊,建议把lwip的log打开,打开后自己也能够更深入的分析下lwip的行为了 发现写成这样子,就算是nocopy也可以
netconn_write(conn, "1234567890098765432112345678900987654321", 10, NETCONN_NOCOPY);
但是写成这样子,
netconn_write(conn, http_html_hdr, strlen(http_html_hdr), NETCONN_COPY);
就不行 回复【19楼】wswh2o 水之影
-----------------------------------------------------------------------
我遇到了和你差不多的问题,我连续发送四个字符串,只有显示第一个,请问你的问题是怎么解决的 我遇到同样的问题,是不是移植问题? 同样的问题,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);
}
} NETCONN_NOCOPY数据完全发不出去,各位老大,帮忙看看,我看了一个晚上,没找出问题,也是对代码还不够熟悉的原因。
页:
[1]