RTT socket 疑问?
本帖最后由 wohuole 于 2014-4-7 22:08 编辑硬件环境:
stm32f103 +enc28j60;
软件:
lwip + rt thread ;
功能:
串口接收数据后,透传给web服务器;
做法:
application.c 中,串口线程不断检测是否有可读数据。一旦检测到,立刻做socket通信,将数据上传到服务器。上传 频率 可能是毫秒级别。
socket 采用的非阻塞方式。
问题:
1.刚开始,常常蛮正常的。
到后面,程序貌似卡死了。仿佛内存里面积攒了很多数据;即使reset ,也不能清空。
2.有的时候,甚至报串口线程 硬件错误之类的。。。
出现过一次TCP错误。这里不能贴出具体错误提示,没保存,见谅。
3.我是使用socket 实现http请求的。采用非阻塞方式,用法不知道对不对:
如下:
sock = socket(AF_INET, SOCK_STREAM, 0)) ;
ioctlsocket(sock, FIONBIO, ¶1); //开启非阻塞模式,para = 1;
lwip_setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)); //这个貌似是设置重复使用上次的socket连接,不知道对不对;
// 连接到服务器
ret = lwip_connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) ;
4.求教,非阻塞接受socket数据是怎么回事? 是在上面代码下直接跟 recv();么? 还是需要开新线程 专门接受?哪一种方法好?
求教:
求大侠指导,小弟做法有什么欠缺之处,有没有改进之处?
串口线程如下:(使用了互斥量)
static void uart_thread(void *arg)
{
char cmd;
int len1;
fd_set readset;
int ret,i,j;
struct timeval timeout;
extern struct rt_device uart1_device;
while(1)
{
len1 = rt_device_read(&uart1_device,0,rx_buf,256);
if(len1 > 0)
{
rx_buf = '\0';
rt_mutex_take(&socket_data_buf_mutex,RT_WAITING_FOREVER);
//rt_kprintf("receive data from usart is : %s\r\n",rx_buf);
for(i=0;i<len1;i++){
httpreq_id(rx_buf,j);
rt_thread_delay(5);
}
rt_mutex_release(&socket_data_buf_mutex);
memset(rx_buf, '\0', 256);
}
rt_thread_delay(10);
}
}
帮你顶起 这个,RTT支持非阻塞socket吗? 本身支持非阻塞式的,用select,可以设置超时时间。你倒是可以看看rt-thread那个开源的以太网转串口的程序,里面用的非阻塞的,而且也是串口接收到数据后转发。里面处理的方式很好,可以学习学习。 nongxiaoming 发表于 2014-4-8 01:02
本身支持非阻塞式的,用select,可以设置超时时间。你倒是可以看看rt-thread那个开源的以太网转串口的程序 ...
求教,您所说的那个例程从哪里可以下载到? wohuole 发表于 2014-4-8 21:47
求教,您所说的那个例程从哪里可以下载到?
http://www.amobbs.com/thread-4184868-1-1.html
这个很早就开源了,就在rt-thread板块置顶帖子了啊 本帖最后由 wohuole 于 2014-4-9 11:00 编辑
我现在的做法是:
串口线程接受数据后,放在消息队列中;
新开线程,进行消息队列读取。然后将消息发送sockettoserver.
目前的问题是:
貌似线程超时:
提示错误如下: (lwip_th->magic == LWIP_THREAD_MAGIC) assert failed at sys_arch_timeouts:268
请问有没有达人给点建议?
谢谢所有楼上大侠!
页:
[1]