查看: 1596|回复: 1

[分享] 【1768】串口驱动&HTML简单的网页服务器演示

[复制链接]
  • TA的每日心情
    开心
    2018-4-20 15:04
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    49

    主题

    188

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    2953
    最后登录
    2023-7-24
    发表于 2019-3-31 20:19:16 | 显示全部楼层 |阅读模式
    本帖最后由 donatello1996 于 2019-3-31 20:23 编辑

    【1768】串口驱动&HTML简单的网页服务器演示
        之前忙于别的事情没空发帖,今晚都补回来,不多说废话。
        得益于论坛里的大佬们都造好轮子,我可以省下很多探索工作,直接用@story_xjj大佬的TCP通信例程来做一个基于TCP通信的HTML网页服务器,应用层为HTTP。
        TCP通信部分非常简单,只需要初始化EMAC外设和UIP协议即可。UIP在例程中频繁出现,可以推断这是基于LPC1768的TCP简化协议,类似于STM32的LWIP协议,代码如下:

    1. while(!tapdev_init());
    2.         uip_init();

    3.         uip_ethaddr.addr[0] = EMAC_ADDR0;
    4.         uip_ethaddr.addr[1] = EMAC_ADDR1;
    5.         uip_ethaddr.addr[2] = EMAC_ADDR2;
    6.         uip_ethaddr.addr[3] = EMAC_ADDR3;
    7.         uip_ethaddr.addr[4] = EMAC_ADDR4;
    8.         uip_ethaddr.addr[5] = EMAC_ADDR5;
    9.         uip_setethaddr(uip_ethaddr);


    10.         uip_ipaddr(ipaddr,169,254,122,15);
    11.         uip_sethostaddr(ipaddr);

    12.         uip_ipaddr(ipaddr,169,254,122,1);
    13.         uip_setdraddr(ipaddr);

    14.         uip_ipaddr(ipaddr, 255,255,0,0);
    15.         uip_setnetmask(ipaddr);

    16.         uip_listen(HTONS(8888));
    复制代码


    需要包含以下文件:
    1.jpg
           还有一点需要注意的是,UIP协议的特性是半双工互确认通信,与完整的TCP/IP协议相比精简了全双工部分,即开发板一般是做服务器充当接收方,需要发送方上位机手动绑定端口,收发共用一个套接字(socket),严格执行先收后发的操作,即客户端上位机发送TCP报文,开发板再回应TCP报文,而不像Windows或者Linux系统那样集成了全双工、双线程收发独立TCP通信,因为全双工TCP通信是需要两个套接字来实现的并且在一个进程中需要开辟两个线程,这个对于单片机来说没有必要,何况TCP全双工场合使用得非常少,像这次的网页服务器演示Demo,仅需要半双工通信即可。在之后的TCP上位机通信中,上位机需要定期发送TCP报文以告诉开发板,开发板收到报文之后再返回规定信息,这个也是只需要半双工通信即可。            在HTTP通信中,以HTTP 1.0协议为例,客户端发送GET请求,里面包含了浏览器版本信息,语言信息,连接方式等,默认连接方式为KEEP-ALIVE即持续通信,这个方式确保了客户端在与服务器创建了TCP端口通道之后,服务器可多次POST(发送)HTML报文,报文送回客户端中,重新解析成网页,如果方式不为持续通信的话,那么客户端就只能发出一次请求,而服务器只能POST回应一次了,这个在绝大多数的网页服务器应用中都不合常理。
         我做了个网页服务器,使用的方法为GET,客户端浏览器每发送一次GET请求(刷新一次浏览器),开发板端都会做计数:
    2.jpg 3.jpg
    代码如下:
    1. unsigned char flag_post_once=0,flag_keep_alive=0;

    2. char buf_html_head[100]={"\
    3. HTTP/1.1 200 OK\nContent-Length:00047\nServer: Hatschi Server 1.0\nContent-Type: text/html\n\n\
    4. "};

    5. char buf_html[200]={"\
    6. <html>\
    7. <head>\
    8. <title>IRD1768网页服务器</title>\
    9. </head>\
    10. <body>\
    11. <p>网页服务器计数简单实验</p>\
    12. <p>论坛昵称:donatello1996</p>\
    13. <p>计数值:0000</p>\
    14. </body>\
    15. </html>"};
    16. //i=127,227

    17. static count=0;

    18. void mytcp_appcall()
    19. {
    20.         struct mytcp_state *s = &(uip_conn->appstate);
    21.         int len,i,j,len_buf_html;
    22.         char *nptr,buf_html_send[300];

    23.   if(uip_connected())
    24.         {
    25.     PSOCK_INIT(&s->p, s->inputbuffer, sizeof(s->inputbuffer));
    26.   }

    27.   if(uip_conn->lport == HTONS(8888))
    28.   {
    29.           if(uip_newdata())
    30.           {

    31.                         len=uip_datalen();
    32.                         nptr=(char*)uip_appdata;
    33.                         if(len < UIP_SEND_BUF_MAX_LEN)
    34.                         {
    35.                                 printf("8888:%d %s\n",len,nptr);
    36.                                 if(nptr[0]=='G'&&nptr[1]=='E'&&nptr[2]=='T')
    37.                                 {
    38.                                                 count++;
    39.                                                 printf("客户端浏览器发出GET请求\n");
    40.                                                 flag_post_once=1;
    41.                                 }
    42.                                 else if(nptr[0]=='P'&&nptr[1]=='O'&&nptr[2]=='S'&&nptr[3]=='T')
    43.         {

    44.         }
    45.                                 for(i=0;i<=1000;i++)
    46.                                 {
    47.                                         if(nptr[i]=='H'&&nptr[i+1]=='T'&&nptr[i+2]=='T'&&nptr[i+3]=='P'&&
    48.                                                  nptr[i+4]=='/')
    49.                                         {
    50.                                                                         printf("HTTP协议版本/类型:");
    51.                                                                         for(j=i;j<=i+7;j++)
    52.                                                                                         putchar(nptr[j]);
    53.                                                                                                         putchar('\n');
    54.                                         }

    55.                                         if(nptr[i]=='H'&&nptr[i+1]=='o'&&nptr[i+2]=='s'&&nptr[i+3]=='t')
    56.                                         {
    57.                                                                         printf("主机地址及端口号:");
    58.                                                                         for(j=i+6;j<=i+22;j++)
    59.                                                                                 putchar(nptr[j]);
    60.                                                                                 putchar('\n');
    61.                                         }
    62.                                         if(nptr[i]=='C'&&nptr[i+1]=='o'&&nptr[i+2]=='n'&&nptr[i+3]=='n'&&
    63.                                                  nptr[i+4]=='e'&&nptr[i+5]=='c'&&nptr[i+6]=='t'&&nptr[i+7]=='i'&&
    64.                                                  nptr[i+8]=='o'&&nptr[i+9]=='n')
    65.                                         {
    66.                                                 printf("连接方式:");
    67.                                                 for(j=i+12;j<=i+21;j++)
    68.                                                          putchar(nptr[j]);
    69.                                                         putchar('\n');
    70.                                                 flag_keep_alive=1;
    71.                                         }
    72.                                         if(flag_post_once&&flag_keep_alive)
    73.                                         {
    74.                                                 printf("对客户端浏览器发出的GET请求作出回应\n");
    75.                                                 flag_keep_alive=0,flag_post_once=0;
    76.                                                 len_buf_html=strlen(buf_html);
    77.                                                 buf_html_head[31]=len_buf_html/10000%10+'0';
    78.                                                 buf_html_head[32]=len_buf_html/1000%10+'0';
    79.                                                 buf_html_head[33]=len_buf_html/100%10+'0';
    80.                                                 buf_html_head[34]=len_buf_html/10%10+'0';
    81.                                                 buf_html_head[35]=len_buf_html%10+'0';
    82.                                                 
    83.                                                 buf_html_head[227]=count/1000%10+'0';
    84.                                                 buf_html_head[228]=count/100%10+'0';
    85.                                                 buf_html_head[229]=count/10%10+'0';
    86.                                                 buf_html_head[230]=count%10+'0';

    87.                                                 strcat(buf_html_send,buf_html_head);
    88.                                                 strcat(buf_html_send,buf_html);
    89.                                                 uip_send(buf_html_send,strlen(buf_html_send));
    90.                                                 strcpy(buf_html_send,"");
    91.                                                 
    92.                                         }
    93.                         }
    94.                 }
    95.           }
    96.   }
    复制代码

    硬件连接如下,电脑端使用网口连接开发板,设置与开发板同一网段的IP地址:
    IMG_20190331_200530.jpg
    4.jpg
    上传工程文件:
    LPC1768.zip (3.49 MB, 下载次数: 19)
    今天心情不错
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-4-9 17:01
  • 签到天数: 1478 天

    [LV.10]以坛为家III

    203

    主题

    2万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    92619
    最后登录
    2024-4-24
    发表于 2019-4-2 14:08:50 | 显示全部楼层
    支持一下~~
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-25 16:40 , Processed in 0.110001 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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