搜索
bottom↓
回复: 1

求教【RT-THREAD 0.3.1的网络收发问题】

[复制链接]

出0入0汤圆

发表于 2011-7-20 09:43:48 | 显示全部楼层 |阅读模式
下载了一个0.3.1的源码~然后把LWIP的例程加上了PDF里SOCKET TCP的CLIENT例子在STM32F103VE上跑~
//======================================================================================
建立连接后,创建两个线程,一个负责收,一个负责发,只发送的时候没问题,只接收的时候也没问题……
//======================================================================================
如果STM32一直不停的发,同时PC再给STM32发数据……线程就死掉了……请问大侠们这个应该从哪里开始去调?是发送和接收冲突了?对网络这块知识欠缺……有点无头绪……
//======================================================================================
附上我改写的APP部分

//======================================================================================
直接从KEIL里粘代码到帖子里……缩进全乱了……重新调整了一下,看着舒服多了……
//======================================================================================

const char host[]= "192.168.1.100";//连接的主机
const char send_data[512];//用于发送的数据

char *recv_data;//接收缓冲
int sock, bytes_received;//SOCK和接收到的数据量

static void rt_thread_entry_tx(void* parameter)
{
  while(1)
  {
    send(sock,send_data,512, 0);
    rt_thread_delay(1);
  }
}       
static void rt_thread_entry_rx(void* parameter)
{
  while(1)
  {
    bytes_received = recv(sock, recv_data, 1024, 0);
    recv_data[bytes_received] = '\0';
    rt_thread_delay(1);
  }
}

//
void tcpclient(const char* url, int port)
{
  struct hostent *host;
  struct sockaddr_in server_addr;

  /* 通过函数入口参数url获得host地址(如果是域名,会做域名解析) */
  host = gethostbyname(url);

  /* 分配用于存放接收数据的缓冲*/
  recv_data = rt_malloc(1024);
  if (recv_data == RT_NULL)
  {
    rt_kprintf("No memory\n");
    return;
  }

  /* 创建一个socket,类型是SOCKET STREAM,TCP类型*/
  if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  {
    /* 创建socket失败*/
    rt_kprintf("Socket error\n");
    /* 释放接收缓冲*/
    rt_free(recv_data);
    return;
  }

  /* 初始化预连接的服务端地址*/
  server_addr.sin_family = AF_INET;
  server_addr.sin_port = htons(port);
  server_addr.sin_addr = *((struct in_addr *)host->h_addr);
  rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero));

  /* 连接到服务端*/
  if (connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1)
  {
    /* 连接失败*/
    rt_kprintf("Connect error\n");
    return;
  }
  return;
}
void rt_init_thread_entry(void* parameter)
{
  //==============================================
  rt_thread_t tx,rx;
  //==============================================

/* LwIP Initialization */
#ifdef RT_USING_LWIP
{
  extern void lwip_sys_init(void);
  /* register ethernetif device */
  eth_system_device_init();

#ifdef STM32F10X_CL
  rt_hw_stm32_eth_init();
#else
  /* STM32F103 */
  #if STM32_ETH_IF == 0
    rt_hw_enc28j60_init();
  #elif STM32_ETH_IF == 1
    rt_hw_dm9000_init();
  #endif
#endif

  /* re-init device driver */
  rt_device_init_all();

  /* init lwip system */
  lwip_sys_init();
  rt_kprintf("TCP/IP initialized!\n");
}
#endif
       
  //==============================================
  tcpclient(host,7000);
  //==============================================
  tx = rt_thread_create("tx",
       rt_thread_entry_tx, RT_NULL,
       2048, 20, 50);
  if (tx != RT_NULL) rt_thread_startup(tx);
               
  rx = rt_thread_create("rx",
       rt_thread_entry_rx, RT_NULL,
       2048, 18, 50);       
  if (rx != RT_NULL)  rt_thread_startup(rx);
  //==============================================
  while(1)
  {
    rt_thread_delay(RT_TICK_PER_SECOND);
  }
}

出0入0汤圆

 楼主| 发表于 2011-7-20 10:42:44 | 显示全部楼层
我把两个负责收发的线程延时从1增加到10(TICK是100),收发同时没问题了~发送速度5120b/s,接收速度10240b/s
看来应该是冲突了……
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-29 04:37

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

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