在STM32上通過建立UDP連接實現(xiàn)數(shù)據(jù)的傳輸。在上節(jié)提到采用的是輕型的TCP/IP協(xié)議棧Uip,在Uip協(xié)議中實現(xiàn)UDP連接的創(chuàng)建,需要以下步驟:
第一步,打開支持UDP協(xié)議的配置項,支持的UDP連接的個數(shù),參考上節(jié)的配置文件。
第二步,確定本地的IP地址和端口號(192.168.0.100 9999),遠程主機的IP地址和端口號(192.168.0.22 9998)
#define IP_ADDR1 192
#define IP_ADDR2 168
/#define IP_ADDR3 3
/#define IP_ADDR4 100
#define UDP_REMOTE_PORT 9998
#define UDP_LOCAL_PORT 9999
第三步,UDP創(chuàng)建連接初始化,
void Udp_Init(void)
{
uint8_t i = 0;
uip_ipaddr_t ipaddr;
for(i = 0; i< UIP_UDP_CONNS; i++)
{
if(&uip_udp_conns[i] != NULL)
{
uip_udp_remove(&uip_udp_conns[i]);
}
}
//創(chuàng)建UDP連接
uip_ipaddr(ipaddr,192, 168, 0, 22);
uip_udp_conn = uip_udp_new(&ipaddr, HTONS(UDP_REMOTE_PORT));
//綁定本地端口
if(uip_udp_conn != NULL)
{
uip_udp_bind(uip_udp_conn, HTONS(UDP_LOCAL_PORT));
}
}
將此UDP初始化函數(shù),放在uip協(xié)議棧初始化之后。
UDP應(yīng)用層數(shù)據(jù)處理函數(shù)的實現(xiàn)
#ifndef UIP_UDP_APPCALL
#define UIP_UDP_APPCALL Udp_Appcall
#endif
void Udp_Appcall(void)
{
uint32_t i ;
u8 strloadlen = 0;
uip_ipaddr_t ipaddr;
u8 targetIp[4], netMask[4], gateway[4], macaddr[6],netip[4];
char netMaskbuff[16], macaddrbuff[20],gatewayBuf[16];
memset(str,0,100);
udpip_buf = (struct uip_udpip_hdr *)&uip_buf[UIP_LLH_LEN];
udp_datelen = (udpip_buf->len[0] << 8) + udpip_buf->len[1] - UIP_IPUDPH_LEN;//HTONS(udpip_buf->len);
udp_appbuf = (char *)uip_appdata;
memcyp(str,udp_appbuf,udp_datelen);
myudp_send(str,strlen(str));
}
根據(jù)需要,實現(xiàn)對數(shù)據(jù)的處理,編譯完成后,下載值目標板,復位。
第四步,將所使用的PC機的IP地址設(shè)置成192.168.0.22,打開網(wǎng)絡(luò)調(diào)試助手,將協(xié)議類型設(shè)置為UDP,本地端口號設(shè)置成UDP_REMOTE_PORT,點擊連接,即可創(chuàng)建UDP連接,此時即可通過在網(wǎng)絡(luò)助手,向目標板發(fā)送UDP數(shù)據(jù)包。