📄 main.c
字号:
/****************************************Copyright (c)****************************************************
** Guangzou ZLG-MCU Development Co.,LTD.
** graduate school
** http://www.zlgmcu.com
**
**--------------File Info---------------------------------------------------------------------------------
** File name: main.c
** Last modified Date: 2004-09-16
** Last Version: 1.0
** Descriptions: 测试2400的网络,同时使用TCP和UDP两种协议,TCP完成HTTP连接,实现对WEB网页的访问,
** 同时建立一个绑定UDP端口,实现UDP的数据回发。
**--------------------------------------------------------------------------------------------------------
** Created by:
** Created date: 2007-3-26
** Version: 1.0
** Descriptions: 测试2400的网络,同时使用TCP和UDP两种协议,TCP完成HTTP连接,实现对WEB网页的访问,
** 同时建立一个绑定UDP端口,实现UDP的数据回发。
**--------------------------------------------------------------------------------------------------------
** Modified by: zhangjunjie
** Modified date: 2008-04-24
** Version: 1.1
** Descriptions: 对程序的风格以及注释略作调整,并检查代码。
**
** Rechecked by: Litiantian
*********************************************************************************************************/
#include "main.h"
#include "../include/cfg_net.h"
/*********************************************************************************************************
任务ID、优先级、堆栈设置及函数声明
*********************************************************************************************************/
#define TASK_START_ID 0
#define TASK_1_ID 1
#define TASK_2_ID 2
#define TASK_3_ID 3
#define TASK_4_ID 4
#define TASK_5_ID 5
#define TASK_6_ID 6
#define TASK_START_PRIO 10
#define TASK_1_PRIO 11
#define TASK_2_PRIO 12
#define TASK_3_PRIO 13
#define TASK_4_PRIO 14
#define TASK_5_PRIO 15
#define TASK_6_PRIO 16
#define MSG_QUEUE_SIZE 20
OS_EVENT *RecPackedFlag;
OS_EVENT *RecBufOverFlowFlag;
OS_EVENT *RecTcpPackedFlag;
OS_EVENT *RecPingPackedFlag;
OS_STK task0_stack[400];
OS_STK task1_stack[400];
OS_STK task2_stack[400];
OS_STK task3_stack[400];
OS_STK task4_stack[400];
/*********************************************************************************************************
与网页有关的静态变量声明
*********************************************************************************************************/
const uint8 httpweb[]={
"HTTP/1.0 200 OK\r\n"
"Date: Mon, 24 Nov 2007 01:24:17 GMT\r\n"
"Server: microHttp/1.0 Zlgmcu Corporation\r\n"
"Accept-Ranges: bytes\r\n"
//"Content-Length: 116\r\n"//"Connection: Keep-Alive\r\n"
"Connection: Keep-Close\r\n"
"Content-Type: text/html\r\n"
"\r\n"};
const uint8 web[]={
"<HTML>\r\n"
"<HEAD>\r\n"
"<TITLE>ARM_NET演示网页(周立功单片机)</TITLE>\r\n"
"<BODY aLink=green background=/100.bmp bgColor=#f1f1dd link=red\r\n"
"vLink=#321afd>\r\n"
"<H1>HELLO WELCOME TO EasyArm WEBSERVER</H1>\r\n"
"<UL>\r\n"
"<LI> <A HREF=\"http://www.zlgmcu.com/\">周立功单片机网站 </A>\r\n"
"<LI> <A HREF=\"http://www.zlg.cn/\">周立功单片机内部BBS </A>\r\n"
"<LI> <A HREF=\"http://www.zlgmcu.cn/\">周立功单片机 </A>\r\n"
"</UL>\r\n"
"</BODY>\r\n"
"</HTML>\r\n"
};
const uint8 httpgif[]={
"HTTP/1.0 200 OK\r\n"
"Date: Mon, 24 Nov 2003 01:24:17 GMT\r\n"
"Server: microHttp/1.0 Zlgmcu Corporation\r\n"
"Accept-Ranges: bytes\r\n"
//"Content-Length: 116\r\n"//"Connection: Keep-Alive\r\n"
"Connection: Keep-Close\r\n"
"Content-Type: image/bmp\r\n"
"\r\n"};
const uint8 bmp[442]={
0x42,0x4d,0xb6,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x28,0x00,
0x00,0x00,0x1a,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x00,0x00,
0x00,0x00,0x40,0x01,0x00,0x00,0xc4,0x0e,0x00,0x00,0xc4,0x0e,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x80,
0x00,0x00,0x00,0x80,0x80,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x80,
0x00,0x00,0xc0,0xc0,0xc0,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0xff,0x00,0x00,0xff,
0x00,0x00,0x00,0xff,0xff,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0xff,0x00,0xff,0xff,
0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf6,0x66,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x6f,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0x66,0x66,0x6f,0x6f,0xff,0x66,0x66,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xf6,0xff,0xff,0x6f,0xf6,0xff,0xf6,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x6f,0xff,0x6f,0xf6,0xff,0xf6,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xf6,0xff,0xf6,0xf6,0xff,0xff,
0x6f,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x6f,0xf6,0xff,0x6f,0xff,
0x6f,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xf6,0x66,0x66,0xf6,0xff,0xf6,0x66,
0x6f,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x6f,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x6f,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x6f,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00
};
uint8 MCU_IP[4] = {192,168,1,2}; /* 设置MCU的IP地址等信息 */
uint8 MCU_Mark[4] = {255,255,255,0};
uint8 MCU_GateWay[4] = {192,168,1,161};
/*********************************************************************************************************
** 任务名称: TaskB
** 任务功能: UDP处理
*********************************************************************************************************/
void TaskB(void *pdata)
{
void * UdpTemp;
uint8 eer;
while (1)
{
UdpTemp=OSQPend(RecUdpQFlag,0,&eer);
if(eer==OS_NO_ERR)
{
Udp_Process((Rec_Ptr *)UdpTemp);
eer=eer;
}
}
}
/*********************************************************************************************************
** 任务名称: TaskC
** 任务功能: TCP处理
*********************************************************************************************************/
void TaskC(void *pdata)
{
void * TcpTemp;
uint8 err;
while (1)
{
TcpTemp=OSQPend(RecTcpQFlag,0,&err);
if(err==OS_NO_ERR)
{
Process_Tcp1((Rec_Ptr *)TcpTemp);
TcpTemp=TcpTemp;
}
}
}
/*********************************************************************************************************
** 任务名称: TaskD
** 任务功能: 完成UDP协议下的数据回发
*********************************************************************************************************/
void TaskD(void *pdata)
{
uint8 add[36]={"ZLGMCUyhbabcdefghijklmnopqrstuvwxyz"};
uint8 add1[10]={"123456789"};
uint8 rec_buffer[100];
SOCKET s;
uint8 couter_byte=0;
int rec_coute,send_coute;
uint16 iii;
struct sockaddr servaddr,clientaddr;
OSTimeDly(60);
servaddr.sin_family = 0;
servaddr.sin_addr[0] = MCU_IP[0];
servaddr.sin_addr[1] = MCU_IP[1];
servaddr.sin_addr[2] = MCU_IP[2];
servaddr.sin_addr[3] = MCU_IP[3];
servaddr.sin_port = 1025;
OSTimeDly(60);
s=*socket( 0, SOCK_DGRAM, UDP_PROTOCOL);
iii=bind( (SOCKET * )&s, (struct sockaddr*)&servaddr,sizeof(servaddr));
while (1)
{
rec_coute=recvfrom( s, rec_buffer, 100, 0, (struct sockaddr*)&clientaddr, &iii );
if(rec_coute>0)
{
if(rec_buffer[0]=='A')
couter_byte=5;
else
send_coute=sendto(s, rec_buffer, rec_coute, 0, (struct sockaddr*)&clientaddr, sizeof(clientaddr) );
}
while(couter_byte!=0)
{
send_coute=sendto(s, add, 34, 0, (struct sockaddr*)&clientaddr, sizeof(clientaddr) );
if(send_coute==34)
OSTimeDly(40);
else
send_coute=sendto(s, add1, 9, 0, (struct sockaddr*)&clientaddr, sizeof(clientaddr) );
OSTimeDly(40);
couter_byte--;
}
}
}
/*********************************************************************************************************
** 任务名称: TaskE
** 任务功能: 完成基于TCP的WEB功能
*********************************************************************************************************/
void TaskE(void *pdata)
{
uint8 Temp=0;
uint16 TempLength;
int addrlen;
int ei;
unsigned char ip_add[4]={192,168,1,2};
uint8 tempdata[400];
SOCKET s;
struct sockaddr servaddr,cliaddr; /* 声明网络地址结构体 */
Arp_Request(ip_add,0);
OSTimeDly(60);
servaddr.sin_family = 0;
servaddr.sin_addr[0] = MCU_IP[0];
servaddr.sin_addr[1] = MCU_IP[1];
servaddr.sin_addr[2] = MCU_IP[2];
servaddr.sin_addr[3] = MCU_IP[3];
servaddr.sin_port = 80;
s=*socket( 0, 0, 0);
ei=bind( (SOCKET * )&s, (struct sockaddr*)&servaddr,sizeof(servaddr));
ei=listen( (SOCKET * )&s, 2 );
if(ei!=2)
while(1);
while (1)
{
Temp=accept( (SOCKET * )&s, (struct sockaddr*)&cliaddr,&addrlen );
if(Temp!=0xff)
{
while(1)
{
TempLength=recv( Temp,tempdata ,400, 0 );
if(TempLength > 0 )
{
if(tempdata[5]==' ')
{
send( Temp,(uint8 *)httpweb ,169, 0 );
send( Temp,(uint8 *)web ,395, 0 );
}
else if(tempdata[5]=='1')
{
send( Temp, (uint8 *)httpgif,169, 0 );
send( Temp,(uint8 *)bmp ,442, 0 );
}
break;
}
memset(tempdata, 0,400);
}
OSTimeDly(20);
close(Temp);
}
}
}
/*********************************************************************************************************
** 任务名称: Task_0
** 任务功能: 第一个运行的任务
*********************************************************************************************************/
void task0(void *pdata)
{
uint32 j;
UBYTE iii;
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
TargetInit(); /* 板卡初始化 */
OSTaskCreateExt(TaskB, /* 创建任务B */
(void *)0,
&task1_stack[399],
TASK_1_PRIO,
TASK_1_ID,
&task1_stack[0],
400,
(void *)0,
0);
OSTaskCreateExt(TaskC, /* 创建任务C */
(void *)0,
&task2_stack[399],
TASK_2_PRIO,
TASK_2_ID,
&task2_stack[0],
400,
(void *)0,
0);
SetNetPort(MCU_IP,MCU_GateWay,MCU_Mark);
InitNic(0);
Initial_arp();
Tcp_Initial();
Udp_Initial();
OSTaskCreateExt(TaskD, /* 创建任务D */
(void *)0,
&task3_stack[399],
TASK_3_PRIO,
TASK_3_ID,
&task3_stack[0],
400,
(void *)0,
0);
OSTaskCreateExt(TaskE, /* 创建任务E */
(void *)0,
&task4_stack[399],
TASK_4_PRIO,
TASK_4_ID,
&task4_stack[0],
400,
(void *)0,
0);
j = 0;
while(1)
{
OSSemPend(RecPackedFlag,100,&iii);
do
{
iii=Rec_Packet();
}
while(iii!=0);
j++;
if (j >= 100)
{
j=0;
}
}
}
/*$PAGE*/
/*********************************************************************************************************
** 任务名称: main()
** 任务功能: 用户程序入口函数
*********************************************************************************************************/
int main (void)
{
OSInit(); /* 操作系统初始化 */
OSTaskCreateExt(task0,
(void *)0,
&task0_stack[399],
TASK_START_PRIO,
TASK_START_ID,
&task0_stack[0],
400,
(void *)0,
0);
RecPackedFlag= OSSemCreate(0);
RecBufOverFlowFlag= OSSemCreate(0);
RecTcpPackedFlag= OSSemCreate(0);
RecPingPackedFlag= OSSemCreate(0);
SendFlag= OSSemCreate(1);
RecIcmpQFlag= OSQCreate(&RecIcmpQ[0],Q_Max_Size);
RecTcpQFlag= OSQCreate(&RecTcpQ[0],Q_Max_Size);
RecUdpQFlag= OSQCreate(&RecUdpQ[0],Q_Max_Size);
OSStart(); /* 启动多任务操作系统 */
}
/*********************************************************************************************************
END FILE
*********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -