版主

发表于 3 天前    楼主|
RL-TCPnet功能测试
      这里专门创建了一个app_tcpnet_lib.c文件用于RL-TCPnet功能的测试,此文件主要实现网络主函数main_TcpNet的调用。
#include "includes.h"







/*

*********************************************************************************************************

*    函 数 名: TCPnetTest

*    功能说明: TCPent测试函数。

*    形    参: 无

*    返 回 值: 无

*********************************************************************************************************

*/

void TCPnetTest(void)

{

   

     while (1)

     {

         os_evt_wait_or(0x0001, 0xFFFF);

        

         /* RL-TCPnet主处理函数 */      

         while (main_TcpNet() == __TRUE);

     }

}
回复

点赞 举报

版主

发表于 3 天前    楼主|
HTTP_CGI.c文件中接口函数的实现
     KEIL官网有提供HTTPCGI的接口文件,名为HTTP_CGI.c。我们就是在这个文件上修改实现,主要是函数cgi_process_data和cgi_func,其它函数未使用。关于这两个函数在本章47.7小节有详细讲解,具体实现内容如下:
/*--------------------------- cgi_process_data ------------------------------*/



#include <Net_Config.h>

#include <stdio.h>

#include <string.h>

#include "bsp.h"





/* ---------------------------------------------------------------------------

* The HTTP server provides a small scripting language.

*

* The script language is simple and works as follows. Each script line starts

* with a command character, either "i", "t", "c", "#" or ".".

*   "i" - command tells the script interpreter to "include" a file from the

*         virtual file system and output it to the web browser.

*   "t" - command should be followed by a line of text that is to be output

*         to the browser.

*   "c" - command is used to call one of the C functions from the this file.

*         It may be followed by the line of text. This text is passed to

*         'cgi_func()' as a pointer to environment variable.

*   "#' - command is a comment line and is ignored (the "#" denotes a comment)

*   "." - denotes the last script line.

*

* --------------------------------------------------------------------------*/



/* at_System.c */

extern  LOCALM localm[];

#define LocM   localm[NETIF_ETH]



/* Net_Config.c */

extern struct tcp_cfg   tcp_config;

extern struct http_cfg  http_config;

#define tcp_NumSocks    tcp_config.NumSocks

#define tcp_socket      tcp_config.Scb

#define http_EnAuth     http_config.EnAuth

#define http_auth_passw http_config.Passw





/* Local variables. */

U8 LEDControl;





/* My structure of CGI status U32 variable. This variable is private for */

/* each HTTP Session and is not altered by HTTP Server. It is only set to  */

/* zero when the cgi_func() is called for the first time.                  */

typedef struct {

  U16 xcnt;

  U16 unused;

} MY_BUF;

#define MYBUF(p)        ((MY_BUF *)p)



/*----------------------------------------------------------------------------

* HTTP Server Common Gateway Interface Functions

*---------------------------------------------------------------------------*/



/*--------------------------- cgi_process_var -------------------------------*/



void cgi_process_var (U8 *qs) {

  /* This function is called by HTTP server to process the Querry_String   */

  /* for the CGI Form GET method. It is called on SUBMIT from the browser. */

  /*.The Querry_String.is SPACE terminated.                                */

  U8 *var;

  int s[4];



  var = (U8 *)alloc_mem (40);

  do {

    /* Loop through all the parameters. */

    qs = http_get_var (qs, var, 40);

    /* Check the returned string, 'qs' now points to the next. */

    if (var[0] != 0) {

      /* Returned string is non 0-length. */

      if (str_scomp (var, "ip=") == __TRUE) {

        /* My IP address parameter. */

        sscanf ((const char *)&var[3], "%d.%d.%d.%d",&s[0],&s[1],&s[2],&s[3]);

        LocM.IpAdr[0]   = s[0];

        LocM.IpAdr[1]   = s[1];

        LocM.IpAdr[2]   = s[2];

        LocM.IpAdr[3]   = s[3];

      }

      else if (str_scomp (var, "msk=") == __TRUE) {

        /* Net mask parameter. */

        sscanf ((const char *)&var[4], "%d.%d.%d.%d",&s[0],&s[1],&s[2],&s[3]);

        LocM.NetMask[0] = s[0];

        LocM.NetMask[1] = s[1];

        LocM.NetMask[2] = s[2];

        LocM.NetMask[3] = s[3];

      }

      else if (str_scomp (var, "gw=") == __TRUE) {

        /* Default gateway parameter. */

        sscanf ((const char *)&var[3], "%d.%d.%d.%d",&s[0],&s[1],&s[2],&s[3]);

        LocM.DefGW[0]   = s[0];

        LocM.DefGW[1]   = s[1];

        LocM.DefGW[2]   = s[2];

        LocM.DefGW[3]   = s[3];

      }

      else if (str_scomp (var, "pdns=") == __TRUE) {

        /* Default gateway parameter. */

        sscanf ((const char *)&var[5], "%d.%d.%d.%d",&s[0],&s[1],&s[2],&s[3]);

        LocM.PriDNS[0]  = s[0];

        LocM.PriDNS[1]  = s[1];

        LocM.PriDNS[2]  = s[2];

        LocM.PriDNS[3]  = s[3];

      }

      else if (str_scomp (var, "sdns=") == __TRUE) {

        /* Default gateway parameter. */

        sscanf ((const char *)&var[5], "%d.%d.%d.%d",&s[0],&s[1],&s[2],&s[3]);

        LocM.SecDNS[0]  = s[0];

        LocM.SecDNS[1]  = s[1];

        LocM.SecDNS[2]  = s[2];

        LocM.SecDNS[3]  = s[3];

      }

    }

  }while (qs);

  free_mem ((OS_FRAME *)var);

}





/*--------------------------- cgi_process_data ------------------------------*/



void cgi_process_data (U8 code, U8 *dat, U16 len) {

  /* This function is called by HTTP server to process the returned Data    */

  /* for the CGI Form POST method. It is called on SUBMIT from the browser. */

  /* Parameters:                                                            */

  /*   code  - callback context code                                        */

  /*           0 = www-url-encoded form data                                */

  /*           1 = filename for file upload (0-terminated string)           */

  /*           2 = file upload raw data                                     */

  /*           3 = end of file upload (file close requested)                */

  /*           4 = any xml encoded POST data (single or last stream)        */

  /*           5 = the same as 4, but with more xml data to follow          */

  /*               Use http_get_content_type() to check the content type    */

  /*   dat   - pointer to POST received data                                */

  /*   len   - received data length                                         */

  U8 *var;



  switch (code) {

    case 0:

      /* Url encoded form data received. */

      break;



    case 1:

      /* Filename for file upload received as encoded by the browser. */

      /* It might contain an absolute path to a file from the sending */

      /* host. Open a file for writing. */

      return;



    case 2:

      /* File content data received. Write data to a file. */

      /* This function will be called several times with   */

      /* code 2 when a big file is being uploaded.         */

      return;



    case 3:

      /* File upload finished. Close a file. */

      return;



    case 4:

      /* XML encoded content type, last packet. */

     // pType = http_get_content_type ();

      /* check the content type for CGX file request. */

      /* pType is a pointer to a 0-terminated string  */

      /* For example: text/xml; charset=utf-8         */

      return;

   

    case 5:

      /* XML encoded as under 4, but with more to follow. */

      return;



    default:

      /* Ignore all other codes. */

      return;

  }



  if (len == 0) {

    /* No data or all items (radio, checkbox) are off. */

    return;

  }



  var = (U8 *)alloc_mem (40);



  do {

    /* Parse all returned parameters. */

    dat = http_get_var (dat, var, 40);

    if (var[0] != 0) {

       if (str_scomp (var, "TICK1=") == __TRUE || str_scomp (var, "pg=") == __TRUE)

       {

          if (str_scomp (var, "pg=") == __TRUE)

          {

              LEDControl = 0;

          }

         

          if(*(var+9) =='1')

          {

            LEDControl |= 0x01;

          }

          else if(*(var+9) =='2')

          {

            LEDControl |= 0x02;

          }

          else if(*(var+9) =='3')

          {

            LEDControl |= 0x04;

          }

      }

    }

  }while (dat);

  free_mem ((OS_FRAME *)var);



  //LED Control

  if(LEDControl & 0x01)

  {

     bsp_LedOn(1);

  }

  else

  {

     bsp_LedOff(1);   

  }



  if(LEDControl & 0x02)

  {

     bsp_LedOn(2);

  }

  else

  {

     bsp_LedOff(2);   

  }



  if(LEDControl & 0x04)

  {

     bsp_LedOn(3);

  }

  else

  {

     bsp_LedOff(3);   

  }



}



/*--------------------------- cgi_func --------------------------------------*/



U16 cgi_func (U8 *env, U8 *buf, U16 buflen, U32 *pcgi) {

  /* This function is called by HTTP server script interpreter to make a    */

  /* formated output for 'stdout'. It returns the number of bytes written   */

  /* to the output buffer. Hi-bit of return value (len is or-ed with 0x8000)*/

  /* is a repeat flag for the system script interpreter. If this bit is set */

  /* to 1, the system will call the 'cgi_func()' again for the same script  */

  /* line with parameter 'pcgi' pointing to a 4-byte buffer. This buffer    */

  /* can be used for storing different status variables for this function.  */

  /* It is set to 0 by HTTP Server on first call and is not altered by      */

  /* HTTP server for repeated calls. This function should NEVER write more  */

  /* than 'buflen' bytes to the buffer.                                     */

  /* Parameters:                                                            */

  /*   env    - environment variable string                                 */

  /*   buf    - HTTP transmit buffer                                        */

  /*   buflen - length of this buffer (500-1400 bytes - depends on MSS)     */

  /*   pcgi   - pointer to session local buffer used for repeated loops     */

  /*            This is a U32 variable - size is 4 bytes. Value is:         */

  /*            - on 1st call = 0                                           */

  /*            - 2nd call    = as set by this function on first call       */

  U32 len = 0;

  unsigned int mask;



  switch (env[0]) {

    /* Analyze the environment string. It is the script 'c' line starting */

    /* at position 2. What you write to the script file is returned here. */

       case 'T' :

         if(env[1] =='1')                    

         {      

           mask = env[2]-'0';               

           len = sprintf((char *)buf,(const char *)&env[4],(LEDControl& mask) ? "checked" : "");

         }

         break;

      

  }

  return ((U16)len);

}



/*--------------------------- cgx_content_type ------------------------------*/

#if 0

U8 *cgx_content_type (void) {

  /* User configurable Content-type for CGX script files. If this function */

  /* is missing, or returns a NULL pointer, the default 'text/xml' content */

  /* type from the library is used for xml-script file types.              */

  return ("text/xml; charset=utf-8");

}

#endif



/*--------------------------- http_encoding ---------------------------------*/



#if 0

U8 *http_encoding (void) {

  /* User configurable character encoding for text types. If this function */

  /* is missing, or returns a NULL pointer, web browser uses a default     */

  /* character encoding, which is set in the browser configuration.        */

  return ("utf-8");

}

#endif



/*--------------------------- http_accept_host ------------------------------*/

#if 0

BOOL http_accept_host (U8 *rem_ip, U16 rem_port) {

  /* This function checks if a connection from remote host is accepted or  */

  /* not. If this function is missing, all remote hosts are accepted.      */



   if (rem_ip[0] == 192  &&

       rem_ip[1] == 168  &&

       rem_ip[2] == 1    &&

       rem_ip[3] == 1) {

      /* Accept a connection. */

      return (__TRUE);

   }

   /* Deny a connection. */

   return (__FALSE);

}

#endif



/*----------------------------------------------------------------------------

* end of file

*---------------------------------------------------------------------------*/
回复

点赞 举报

版主

发表于 3 天前    楼主|
47.8.2 STM32F429开发板实验

实验目的:
      1.     学习CGI脚本实现动态网页制作方法和RL-TCPnet的Web服务器实现。
实验内容:
      1.      强烈推荐将网线接到路由器或者交换机上面测试,因为已经使能了DHCP,可以自动获取IP地址。
      2.      用户可在浏览器中直接输入IP地址访问Web服务器,跟大家访问路由器后台一样,也可以通过NetBIOS局域网域名直接访问,即http://armfly/,这样就无需查看具体IP了。
      3.      Web服务器的用户名admin,密码123456。
      4.      例子中利用CGI脚本实现了一个Web浏览器中通过复选框控制LED亮灭的功能。
      5.      关于网页的制作和Web服务器的测试方法,务必看本例子配套的教程,有详细讲解!!!
网页制作:
      详见本章节47.5小节。
配置向导文件设置(Net_Config.c):
      详见本章节47.3小节。
调试文件设置(Net_Debug.c):
      详见本章节47.4小节。
Web服务器访问效果:
      详见本章节47.6小节。
回复

点赞 举报

版主

发表于 3 天前    楼主|
RTX配置:
     RTX配置向导详情如下:

回复

点赞 举报

版主

发表于 3 天前    楼主|
Task Configuration
(1)Number of concurrent running tasks
      允许创建6个任务,实际创建了如下5个任务:
      AppTaskUserIF任务   :按键消息处理。
      AppTaskLED任务     :LED闪烁。
      AppTaskMsgPro任务 :按键检测。
      AppTaskTCPMain任务:RL-TCPnet测试任务。
      AppTaskStart任务  :启动任务,也是最高优先级任务,这里实现RL-TCPnet的时间基准更新。
(2)Number of tasks with user-provided stack
      创建的5个任务都是采用自定义堆栈方式。
(3)Run in privileged mode
      设置任务运行在非特权级模式。
回复

点赞 举报

版主

发表于 3 天前    楼主|
RTX任务调试信息:

回复

点赞 举报

版主

发表于 前天 10:25    楼主|
程序设计:
任务栈大小分配:
      staticuint64_t AppTaskUserIFStk[1024/8];   /* 任务栈 */
      staticuint64_t AppTaskLEDStk[1024/8];      /* 任务栈 */
      staticuint64_t AppTaskMsgProStk[1024/8];  /* 任务栈 */
      staticuint64_t AppTaskTCPMainStk[4096/8]; /* 任务栈 */
       staticuint64_t AppTaskStartStk[1024/8];     /* 任务栈 */
      将任务栈定义成uint64_t类型可以保证任务栈是8字节对齐的,8字节对齐的含义就是数组的首地址对8求余等于0。如果不做8字节对齐的话,部分C语言库函数、浮点运算和uint64_t类型数据运算会出问题。
回复

点赞 举报

版主

发表于 前天 10:26    楼主|
系统栈大小分配:

回复

点赞 举报

版主

发表于 前天 10:26    楼主|
RTX初始化:
/*

*********************************************************************************************************

*    函 数 名: main

*    功能说明: 标准c程序入口。

*    形    参: 无

*    返 回 值: 无

*********************************************************************************************************

*/

int main (void)

{   

     /* 初始化外设 */

     bsp_Init();

   

     /* 创建启动任务 */

     os_sys_init_user (AppTaskStart,              /* 任务函数 */

                       5,                         /* 任务优先级 */

                       &AppTaskStartStk,          /* 任务栈 */

                       sizeof(AppTaskStartStk));  /* 任务栈大小,单位字节数 */

     while(1);

}
回复

点赞 举报

版主

发表于 前天 10:26    楼主|
硬件外设初始化
      硬件外设的初始化是在 bsp.c 文件实现:
/*

*********************************************************************************************************

*    函 数 名: bsp_Init

*    功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次

*    形    参:无

*    返 回 值: 无

*********************************************************************************************************

*/

void bsp_Init(void)

{

     /*

         由于ST固件库的启动文件已经执行了CPU系统时钟的初始化,所以不必再次重复配置系统时钟。

         启动文件配置了CPU主时钟频率、内部Flash访问速度和可选的外部SRAM FSMC初始化。



         系统时钟缺省配置为168MHz,如果需要更改,可以修改 system_stm32f4xx.c 文件

     */

     /* 优先级分组设置为4,可配置0-15级抢占式优先级,0级子优先级,即不存在子优先级。*/

     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);



     SystemCoreClockUpdate();    /* 根据PLL配置更新系统时钟频率变量 SystemCoreClock */



     bsp_InitDWT();      /* 初始化DWT */

     bsp_InitUart();     /* 初始化串口 */

     bsp_InitKey();     /* 初始化按键变量(必须在 bsp_InitTimer() 之前调用) */



     bsp_InitExtIO();    /* FMC总线上扩展了32位输出IO, 操作LED等外设必须初始化 */

     bsp_InitLed();      /* 初始LED指示灯端口 */

}
回复

点赞 举报

版主

发表于 前天 10:27    楼主|
RTX任务创建:
/*

*********************************************************************************************************

*    函 数 名: AppTaskCreate

*    功能说明: 创建应用任务

*    形    参: 无

*    返 回 值: 无

*********************************************************************************************************

*/

static void AppTaskCreate (void)

{

     HandleTaskUserIF = os_tsk_create_user(AppTaskUserIF,             /* 任务函数 */

                                           1,                         /* 任务优先级 */

                                           &AppTaskUserIFStk,         /* 任务栈 */

                                           sizeof(AppTaskUserIFStk)); /* 任务栈大小,单位字节数 */

   

     HandleTaskLED = os_tsk_create_user(AppTaskLED,              /* 任务函数 */

                                        2,                       /* 任务优先级 */

                                        &AppTaskLEDStk,          /* 任务栈 */

                                        sizeof(AppTaskLEDStk));  /* 任务栈大小,单位字节数 */

   

     HandleTaskMsgPro = os_tsk_create_user(AppTaskMsgPro,             /* 任务函数 */

                                           3,                         /* 任务优先级 */

                                           &AppTaskMsgProStk,         /* 任务栈 */

                                           sizeof(AppTaskMsgProStk)); /* 任务栈大小,单位字节数 */

   

    HandleTaskTCPMain = os_tsk_create_user(AppTaskTCPMain,             /* 任务函数 */

                                           4,                         /* 任务优先级 */

                                           &AppTaskTCPMainStk,         /* 任务栈 */

                                           sizeof(AppTaskTCPMainStk)); /* 任务栈大小,单位字节数 */

}
回复

点赞 举报

版主

发表于 前天 10:27    楼主|
五个RTX任务的实现:
/*

*********************************************************************************************************

*    函 数 名: AppTaskUserIF

*    功能说明: 按键消息处理     

*    形    参: 无

*    返 回 值: 无

*   优 先 级: 1  (数值越小优先级越低,这个跟uCOS相反)

*********************************************************************************************************

*/

__task void AppTaskUserIF(void)

{

     uint8_t ucKeyCode;



    while(1)

    {

         ucKeyCode = bsp_GetKey();

        

         if (ucKeyCode != KEY_NONE)

         {

              switch (ucKeyCode)

              {

                  /* K1键按下 */

                   case KEY_DOWN_K1:

                       printf("K1键按下\r\n");        

                       break;  

                  

                   /* K2键按下 */

                   case KEY_DOWN_K2:

                       printf("K2键按下\r\n");        

                       break;  

                  

                   /* K3键按下 */

                   case KEY_DOWN_K3:

                       printf("K3键按下\r\n");

                       break;

                                    

                   /* 其他的键值不处理 */

                   default:                    

                       break;

              }

         }

        

         os_dly_wait(20);

     }

}



/*

*********************************************************************************************************

*    函 数 名: AppTaskLED

*    功能说明: LED闪烁。

*    形    参: 无

*    返 回 值: 无

*   优 先 级: 2

*********************************************************************************************************

*/

__task void AppTaskLED(void)

{

     const uint16_t usFrequency = 500; /* 延迟周期 */

   

     /* 设置延迟周期 */

     os_itv_set(usFrequency);

   

    while(1)

    {

         bsp_LedToggle(4);



         /* os_itv_wait是绝对延迟,os_dly_wait是相对延迟。*/

         os_itv_wait();

    }

}



/*

*********************************************************************************************************

*    函 数 名: AppTaskMsgPro

*    功能说明: 按键检测

*    形    参: 无

*    返 回 值: 无

*   优 先 级: 3

*********************************************************************************************************

*/

__task void AppTaskMsgPro(void)

{

    while(1)

    {

         bsp_KeyScan();

         os_dly_wait(10);

    }

}



/*

*********************************************************************************************************

*    函 数 名: AppTaskTCPMain

*    功能说明: RL-TCPnet测试任务

*    形    参: 无

*    返 回 值: 无

*   优 先 级: 4

*********************************************************************************************************

*/

__task void AppTaskTCPMain(void)

{

     while (1)

     {

         TCPnetTest();

     }

}



/*

*********************************************************************************************************

*    函 数 名: AppTaskStart

*    功能说明: 启动任务,也是最高优先级任务,这里实现RL-TCPnet的时间基准更新。

*    形    参: 无

*    返 回 值: 无

*   优 先 级: 5

*********************************************************************************************************

*/

__task void AppTaskStart(void)

{

     /* 初始化RL-TCPnet */

     init_TcpNet ();

   

     /* 创建任务 */

     AppTaskCreate();

   

     os_itv_set (100);

   

    while(1)

    {

         os_itv_wait ();

        

         /* RL-TCPnet时间基准更新函数 */

         timer_tick ();

         os_evt_set(0x0001, HandleTaskTCPMain);

    }

}
回复

点赞 举报

版主

发表于 前天 10:27    楼主|
RL-TCPnet功能测试
      这里专门创建了一个app_tcpnet_lib.c文件用于RL-TCPnet功能的测试,此文件主要实现网络主函数main_TcpNet的调用。
#include "includes.h"







/*

*********************************************************************************************************

*    函 数 名: TCPnetTest

*    功能说明: TCPent测试函数。

*    形    参: 无

*    返 回 值: 无

*********************************************************************************************************

*/

void TCPnetTest(void)

{

   

     while (1)

     {

         os_evt_wait_or(0x0001, 0xFFFF);

        

         /* RL-TCPnet主处理函数 */      

         while (main_TcpNet() == __TRUE);

     }

}
回复

点赞 举报

版主

发表于 前天 10:28    楼主|
HTTP_CGI.c文件中接口函数的实现
      KEIL官网有提供HTTPCGI的接口文件,名为HTTP_CGI.c。我们就是在这个文件上修改实现,主要是函数cgi_process_data和cgi_func,其它函数未使用。关于这两个函数在本章47.7小节有详细讲解,具体实现内容如下:
/*--------------------------- cgi_process_data ------------------------------*/



#include <Net_Config.h>

#include <stdio.h>

#include <string.h>

#include "bsp.h"





/* ---------------------------------------------------------------------------

* The HTTP server provides a small scripting language.

*

* The script language is simple and works as follows. Each script line starts

* with a command character, either "i", "t", "c", "#" or ".".

*   "i" - command tells the script interpreter to "include" a file from the

*         virtual file system and output it to the web browser.

*   "t" - command should be followed by a line of text that is to be output

*         to the browser.

*   "c" - command is used to call one of the C functions from the this file.

*         It may be followed by the line of text. This text is passed to

*         'cgi_func()' as a pointer to environment variable.

*   "#' - command is a comment line and is ignored (the "#" denotes a comment)

*   "." - denotes the last script line.

*

* --------------------------------------------------------------------------*/



/* at_System.c */

extern  LOCALM localm[];

#define LocM   localm[NETIF_ETH]



/* Net_Config.c */

extern struct tcp_cfg   tcp_config;

extern struct http_cfg  http_config;

#define tcp_NumSocks    tcp_config.NumSocks

#define tcp_socket      tcp_config.Scb

#define http_EnAuth     http_config.EnAuth

#define http_auth_passw http_config.Passw





/* Local variables. */

U8 LEDControl;





/* My structure of CGI status U32 variable. This variable is private for */

/* each HTTP Session and is not altered by HTTP Server. It is only set to  */

/* zero when the cgi_func() is called for the first time.                  */

typedef struct {

  U16 xcnt;

  U16 unused;

} MY_BUF;

#define MYBUF(p)        ((MY_BUF *)p)



/*----------------------------------------------------------------------------

* HTTP Server Common Gateway Interface Functions

*---------------------------------------------------------------------------*/



/*--------------------------- cgi_process_var -------------------------------*/



void cgi_process_var (U8 *qs) {

  /* This function is called by HTTP server to process the Querry_String   */

  /* for the CGI Form GET method. It is called on SUBMIT from the browser. */

  /*.The Querry_String.is SPACE terminated.                                */

  U8 *var;

  int s[4];



  var = (U8 *)alloc_mem (40);

  do {

    /* Loop through all the parameters. */

    qs = http_get_var (qs, var, 40);

    /* Check the returned string, 'qs' now points to the next. */

    if (var[0] != 0) {

      /* Returned string is non 0-length. */

      if (str_scomp (var, "ip=") == __TRUE) {

        /* My IP address parameter. */

        sscanf ((const char *)&var[3], "%d.%d.%d.%d",&s[0],&s[1],&s[2],&s[3]);

        LocM.IpAdr[0]   = s[0];

        LocM.IpAdr[1]   = s[1];

        LocM.IpAdr[2]   = s[2];

        LocM.IpAdr[3]   = s[3];

      }

      else if (str_scomp (var, "msk=") == __TRUE) {

        /* Net mask parameter. */

        sscanf ((const char *)&var[4], "%d.%d.%d.%d",&s[0],&s[1],&s[2],&s[3]);

        LocM.NetMask[0] = s[0];

        LocM.NetMask[1] = s[1];

        LocM.NetMask[2] = s[2];

        LocM.NetMask[3] = s[3];

      }

      else if (str_scomp (var, "gw=") == __TRUE) {

        /* Default gateway parameter. */

        sscanf ((const char *)&var[3], "%d.%d.%d.%d",&s[0],&s[1],&s[2],&s[3]);

        LocM.DefGW[0]   = s[0];

        LocM.DefGW[1]   = s[1];

        LocM.DefGW[2]   = s[2];

        LocM.DefGW[3]   = s[3];

      }

      else if (str_scomp (var, "pdns=") == __TRUE) {

        /* Default gateway parameter. */

        sscanf ((const char *)&var[5], "%d.%d.%d.%d",&s[0],&s[1],&s[2],&s[3]);

        LocM.PriDNS[0]  = s[0];

        LocM.PriDNS[1]  = s[1];

        LocM.PriDNS[2]  = s[2];

        LocM.PriDNS[3]  = s[3];

      }

      else if (str_scomp (var, "sdns=") == __TRUE) {

        /* Default gateway parameter. */

        sscanf ((const char *)&var[5], "%d.%d.%d.%d",&s[0],&s[1],&s[2],&s[3]);

        LocM.SecDNS[0]  = s[0];

        LocM.SecDNS[1]  = s[1];

        LocM.SecDNS[2]  = s[2];

        LocM.SecDNS[3]  = s[3];

      }

    }

  }while (qs);

  free_mem ((OS_FRAME *)var);

}





/*--------------------------- cgi_process_data ------------------------------*/



void cgi_process_data (U8 code, U8 *dat, U16 len) {

  /* This function is called by HTTP server to process the returned Data    */

  /* for the CGI Form POST method. It is called on SUBMIT from the browser. */

  /* Parameters:                                                            */

  /*   code  - callback context code                                        */

  /*           0 = www-url-encoded form data                                */

  /*           1 = filename for file upload (0-terminated string)           */

  /*           2 = file upload raw data                                     */

  /*           3 = end of file upload (file close requested)                */

  /*           4 = any xml encoded POST data (single or last stream)        */

  /*           5 = the same as 4, but with more xml data to follow          */

  /*               Use http_get_content_type() to check the content type    */

  /*   dat   - pointer to POST received data                                */

  /*   len   - received data length                                         */

  U8 *var;



  switch (code) {

    case 0:

      /* Url encoded form data received. */

      break;



    case 1:

      /* Filename for file upload received as encoded by the browser. */

      /* It might contain an absolute path to a file from the sending */

      /* host. Open a file for writing. */

      return;



    case 2:

      /* File content data received. Write data to a file. */

      /* This function will be called several times with   */

      /* code 2 when a big file is being uploaded.         */

      return;



    case 3:

      /* File upload finished. Close a file. */

      return;



    case 4:

      /* XML encoded content type, last packet. */

     // pType = http_get_content_type ();

      /* check the content type for CGX file request. */

      /* pType is a pointer to a 0-terminated string  */

      /* For example: text/xml; charset=utf-8         */

      return;

   

    case 5:

      /* XML encoded as under 4, but with more to follow. */

      return;



    default:

      /* Ignore all other codes. */

      return;

  }



  if (len == 0) {

    /* No data or all items (radio, checkbox) are off. */

    return;

  }



  var = (U8 *)alloc_mem (40);



  do {

    /* Parse all returned parameters. */

    dat = http_get_var (dat, var, 40);

    if (var[0] != 0) {

       if (str_scomp (var, "TICK1=") == __TRUE || str_scomp (var, "pg=") == __TRUE)

       {

          if (str_scomp (var, "pg=") == __TRUE)

          {

              LEDControl = 0;

          }

         

          if(*(var+9) =='1')

          {

            LEDControl |= 0x01;

          }

          else if(*(var+9) =='2')

          {

            LEDControl |= 0x02;

          }

          else if(*(var+9) =='3')

          {

            LEDControl |= 0x04;

          }

      }

    }

  }while (dat);

  free_mem ((OS_FRAME *)var);



  //LED Control

  if(LEDControl & 0x01)

  {

     bsp_LedOn(1);

  }

  else

  {

     bsp_LedOff(1);   

  }



  if(LEDControl & 0x02)

  {

     bsp_LedOn(2);

  }

  else

  {

     bsp_LedOff(2);   

  }



  if(LEDControl & 0x04)

  {

     bsp_LedOn(3);

  }

  else

  {

     bsp_LedOff(3);   

  }



}



/*--------------------------- cgi_func --------------------------------------*/



U16 cgi_func (U8 *env, U8 *buf, U16 buflen, U32 *pcgi) {

  /* This function is called by HTTP server script interpreter to make a    */

  /* formated output for 'stdout'. It returns the number of bytes written   */

  /* to the output buffer. Hi-bit of return value (len is or-ed with 0x8000)*/

  /* is a repeat flag for the system script interpreter. If this bit is set */

  /* to 1, the system will call the 'cgi_func()' again for the same script  */

  /* line with parameter 'pcgi' pointing to a 4-byte buffer. This buffer    */

  /* can be used for storing different status variables for this function.  */

  /* It is set to 0 by HTTP Server on first call and is not altered by      */

  /* HTTP server for repeated calls. This function should NEVER write more  */

  /* than 'buflen' bytes to the buffer.                                     */

  /* Parameters:                                                            */

  /*   env    - environment variable string                                 */

  /*   buf    - HTTP transmit buffer                                        */

  /*   buflen - length of this buffer (500-1400 bytes - depends on MSS)     */

  /*   pcgi   - pointer to session local buffer used for repeated loops     */

  /*            This is a U32 variable - size is 4 bytes. Value is:         */

  /*            - on 1st call = 0                                           */

  /*            - 2nd call    = as set by this function on first call       */

  U32 len = 0;

  unsigned int mask;



  switch (env[0]) {

    /* Analyze the environment string. It is the script 'c' line starting */

    /* at position 2. What you write to the script file is returned here. */

       case 'T' :

         if(env[1] =='1')                    

         {      

           mask = env[2]-'0';               

           len = sprintf((char *)buf,(const char *)&env[4],(LEDControl& mask) ? "checked" : "");

         }

         break;

      

  }

  return ((U16)len);

}



/*--------------------------- cgx_content_type ------------------------------*/

#if 0

U8 *cgx_content_type (void) {

  /* User configurable Content-type for CGX script files. If this function */

  /* is missing, or returns a NULL pointer, the default 'text/xml' content */

  /* type from the library is used for xml-script file types.              */

  return ("text/xml; charset=utf-8");

}

#endif



/*--------------------------- http_encoding ---------------------------------*/



#if 0

U8 *http_encoding (void) {

  /* User configurable character encoding for text types. If this function */

  /* is missing, or returns a NULL pointer, web browser uses a default     */

  /* character encoding, which is set in the browser configuration.        */

  return ("utf-8");

}

#endif



/*--------------------------- http_accept_host ------------------------------*/

#if 0

BOOL http_accept_host (U8 *rem_ip, U16 rem_port) {

  /* This function checks if a connection from remote host is accepted or  */

  /* not. If this function is missing, all remote hosts are accepted.      */



   if (rem_ip[0] == 192  &&

       rem_ip[1] == 168  &&

       rem_ip[2] == 1    &&

       rem_ip[3] == 1) {

      /* Accept a connection. */

      return (__TRUE);

   }

   /* Deny a connection. */

   return (__FALSE);

}

#endif



/*----------------------------------------------------------------------------

* end of file

*---------------------------------------------------------------------------*/

/*--------------------------- http_accept_host ------------------------------*/

#if 0

BOOL http_accept_host (U8 *rem_ip, U16 rem_port) {

  /* This function checks if a connection from remote host is accepted or  */

  /* not. If this function is missing, all remote hosts are accepted.      */



   if (rem_ip[0] == 192  &&

       rem_ip[1] == 168  &&

       rem_ip[2] == 1    &&

       rem_ip[3] == 1) {

      /* Accept a connection. */

      return (__TRUE);

   }

   /* Deny a connection. */

   return (__FALSE);

}

#endif



/*----------------------------------------------------------------------------

* end of file

*---------------------------------------------------------------------------*/
回复

点赞 举报

版主

发表于 前天 10:28    楼主|
47.9 总结
      本章节就为大家讲解这么多,其中网页的制作比较麻烦,希望大家实际动手操作一遍,并将其熟练掌握。
回复

点赞 举报

版主

发表于 前天 10:28    楼主|
分享完成,,,,
回复

举报

高级模式
您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐 上一条 /7 下一条

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

推荐专区

技术干货集中营

专家问答

用户帮助┃咨询与建议┃版主议事

工程师杂谈

工程师创意

工程师职场

论坛电子赛事

社区活动专版

发烧友活动

-

嵌入式论坛

ARM技术论坛

Android论坛

Linux论坛

单片机/MCU论坛

FPGA|CPLD|ASIC论坛

DSP论坛

嵌入式系统论坛

-

电源技术论坛

电源技术论坛

无线充电技术

-

硬件设计论坛

PCB设计论坛

电路设计论坛

电子元器件论坛

控制|传感

总线技术|接口技术

-

测试测量论坛

LabVIEW论坛

Matlab论坛

测试测量技术专区

仪器仪表技术专区

-

EDA设计论坛

multisim论坛

PADS技术论坛

Protel|AD|DXP论坛

Allegro论坛

proteus论坛|仿真论坛

EasyEDA-中国人自已的EDA工具

Orcad论坛

-

综合技术与应用

电机控制

智能电网

光电及显示

参考设计中心

汽车电子技术论坛

医疗电子论坛

-

开源硬件

-

无线通信论坛

无线通信技术专区

天线|RF射频|微波|雷达技术

-

IC设计论坛

芯片测试与失效分析

Mixed Signal/SOC[数模混合芯片设计]

Analog/RF IC设计

设计与制造封装测试

-

厂商专区

TI论坛

TI Deyisupport社区

-

检测技术与质量

电磁兼容(EMC)设计与整改

安规知识论坛

检测与认证

-

消费电子论坛

手机技术论坛

平板电脑/mid论坛

音视/视频/机顶盒论坛

-

电子论坛综合区

聚丰众筹官方社区

新人报道区

聚丰供应链

-

论坛服务区

-

供求信息发布

供需广告

招聘┃求职发布区

电子展览展会专区