?? udp_api.c
字號:
#include "stm32_eth.h"
#include "netconf.h"
#include "lwip/ip_addr.h"
#include "lwip/mem.h"
#include "lwip/udp.h"
#include "Udp_Api.h"
#include "GData.h"
#include <usart.h>
#include <stdio.h>
/***************************************************/
#define server_port 99
extern u8 SizeOfInfor;
extern u8 Rx_infor[1500];
extern u16 NumInfor;
u8 SnPbufTimes=2;
extern void Delay_ARMJISHU(__IO uint32_t nCount);
/****************************************************
*函數功能:初始化udp,選定通信端口,建立連接機制
****************************************************/
void Udp_Api_init(void)
{
err_t err;
struct udp_pcb *UDPpcb;
/* create a new UDP PCB structure */
UDPpcb = udp_new();
if (!UDPpcb)
{ /* Error creating PCB. Out of Memory */
return;
}
/* Bind this PCB to port 99 */
err = udp_bind(UDPpcb, IP_ADDR_ANY, server_port);
if (err != ERR_OK)
{ /* Unable to bind to port */
return;
}
//通知協議棧當99端口有連接請求時調用recv_callback_udp
udp_recv(UDPpcb, recv_callback_udp, NULL);
}
/****************************************************
*函數功能: 對接收數據的處理函數(數據接受在以太網中斷中完成)
****************************************************/
void recv_callback_udp(void *arg,struct udp_pcb *upcb, struct pbuf *pkt_buf,
struct ip_addr *addr,u16_t port)
{
struct ip_addr dAddr = *addr; //結構體賦值
u8 *pValiData;
u16 i,j;
struct pbuf *p[10] ; //內存池中只有10個pbuf結構
struct ip_addr ipaddr;
struct udp_pcb *UDPpcb1;
u32_t IPaddress;
pValiData=(u8*)pkt_buf->payload; //u8* 對void指針進行強制轉換
printf("%接收到數據:%d\n\r",*pValiData);
IPaddress = addr->addr; //遠端IP地址
if( pkt_buf != NULL )
{
switch (*pValiData)
{
case 0x05:
udp_sendto( upcb , pkt_buf , &dAddr , port ) ; //返回原來的pkt_buf
break;
case 0x0A:
p[0] = pbuf_alloc(PBUF_TRANSPORT,SizeOfInfor*NumInfor,PBUF_RAM); //根據data大小開辟內存,在RAM中
for(i=0;i<SizeOfInfor*NumInfor;i++) //將數據復制到開辟pbuf的內存中
*((u8*)p[0]->payload + i)=Rx_infor[i];
for(j=1;j<SnPbufTimes;j++)
{
p[j]=pbuf_alloc(PBUF_RAW,SizeOfInfor*NumInfor,PBUF_RAM);
for(i=0;i<SizeOfInfor*NumInfor;i++)
*((u8*)p[j]->payload + i)=Rx_infor[i];
p[j-1]->next = p[j]; //創建鏈表
//p[j]->ref +=1; //被引用次數加1 ,pbuf->ref=1時才能刪除pbuf
}
for(j=SnPbufTimes-1;j>0;j--) //計算tot_len
p[j-1]->tot_len = p[j-1]->len + p[j]->tot_len;
// p->payload = (u8 *)Rx_infor;
IP4_ADDR(&ipaddr,(u8_t)(IPaddress), //192
(u8_t)(IPaddress >> 8), //168
(u8_t)(IPaddress >> 16), //1
(u8_t)(IPaddress >> 24) ); //2
UDPpcb1 = udp_new();
udp_bind(UDPpcb1,IP_ADDR_ANY,server_port); //綁定本地IP 地址
udp_connect(UDPpcb1,&ipaddr,port); //連接遠端IP
udp_send(UDPpcb1,p[0]);
printf(" %d ",0);
Delay_ARMJISHU(0xFFFF);
// for(i=1;i<SnPbufTimes;i++)
// {
// udp_bind(UDPpcb1,IP_ADDR_ANY,server_port); //綁定本地IP 地址
// udp_connect(UDPpcb1,&ipaddr,port); //連接遠端IP
// udp_send(UDPpcb1,p[i]);
// p[i]->ref -=1;
// printf(" %d ",i);
// Delay_ARMJISHU(0xFFFF);
// }
pbuf_free(p[0]); //將鏈表中從前往后ref=1的pbuf連續刪去
udp_remove(UDPpcb1); //在不需要改pcb通信連接時可以刪去,
break;
//udp_sendto( upcb , pkt_buf , &dAddr , port ) ;
default:
printf("%客戶端UDP端口:%d\n\r",port);
break;
}
}
pbuf_free(pkt_buf);
}
/**************************************************************
*
**************************************************************/
void process_udp_request(struct pbuf *pkt_buf, struct ip_addr *addr, u16_t port)
{
// u32_t IPaddress = addr->addr;
// struct ip_addr ipaddr=*addr;
// struct pbuf *p;
// struct udp_pcb *UDPpcb1;
// u8 *pValiData= pkt_buf->payload; //此處要指定接收到的數據類型u8
// if( pkt_buf != NULL)
// {
// switch (*pValiData)
// {
// case 0x05: //讀開門記錄
// *pValiData +=5;
// udp_sendto( upcb , pkt_buf , &ipaddr , port ) ;
// break;
// case 0x0A:
// *pValiData +=5;
// udp_sendto( upcb , pkt_buf , &ipaddr , port ) ;
// break;
// default: break;
// }
// }
}
/*
p = pbuf_alloc(PBUF_RAW,sizeof(UDPData),PBUF_RAM);
p->payload=(void *)UDPData;
IP4_ADDR(&ipaddr,(u8_t)(IPaddress), //192
(u8_t)(IPaddress >> 8), //168
(u8_t)(IPaddress >> 16), //1
(u8_t)(IPaddress >> 24)); //2
UDPpcb1 = udp_new();
udp_bind(UDPpcb1,IP_ADDR_ANY,service_port); //綁定本地IP 地址
udp_connect(UDPpcb1,&ipaddr,1000);
udp_send(UDPpcb1,p);
//udp_remove(upcb);
*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -