社区导航

 

搜索
查看: 232|回复: 3

[原创] 【 XMC4800 Relax EtherCAT Kit测评】+上手DAVE,快速搭建自己的webserver

[复制链接]

279

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2019-2-7 19:06 | 显示全部楼层 |阅读模式
本帖最后由 flyword 于 2019-2-7 19:17 编辑

春节年味正浓,这里也继续自己的分享,昨天晚上试了试HTTP_SERVER APP的应用。分享给大家。
之前看到大神RSCN以及anger0925已经做出webserver了,工作的代码也有分析,参考了他们的帖子,利用HTTP_SERVER这个APP模块很快速就搭建了自己的webserver。具体的流程分享如下:
一、DAVEAPP模块添加及相关的配置操作。
这里与之前网友的web应用类似,我们通过CGI接口发送我们的指令给XMC4800,来分别控制LED1LED2;而XMC4800通过SSI接口来嵌入ADC模块的数值到网页上,显示给客户端。
因此需要添加的APP有:
1.   HTTP_SERVER
2.   ADC_MEASUREMENT
3.   DIGITAL_IO
具体如下:
image001.png
插一句,这里的网页内容都放在Resources这个文件里了。网页如何存放在rom里是通过makefsdata程序生成的,这里我们需要添加一下脚本,具体可以参考APPhelp,这里设置如下图:
image002.jpg
好了,设置后以后,我们看看其他具体的配置如下:
1.        对于HTTP_SERVER APP的设置,主要包括两个地方,一是webserver的端口及CGI\SSI使能设置,一般为80,也可以设置为8080等。另一处是LWIP的设置,可以使用默认的设置,但是必须确认PHY的型号与电路板一致。最后就是引脚pin的分配了,对着XMC4800的电路图,补充相关的引脚即可。
image003.jpg
image004.jpg
image005.jpg
image007.jpg
2.        ADC,这里采用的是轮询的方式读取数据。
image006.jpg

3.        两个LED均设置为输出口,并设置好相应的引脚。
image008.png
二、我对CGI SSI 的理解。
由于第一次使用LWIP,对于它的工作原理不是很理解,通过对比大神RSCN以及anger0925的帖子,初步了解了对CGISSI的理解。
具体的内容可以在lwiphttpd相关文件可以看到,这里截屏如下:
CGI一般通过GET的方式,以表单的形式提交数据给服务器,然后服务器查询提交表单action对应的CGI文件,进而通过pCGIs列表查询到相应的回调函数(callback函数),并执行函数,而相应的操作对应在相应的回调函数里。

image009.jpg
SSI一般是通过查询表单里的标记符,一般是以<!--#abc-->为标识,其中abc是我们想要显示的标记,一般在一个标签列表TAGS[]里定义,服务器运行时对网页中的标识进行查询,并在对应的索引里进行相应的操作,也用的是回调函数。
image010.jpg
CGISSI在使用时,都需要进行相应的注册,这样才能正常使用。注册函数分别对应的是http_set_cgi_handlershttp_set_ssi_handler
对于用户而言,我们需要做的工作有三个个步骤。
A.     首先,定义自己的句柄函数,对应CGISSI接口。
B.     其次,定义对应CGIpCGIs列表,以及对应SSI的标签列表TAGS
C.     最后,依次使能注册函数http_set_cgi_handlershttp_set_ssi_handler
我们完全不用关注底层的代码,只需要设计自己的上层应用即可。
三、只在main.c中添加代码,就能实现自己的应用。
1.先看CGI接口部分的程序,需要添加两个部分,一个部分是c程序,一个是html程序里cgi接口的定位,具体程序看后面html文件内容。
程序如下:其中,pcValue[0]对应的是提交上去的第一个参数对应的值。
  1. const char *ledctrl_handler(int iIndex, int iNumParams, char *pcParam[],char *pcValue[]){

  2.       if(strcmp(pcValue[0], "led1_on") == 0)

  3.       {

  4.           DIGITAL_IO_SetOutputHigh(&LED_1);

  5.       }

  6.       if(strcmp(pcValue[0], "led1_off") == 0)

  7.       {

  8.           DIGITAL_IO_SetOutputLow(&LED_1);

  9.       }

  10.       if(strcmp(pcValue[0], "led2_on") == 0)

  11.       {

  12.           DIGITAL_IO_SetOutputHigh(&LED_2);

  13.       }

  14.       if(strcmp(pcValue[0], "led2_off") == 0)

  15.       {

  16.           DIGITAL_IO_SetOutputLow(&LED_2);

  17.       }

  18.       if(strcmp(pcValue[0], "leds_off_all") == 0)

  19.       {

  20.           DIGITAL_IO_SetOutputLow(&LED_1);

  21.           DIGITAL_IO_SetOutputLow(&LED_2);

  22.       }

  23.       if(strcmp(pcValue[0], "leds_on_all") == 0)

  24.       {

  25.           DIGITAL_IO_SetOutputHigh(&LED_1);

  26.           DIGITAL_IO_SetOutputHigh(&LED_2);

  27.       }



  28.       return "/index.shtml"; //一定要返回到首页,不然可能就跳转到空页面了。。

  29. }



  30. tCGI pCGIs[]={            //定义的CGI对应的列表,分别对应html中多个cgi表单。

  31.         {

  32.                 .pcCGIName="/ledctrl.cgi",

  33.                 .pfnCGIHandler=ledctrl_handler

  34.         },

  35. };



  36. int web_cgi_init(void){

  37.     http_set_cgi_handlers(pCGIs, 1); //将相应的CGI列表注册到系统中个,这里因为只有1个列表,因此数字为1 。

  38.     return 0;

  39. }
复制代码


2.再看看SSI接口部分的程序,需要添加两个部分,一个部分是c程序,一个是html程序里cgi接口的定位。
  1. const char *Tags[]={   //定了了网页中的SSI标记。用于服务器将相关的数据添加进去。

  2.         "ADC",

  3.         "INT",

  4. };



  5. static uint16_t adc_read_ssihandler(int iIndex, char *pcInsert, int iInsertLen){



  6.     uint16_t ADC_value;

  7.     char value[4];

  8.     char num[5];



  9.     switch(iIndex){                  //iIndex is the index of identifier in the Tags[]

  10.                     case 0:

  11.                         ADC_value = ADC_MEASUREMENT_GetResult(&ADC_MEASUREMENT_Channel_A);

  12.                         sprintf(value,"%d",ADC_value);

  13.                         *pcInsert=value[0];

  14.                         *(pcInsert+1)=value[1];

  15.                         *(pcInsert+2)=value[2];

  16.                         *(pcInsert+3)=value[3];

  17.                         break;

  18.                     case 1:

  19.                         sprintf(num,"%d",12345);

  20.                         *pcInsert=num[0];

  21.                         *(pcInsert+1)=num[1];

  22.                         *(pcInsert+2)=num[2];

  23.                         *(pcInsert+3)=num[3];

  24.                         *(pcInsert+4)=num[4];

  25.                         break;

  26.                     default:

  27.                         break;

  28.     }

  29.     return strlen(pcInsert);//this is very important to run the ssi handler...这里非常重要,必须返回插入数据的长度,否则不能正常显示。

  30. }

  31. int web_ssi_init(void){//注册函数。

  32.     http_set_ssi_handler(adc_read_ssihandler,(char const **)Tags,2);

  33.     return 0;

  34. }
复制代码


完整的main函数如下:
  1. int main(void)

  2. {

  3.   DAVE_STATUS_t status;



  4.   status = DAVE_Init();           /* Initialization of DAVE APPs  */



  5.   if(status != DAVE_STATUS_SUCCESS)

  6.   {

  7.     /* Placeholder for error handler code. The while loop below can be replaced with an user error handler. */

  8.     XMC_DEBUG("DAVE APPs initialization failed\n");



  9.     while(1U)

  10.     {



  11.     }

  12.   }

  13.   //httpd_init();

  14.   web_cgi_init();

  15.   web_ssi_init();

  16.   /* Placeholder for user application code. The while loop below can be replaced with user application code. */

  17.   while(1U)

  18.   {

  19.       sys_check_timeouts(); //使能LWIP应用

  20.   }

  21. }
复制代码


至此,我们的web网页就搭建完成了,相关的HTML文件见附件,上传code里会被解析出来。。。论坛的编辑器啊。。。。

四、具体的应用实现效果。下载程序以后,设置好电脑的IP地址,在浏览器中访问xmc4800IP即可得到网页内容。
image011.jpg
怎么样,简单吧!感兴趣的用户可以实验一下。
我是第一次使用英飞凌的单片机,使用DAVE的APP,的确不一样的体验,不用再去翻手册,繁琐的操作那些寄存器了,直接面向应用设计自己的项目,赞!!但是缺点也有,就是APP的应用不是很灵活,要想灵活的应用的话,就必须对DAVE和APP有更深入的理解。


html文件 index.shtml (1.69 KB, 下载次数: 0)


回复

使用道具 举报

399

TA的帖子

2

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2019-2-8 10:29 | 显示全部楼层
XMC4800的网口,可以使用标准的TCP/IP协议栈吗?我的意思是不需要EtherCAT网络,而是普通网络。

点评

我这个应用就是用的标准的lwip协议栈,跑的Http_server。 CPU的引脚分配上,EtherCAT物理接口与EThernet物理接口是分开的。  详情 回复 发表于 2019-2-8 10:55


回复

使用道具 举报

279

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

 楼主| 发表于 2019-2-8 10:55 | 显示全部楼层
bigbat 发表于 2019-2-8 10:29
XMC4800的网口,可以使用标准的TCP/IP协议栈吗?我的意思是不需要EtherCAT网络,而是普通网络。

我这个应用就是用的标准的lwip协议栈,跑的Http_server。
CPU的引脚分配上,EtherCAT物理接口与EThernet物理接口是分开的。

点评

谢谢,明白了。  详情 回复 发表于 2019-2-8 11:51


回复

使用道具 举报

399

TA的帖子

2

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2019-2-8 11:51 | 显示全部楼层
flyword 发表于 2019-2-8 10:55
我这个应用就是用的标准的lwip协议栈,跑的Http_server。
CPU的引脚分配上,EtherCAT物理接口与EThernet ...

谢谢,明白了。


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-2-23 01:10 , Processed in 0.141244 second(s), 18 queries , Gzip On, MemCache On.

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