wohuole 发表于 2014-4-7 21:52:07

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, &para1);          //开启非阻塞模式,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);
        }
}

金牛AKI 发表于 2014-4-7 22:12:50

帮你顶起

cmheia 发表于 2014-4-8 00:04:06

这个,RTT支持非阻塞socket吗?

nongxiaoming 发表于 2014-4-8 01:02:56

本身支持非阻塞式的,用select,可以设置超时时间。你倒是可以看看rt-thread那个开源的以太网转串口的程序,里面用的非阻塞的,而且也是串口接收到数据后转发。里面处理的方式很好,可以学习学习。

wohuole 发表于 2014-4-8 21:47:59

nongxiaoming 发表于 2014-4-8 01:02
本身支持非阻塞式的,用select,可以设置超时时间。你倒是可以看看rt-thread那个开源的以太网转串口的程序 ...

求教,您所说的那个例程从哪里可以下载到?

nongxiaoming 发表于 2014-4-9 01:04:30

wohuole 发表于 2014-4-8 21:47
求教,您所说的那个例程从哪里可以下载到?

http://www.amobbs.com/thread-4184868-1-1.html
这个很早就开源了,就在rt-thread板块置顶帖子了啊

wohuole 发表于 2014-4-9 10:58:29

本帖最后由 wohuole 于 2014-4-9 11:00 编辑

我现在的做法是:

        串口线程接受数据后,放在消息队列中;
        新开线程,进行消息队列读取。然后将消息发送sockettoserver.

目前的问题是:
        貌似线程超时:
        提示错误如下:   (lwip_th->magic == LWIP_THREAD_MAGIC) assert failed at sys_arch_timeouts:268
       
        请问有没有达人给点建议?

谢谢所有楼上大侠!
页: [1]
查看完整版本: RTT socket 疑问?