//UDP测试
void udp_demo_test(void)
{
err_t err;
struct udp_pcb *udppcb; //定义一个TCP服务器控制块
struct ip_addr rmtipaddr; //远端ip地址
u8 *tbuf;
u8 key;
u8 res=0;
u16 t=0;
udp_demo_set_remoteip();//先选择IP
BSP_LCD_Clear(WHITE); //清屏
POINT_COLOR=RED; //红色字体
BSP_LCD_ShowString(30,30,200,16,16,"Apollo STM32F4&F7");
BSP_LCD_ShowString(30,50,200,16,16,"RAW UDP Test");
BSP_LCD_ShowString(30,70,200,16,16,"ATOM@ALIENTEK");
BSP_LCD_ShowString(30,90,200,16,16,"KEY0:Send data");
BSP_LCD_ShowString(30,110,200,16,16,"KEY_UP:Quit");
BSP_LCD_ShowString(30,130,200,16,16,"KEY1:Connect");
tbuf=mymalloc(SRAMIN,200); //申请内存
if(tbuf==NULL)return ; //内存申请失败了,直接退出
sprintf((char*)tbuf,"Local IP:%d.%d.%d.%d",lwipdev.ip[0],lwipdev.ip[1],lwipdev.ip[2],lwipdev.ip[3]);//服务器IP
BSP_LCD_ShowString(30,150,210,16,16,tbuf);
sprintf((char*)tbuf,"Remote IP:%d.%d.%d.%d",lwipdev.remoteip[0],lwipdev.remoteip[1],lwipdev.remoteip[2],lwipdev.remoteip[3]);//远端IP
BSP_LCD_ShowString(30,170,210,16,16,tbuf);
sprintf((char*)tbuf,"Remote Port:%d",UDP_DEMO_PORT);//客户端端口号
BSP_LCD_ShowString(30,190,210,16,16,tbuf);
POINT_COLOR=BLUE;
BSP_LCD_ShowString(30,210,210,16,16,"STATUS:Disconnected");
udppcb=udp_new();
if(udppcb)//创建成功
{
IP4_ADDR(&rmtipaddr,lwipdev.remoteip[0],lwipdev.remoteip[1],lwipdev.remoteip[2],lwipdev.remoteip[3]);
err=udp_connect(udppcb,&rmtipaddr,UDP_DEMO_PORT);//UDP客户端连接到指定IP地址和端口号的服务器
if(err==ERR_OK)
{
err=udp_bind(udppcb,IP_ADDR_ANY,UDP_DEMO_PORT);//绑定本地IP地址与端口号
if(err==ERR_OK) //绑定完成
{
udp_recv(udppcb,udp_demo_recv,NULL);//注册接收回调函数
BSP_LCD_ShowString(30,210,210,16,16,"STATUS:Connected ");//标记连接上了(UDP是非可靠连接,这里仅仅表示本地UDP已经准备好)
udp_demo_flag |= 1<<5; //标记已经连接上
POINT_COLOR=RED;
BSP_LCD_ShowString(30,230,BSP_LCD_InitStructure.width-30,BSP_LCD_InitStructure.height-190,16,"Receive Data:");//提示消息
POINT_COLOR=BLUE;//蓝色字体
}
else
res=1;
}
else
res=1;
}
else
res=1;
while(res==0)
{
key=BSP_KEY_Scan(0);
if(key==Key_WkUP_PA0_Value)break;
if(key==Key0_PH3_Value)//KEY0按下了,发送数据
{
udp_demo_senddata(udppcb);
}
if(udp_demo_flag&1<<6)//是否收到数据?
{
BSP_LCD_Fill(30,250,BSP_LCD_InitStructure.width-1,BSP_LCD_InitStructure.height-1,WHITE);//清上一次数据
BSP_LCD_ShowString(30,250,BSP_LCD_InitStructure.width-30,BSP_LCD_InitStructure.height-230,16,udp_demo_recvbuf);//显示接收到的数据
udp_demo_flag&=~(1<<6);//标记数据已经被处理了.
}
lwip_periodic_handle();
delay_us(100);
t++;
if(t==2000)
{
t=0;
LED0_Toggle;
}
}
udp_demo_connection_close(udppcb);
myfree(SRAMIN,tbuf);
}