搜索
bottom↓
回复: 6

RTT socket 疑问?

[复制链接]

出0入0汤圆

发表于 2014-4-7 21:52:07 | 显示全部楼层 |阅读模式
本帖最后由 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[128];
        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[len1] = '\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);
        }
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

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

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

出0入0汤圆

发表于 2014-4-7 22:12:50 | 显示全部楼层
帮你  顶起

出0入0汤圆

发表于 2014-4-8 00:04:06 | 显示全部楼层
这个,RTT支持非阻塞socket吗?

出0入0汤圆

发表于 2014-4-8 01:02:56 | 显示全部楼层
本身支持非阻塞式的,用select,可以设置超时时间。你倒是可以看看rt-thread那个开源的以太网转串口的程序,里面用的非阻塞的,而且也是串口接收到数据后转发。里面处理的方式很好,可以学习学习。

出0入0汤圆

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

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

出0入0汤圆

发表于 2014-4-9 01:04:30 | 显示全部楼层
wohuole 发表于 2014-4-8 21:47
求教,您所说的那个例程从哪里可以下载到?

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

出0入0汤圆

 楼主| 发表于 2014-4-9 10:58:29 | 显示全部楼层
本帖最后由 wohuole 于 2014-4-9 11:00 编辑

我现在的做法是:

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

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

谢谢所有楼上大侠!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-8-25 20:30

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

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