OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 12825|回复: 9

stm32 lwip 做客户端程序,可是怎么都建立不了连接,都不会进TcpCli_Connected这个回调函数 麻烦大虾指点

[复制链接]

5

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2013-6-12
在线时间
0 小时
发表于 2013-6-22 19:28:22 | 显示全部楼层 |阅读模式
stm32 lwip 做客户端程序,可是怎么都建立不了连接,都不会进TcpCli_Connected这个回调函数 麻烦大虾指点,硬件应该没有问题,pc的IP:192.168.1.16,端口:23   是我哪里写掉了什么啊?

main()中的:函数
/*初始化 以太网SPI接口*/
ENC_SPI_Init();

/*初始化systick,用于定时轮询输入或给LWIP提供定时*/
SysTick_Init();
   /* 初始化LWIP协议栈*/
LwIP_Init(); 

    while ( 1 )
{
            TCP_Client_Init();
 
            Delay1(1000000UL);
            Delay1(1000000UL);
            Delay1(1000000UL);
            Delay1(1000000UL);
    }

具体的子函数:
/******* 这是一个回调函数,当TCP客户端请求的连接建立时被调用********/
err_t TcpCli_Connected(void *arg,struct tcp_pcb *pcb,err_t err)
{
   tcp_write(pcb,TCP_TestData,sizeof(TCP_TestData),0);      //发送数据
   
   tcp_close(pcb);
   
   return ERR_OK;
}

void TCP_Client_Init()
{
  struct tcp_pcb *Clipcb;
  struct ip_addr ipaddr;
  
  IP4_ADDR(&ipaddr,192,168,1,16);
  
  Clipcb = tcp_new();                       // 建立通信的TCP控制块(Clipcb) 
  
  tcp_bind(Clipcb,IP_ADDR_ANY,23);       // 绑定本地IP地址和端口号 
  
  iris_pcb=Clipcb;  //the mathod is wrong //by iris 2013.6.3
  tcp_connect(Clipcb,&ipaddr,23,TcpCli_Connected);
}


unsigned long iris_IP[5]={192, 168, 1, 18};

void LwIP_Init( void )
{
//  struct ip_addr ipaddr;
  struct ip_addr netmask;
  struct ip_addr gw;

   /*调用LWIP初始化函数,
   初始化网络接口结构体链表、内存池、pbuf结构体*/
   lwip_init();
 
#if LWIP_DHCP   //若使用DHCP协议
  ipaddr.addr = 0;
  netmask.addr = 0;
  gw.addr = 0; 
#else //
/* //by iris 2013.6.6 //
  IP4_ADDR(&ipaddr, 192, 168, 0, 18);   //设置网络接口的ip地址
  IP4_ADDR(&netmask, 255, 255, 255, 0); //子网掩码
  IP4_ADDR(&gw, 192, 168, 0, 1); //网关
*/ //by iris 2013.6.6 //
//  IP4_ADDR(&ipaddr, 192, 168, 1, 18);   //设置网络接口的ip地址
  IP4_ADDR(&ipaddr, iris_IP[0], iris_IP[1], iris_IP[2], iris_IP[3]);   //设置网络接口的ip地址
  IP4_ADDR(&netmask, 255, 255, 255, 0); //子网掩码
  IP4_ADDR(&gw, 192, 168, 1, 1); //网关


#endif
   
  /*初始化enc28j60与LWIP的接口,参数为网络接口结构体、ip地址、
  子网掩码、网关、网卡信息指针、初始化函数、输入函数*/
  netif_add(&enc28j60, &ipaddr, &netmask, &gw, NULL, &ethernetif_init, &ethernet_input);
 
  /*把enc28j60设置为默认网卡 .*/
  netif_set_default(&enc28j60);


#if LWIP_DHCP   //若使用了DHCP
  /*  Creates a new DHCP client for this interface on the first call.
  Note: you must call dhcp_fine_tmr() and dhcp_coarse_tmr() at
  the predefined regular intervals after starting the client.
  You can peek in the netif->dhcp struct for the actual DHCP status.*/
  dhcp_start(&enc28j60);   //启动DHCP
#endif

  /*  When the netif is fully configured this function must be called.*/
  netif_set_up(&enc28j60); //使能enc28j60接口
}

#define  ENC_SPI_Init   SPI1_Init
void SPI1_Init(void)
{
   SPI_InitTypeDef SPI_InitStructure;
   GPIO_InitTypeDef GPIO_InitStructure;

   /* Enable SPI1 and GPIOA clocks */
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, F_ENABLE);
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, F_ENABLE);

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //CS
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
   //GPIO_Init(GPIOB, &GPIO_InitStructure);  
   GPIO_Init(GPIOC, &GPIO_InitStructure);  //BY IRIS 2013.6.3

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
   GPIO_Init(GPIOD, &GPIO_InitStructure);

   /* Configure SPI1 pins: NSS, SCK, MISO and MOSI */
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
   GPIO_Init(GPIOA, &GPIO_InitStructure); 

  //by iris 2013.6.3
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
   GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IPU;   //上拉输入
   GPIO_Init(GPIOA, &GPIO_InitStructure);
  //by iris 2013.6.3

   /* SPI1 configuration */ 
   SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
   SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
   SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
   SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
   SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
   SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
   SPI_InitStructure.SPI_CRCPolynomial = 7;
   SPI_Init(SPI1, &SPI_InitStructure);

   /* Enable SPI1  */
   SPI_Cmd(SPI1, F_ENABLE);
}





正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-6-22 20:59:38 | 显示全部楼层
回复 支持 反对

使用道具 举报

5

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2013-6-12
在线时间
0 小时
 楼主| 发表于 2013-6-23 15:54:43 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
太感谢原子大师的支持啦 嘿嘿
回复 支持 反对

使用道具 举报

5

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2013-6-12
在线时间
0 小时
 楼主| 发表于 2013-6-23 16:22:43 | 显示全部楼层
感谢五木大师的指点,终于好了,应该把初始化放在循环外面,循环里面加上轮询。通过这个问题,我深刻的体会到写程序不能生搬硬套,以后一定深刻反省 嘿嘿
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-6-23 16:26:21 | 显示全部楼层
回复【4楼】irishehe:
---------------------------------
分享下代码吧,呵呵.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2013-6-12
在线时间
0 小时
 楼主| 发表于 2013-6-24 14:08:07 | 显示全部楼层
改成:
/*初始化 以太网SPI接口*/
ENC_SPI_Init(); 

/*初始化systick,用于定时轮询输入或给LWIP提供定时*/
SysTick_Init();
   /* 初始化LWIP协议栈*/
LwIP_Init(); 
           TCP_Client_Init();
 
    while ( 1 )
{
 
          LwIP_Periodic_Handle(LocalTime); 
    }
回复 支持 反对

使用道具 举报

5

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2013-6-12
在线时间
0 小时
 楼主| 发表于 2013-6-24 14:08:38 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
其他的都一样 嘿嘿
回复 支持 反对

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2014-6-18
在线时间
1 小时
发表于 2014-10-28 10:08:57 | 显示全部楼层
俺也在研究这个东西,回调函数应该是在lwip_periodic_handle()中调用的,所以原来的代码里没有这个函数,回调函数没有被处理。
我刚拜读完”老衲五木“的LWIP详解,这个不知道是不是和尚的大师,对LWIP确实理解很深刻,兄弟你碰到高人了,恭喜。
学习,不能间断的学习
回复 支持 反对

使用道具 举报

9

主题

1385

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
11471
金钱
11471
注册时间
2013-3-8
在线时间
1226 小时
发表于 2014-11-17 19:54:48 | 显示全部楼层
回复【4楼】irishehe:
---------------------------------
能分享你的代码吗?
回复 支持 反对

使用道具 举报

21

主题

124

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2013-1-10
在线时间
10 小时
发表于 2016-4-21 11:24:22 | 显示全部楼层
分享一下UDP的  
  struct udp_pcb *pcb;
void udp_test_init(void)
{

        struct ip_addr ipMultiCast;

  
  
    #if LWIP_IGMP
// igmp_joingroup(IP_ADDR_ANY,(struct ip_addr *)(&ipMultiCast));
  #endif
    pcb = udp_new();
  //  socket(AF_INET, SOCK_DGRAM , 0);
    udp_bind(pcb,IPADDR_ANY,2000);
   // udp_bind(pcb,IP_ADDR_BROADCAST,2000);
    udp_recv(pcb,Udp_Test_Receive,NULL);
}
个人博客www.xiaovdiy.cn
https://shop100764513.taobao.com/
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 21:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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