这是本文档旧的修订版!
银杏科技有限公司旗下技术文档发布平台 | |||
技术支持电话 | 0379-69926675-801 | ||
技术支持邮件 | Gingko@vip.163.com | ||
技术论坛 | http://www.eeschool.org | ||
版本 | 日期 | 作者 | 修改内容 |
---|---|---|---|
V1.0 | 2020-07-09 | gingko | 初次建立 |
int main(void) { system_clock.initialize(); //系统时钟初始化 led.initialize(); //LED初始化 adc.initialize(); //ADC初始化 delay.initialize(216); //延时初始化 my_malloc.initialize(SRAMIN); //动态内存初始化 usart6.initialize(115200); //串口波特设置 usart6.printf("\033[1;32;40m"); //设置字体终端为绿色 usart6.printf("\r\nHello, I am iCore4!\r\n\r\n"); //串口信息输出 OSInit(); //UCOS初始化 while(lwip.initialize()) //lwip初始化 { LED_RED_ON; usart6.printf("\r\nETH initialize error!\r\n\r\n");//ETH初始化失败 } web.initialize(); //modbus_tcp初始化 OSTaskCreate(start_task,(void*)0,(OS_STK*)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO); OSStart(); //开启UCOS }
//内存管理初始化 void my_mem_init(u8 memx) { mymemset(mallco_dev.memmap[memx],0,memtblsize[memx]*4); //内存状态表数据清零 mallco_dev.memrdy[memx]=1; //内存管理初始化OK }
//LWIP初始化(LWIP启动的时候使用) //返回值:0,成功 // 1,内存错误 // 2,LAN8720初始化失败 // 3,网卡添加失败. u8 lwip_comm_init(void) { OS_CPU_SR cpu_sr; struct netif *Netif_Init_Flag; //调用netif_add()函数时的返回值,用于判断网络初始化是否成功 struct ip_addr ipaddr; //ip地址 struct ip_addr netmask; //子网掩码 struct ip_addr gw; //默认网关 if(lan8720.memory_malloc())return 1; //内存申请失败 if(lwip_comm_mem_malloc())return 1; //内存申请失败 if(lan8720.initialize())return 2; //初始化LAN8720失败 tcpip_init(NULL,NULL); //初始化tcp ip内核,该函数里面会创建tcpip_thread内核任务 lwip_comm_default_ip_set(&lwipdev); //设置默认IP等信息 #if LWIP_DHCP //使用动态IP ipaddr.addr = 0; netmask.addr = 0; gw.addr = 0; #else //使用静态IP IP4_ADDR(&ipaddr,lwipdev.ip[0],lwipdev.ip[1],lwipdev.ip[2],lwipdev.ip[3]); IP4_ADDR(&netmask,lwipdev.netmask[0],lwipdev.netmask[1] ,lwipdev.netmask[2],lwipdev.netmask[3]); IP4_ADDR(&gw,lwipdev.gateway[0],lwipdev.gateway[1],lwipdev.gateway[2],lwipdev.gateway[3]); usart6.printf("网卡en的MAC地址为:................%d.%d.%d.%d.%d.%d\r\n",lwipdev.mac[0],lwipdev.mac[1],lwipdev.mac[2],lwipdev.mac[3],lwipdev.mac[4],lwipdev.mac[5]); usart6.printf("静态IP地址........................%d.%d.%d.%d\r\n",lwipdev.ip[0],lwipdev.ip[1],lwipdev.ip[2],lwipdev.ip[3]); usart6.printf("子网掩码..........................%d.%d.%d.%d\r\n",lwipdev.netmask[0],lwipdev.netmask[1],lwipdev.netmask[2],lwipdev.netmask[3]); usart6.printf("默认网关..........................%d.%d.%d.%d\r\n",lwipdev.gateway[0],lwipdev.gateway[1],lwipdev.gateway[2],lwipdev.gateway[3]); #endif Netif_Init_Flag=netif_add(&lwip_netif,&ipaddr,&netmask,&gw,NULL,ðernetif_init,&tcpip_input);//向网卡列表中添加一个网口 #if LWIP_DNS dns_init(); #endif if(Netif_Init_Flag==NULL)return 3; //网卡添加失败 else//网口添加成功后,设置netif为默认值,并且打开netif网口 { netif_set_default(&lwip_netif); //设置netif为默认网口 netif_set_up(&lwip_netif); //打开netif网口 } return 0;//操作OK. }
static INT8U http_server_netconn_init(void)//动态刷新页面显示任务 { INT8U res; OS_CPU_SR cpu_sr; OS_ENTER_CRITICAL(); //关中断 res = OSTaskCreate(http_server_netconn_thread,(void*)0,(OS_STK*)&WEB_TASK_STK[WEB_STK_SIZE-1],WEB_PRIO); //创建TCP服务器线程 OS_EXIT_CRITICAL(); //开中断 return res; }
static void http_server_netconn_thread(void *arg) { int httpsock, httpconn, size; struct sockaddr_in address, remotehost; //创建TCP socket if ((httpsock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { usart6.printf("can not create socket\r\n"); OSTimeDlyHMSM(0, 0, 1, 0); return; } //设置端口号80 address.sin_family = AF_INET; address.sin_port = htons(80); address.sin_addr.s_addr = INADDR_ANY; if (bind(httpsock, (struct sockaddr *)&address, sizeof (address)) < 0) { usart6.printf("can not bind socket"); closesocket(httpsock); close(httpsock); OSTimeDlyHMSM(0, 0, 2, 0); return; } listen(httpsock, 5); //在socket上进行监听 size = sizeof(remotehost); while(1) { httpconn = accept(httpsock, (struct sockaddr *)&remotehost, (socklen_t *)&size); if(httpconn >= 0){ http_server_serve(httpconn); //处理连接 }else{ close(httpconn); close(httpsock); } } }
static void http_server_serve(int httpcon) { int ret; unsigned char recv_buffer[1500]; unsigned long int file_len = 0; unsigned short int send_len = 0; char* name; //获取方法请求文件名 ret = read(httpcon, recv_buffer, 1500); //提取http数据请求 st_http_request *http_request; memset(tx_buf,0x00,MAX_URI_SIZE); http_request = (st_http_request*)tx_buf; parse_http_request(http_request, recv_buffer);//分析请求后,转换为http_request //方法分析 switch (http_request->METHOD) { case METHOD_ERR : memcpy(recv_buffer, ERROR_REQUEST_PAGE, sizeof(ERROR_REQUEST_PAGE)); write(httpcon, (unsigned char *)recv_buffer, strlen((char const*)recv_buffer)); break; case METHOD_HEAD: case METHOD_GET: //从uri获取文件名 name = http_request->URI; if(strcmp(name,"/index.htm")==0 || strcmp(name,"/")==0|| (strncmp(name,"/index.html",11)==0)) { file_len = strlen(ALLOCATION_HTML); make_http_response_head((unsigned char*)recv_buffer, PTYPE_HTML,file_len); write(httpcon, (unsigned char *)recv_buffer, strlen((char const*)recv_buffer)); send_len=0; while(file_len) { if(file_len>1024) { write(httpcon, (const unsigned char*)ALLOCATION_HTML+send_len, 1024); send_len+=1024; file_len-=1024; } else { write(httpcon, (const unsigned char*)ALLOCATION_HTML+send_len, file_len); send_len+=file_len; file_len-=file_len; } } }else if(strcmp(name,"/demo_get.asp") == 0){ make_measure_response(tx_buf); sprintf((char *)recv_buffer,"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length:%d\r\n\r\n%s",strlen(tx_buf),tx_buf); write(httpcon, (unsigned char *)recv_buffer, strlen((char *)recv_buffer)); } break; /* POST方法*/ case METHOD_POST: return; default : break; } close(httpcon); }