zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    centos 用户管理
    rsync 实验
    文件共享和传输
    PAT 1109 Group Photo
    PAT 1108 Finding Average
    PAT 1107 Social Clusters
    PAT 1106 Lowest Price in Supply Chain
    PAT 1105 Spiral Matrix
    PAT 1104 Sum of Number Segments
    PAT 1103 Integer Factorization
  • 原文地址:https://www.cnblogs.com/qiri07/p/4322091.html
Copyright © 2011-2022 走看看