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
  • 相关阅读:
    【NET CORE微服务一条龙应用】第一章 网关使用与配置
    111
    test
    再来一个测试
    测试博客
    flutter 中的json解析
    关于flutter -app开发过程中的问题及解决方式总结
    使用Mybatis-plus通过自定义Sql查询只有主键为null的问题
    Centos 6中keepalived作为服务启动
    CentOS6 开放、关闭防火墙相关端口命令
  • 原文地址:https://www.cnblogs.com/qiri07/p/4322091.html
Copyright © 2011-2022 走看看