STM32F407移植contiki2.6后使用LWIP库实现tcp client

最近在做智能家居,物联网项目,用到了C下的contiki移植

经过一阵调试,终于在 STM32F407移植contiki2.6后使用LWIP库实现tcp client.

一路艰辛谁人知道....唯有留下代码以资青春

#include "main.h"    
#include "contiki.h"
#include "sysautostart.h"
void led_init();
#define SYSTEMTICK_PERIOD_MS  10
#define AUTOSTART_ENABLE 1
unsigned int idle_count = 0;

__IO uint32_t LocalTime = 0; /* this variable is used to create a time reference incremented by 10ms */
uint32_t timingdelay;
float f_adc_value[ADC_CHANNLE_NUM];
unsigned char str[200];

//添加
const static uint8_t TCP_TestData[]=
{ 
 "LwIP TCP Client on sm32f407 to server connected!"  //
};
void TCP_Client_Inits();
err_t  TCP_Client_Recvs(void *arg, struct tcp_pcb *pcb,struct pbuf *p,err_t err);

PROCESS(blink_process, "Blink");
AUTOSTART_PROCESSES(&blink_process);
PROCESS_THREAD(blink_process, ev, data)
{
  
  PROCESS_BEGIN();
  while(1) 
  {
    static struct etimer et;
    etimer_set(&et, CLOCK_SECOND);
    PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));
    
    //打开LED
    GPIO_ResetBits(GPIOA,GPIO_Pin_4);
    printf("LED ON
");
    etimer_set(&et, CLOCK_SECOND);
    PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));
    
    //关闭LED
    GPIO_SetBits(GPIOA,GPIO_Pin_4);
    printf("LED OFF
");
    
  }
   PROCESS_END();
}

int main(void)
{
    struct tcp_pcb *pcb;
    unsigned int i = 0;

    ETH_BSP_Config();
    LwIP_Init();
    TCP_Client_Init(TCP_LOCAL_PORT,TCP_SERVER_PORT,TCP_SERVER_IP); //tcp客户端初始化
    ADC_Configuration();
    RS232_DMA_Init();
    USART_232_Configuration();
    
    // dbg_setup_uart();
  led_init();
  printf("Initialising
");
    clock_init();
  process_init();
  process_start(&etimer_process, NULL);
  autostart_start(autostart_processes);
  //process_start(&blink_process,NULL);
  printf("Processes running
");
    

    while (1)
    {
 
        TCP_Client_Inits();
    //SysCtlDelay(50000);
        Delay_s(0x7FFFFFF);                                            //必要的延时    0xfffff                    
    }
}


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

/*********************************************************************************************************
** Function name:           TCP_Client_Init       
** Descriptions:            TCP客户端的初始化,当需要建立客户端连接时调用
** input parameters:        无
** output parameters:       无      
** Returned value:          0     
*********************************************************************************************************/
void TCP_Client_Inits()
{
  struct tcp_pcb *Clipcb;
  struct ip_addr ipaddr;
  
  IP4_ADDR(&ipaddr,111,22,102,100);
  
  Clipcb = tcp_new();                       // 建立通信的TCP控制块(Clipcb) 
  
  tcp_bind(Clipcb,IP_ADDR_ANY,1010);       // 绑定本地IP地址和端口号 
  
  tcp_connect(Clipcb,&ipaddr,1011,TcpCli_Connected);
    tcp_recv(Clipcb,TCP_Client_Recvs);
}


/***********************************************************************
函数名称:TCP_Client_Recvs(void *arg, struct tcp_pcb *pcb,struct pbuf *p,err_t err)
功    能:tcp客户端接收数据回调函数
输入参数:
输出参数:
编写时间:2013.4.25
编 写 人:
注    意:这是一个回调函数,当TCP服务器发来数据时调用
***********************************************************************/

err_t  TCP_Client_Recvs(void *arg, struct tcp_pcb *pcb,struct pbuf *p,err_t err)
{
    
    char *c;  
    struct pbuf *q;  
    if (p != NULL)//如果有数据来了   
        {  
            tcp_recved(pcb, p->tot_len);
            for(q=p; q != NULL; q = q->next)
            {      
                c = q->payload;
                printf("received from server msg :%s
",c);
                tcp_write(pcb, c, p->len, 0);//接着就直接将收到的数据直接发送出去。
                //tcp_output(pcb);                
            }           
            pbuf_free(p);  
        }  
    err = ERR_OK;
    return err;
}
/**
  * @brief  Inserts a delay time.
  * @param  nCount: number of 10ms periods to wait for.
  * @retval None
  */
void Delay(uint32_t nCount)
{
  /* Capture the current local time */
  timingdelay = LocalTime + nCount;  

  /* wait until the desired delay finish */  
  while(timingdelay > LocalTime)
  {     
  }
}


void led_init(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;
    /* Enable the GPIO_LED Clock */
    RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOA, ENABLE);                          
            
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 ;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}


/**
  * @brief  Updates the system local time
  * @param  None
  * @retval None
  */
void Time_Update(void)
{
  LocalTime += SYSTEMTICK_PERIOD_MS;
}


#ifdef  USE_FULL_ASSERT

/**
  * @brief  Reports the name of the source file and the source line number
  *   where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t* file, uint32_t line)
{
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d
", file, line) */

  /* Infinite loop */
  while (1)
  {}
}



#endif
原文地址:https://www.cnblogs.com/qiri07/p/4322091.html