設置 | 登錄 | 註冊

目前共有6篇帖子。

【示例程序】lwip通過UDP向計算機發送數據

1樓 巨大八爪鱼 2017-4-6 20:49
【單片機端程序】
#include <string.h>
#include "lwip/udp.h"

void recvtest(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port)
{
    uint16_t i;
    if (p != NULL)
    {
        printf("Recved: ");
        for (i = 0; i < p->len; i++)
            putchar(((char *)p->payload)[i]);
        putchar('\n');
        pbuf_free(p);
    }
    udp_remove(pcb); // 這裡的pcb和test函數裡的upcb是一樣的
}

void test(void)
{
    char *str = "Hello World!";
    ip_addr_t ipaddr;
    struct pbuf *p = pbuf_alloc(PBUF_TRANSPORT, strlen(str), PBUF_ROM);
    struct udp_pcb *upcb = udp_new();
    p->payload = str; // 要發送的數據
   
    IP4_ADDR(&ipaddr, 192, 168, 1, 106); // 目的地址
    //udp_connect(upcb, &ipaddr, 82); // 埠號為82
    //udp_send(upcb, p);
    udp_sendto(upcb, p, &ipaddr, 82);
    pbuf_free(p);
    udp_recv(upcb, recvtest, NULL);
}
2樓 巨大八爪鱼 2017-4-6 20:49
【PC端Java程序】
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class Test {
    public static void main(String[] args) {
        try {
            DatagramSocket ds = new DatagramSocket(82);
           
            // 接收並顯示數據
            byte[] data = new byte[100];
            DatagramPacket dp = new DatagramPacket(data, data.length);
            System.out.println("Begin...");
            ds.receive(dp);
            InetAddress addr = dp.getAddress(); // 發送者地址
            int port = dp.getPort(); // 發送者埠
           
            String content = new String(data, 0, dp.getLength());
            System.out.println("Recved! Content: " + content);
            System.out.println("From: " + addr.toString().replace("/", "") + ":" + port);
           
            // 發送回應
            String str = "Response...";
            data = str.getBytes();
            dp = new DatagramPacket(data, data.length, addr, port);
            ds.send(dp);
           
            ds.close();
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
3樓 巨大八爪鱼 2017-4-6 20:51
【PC端輸出】
Begin...
Recved! Content: Hello World!
From: 192.168.1.116:49153
【單片機端輸出】
DHCP分配成功!
IP位址: 192.168.1.116
子網掩碼: 255.255.255.0
網關: 192.168.1.1
DNS伺服器: 192.168.1.1
Not in cache! err=-5
DNS Found IP: 106.186.126.193
Recved: Response...
4樓 巨大八爪鱼 2017-4-6 20:52
test函數是在DHCP成功分配IP位址後調用的:
void show_addr(struct netif *netif)
{
    struct dhcp *dhcp = netif_dhcp_data(netif);
    static uint8_t displayed = 0;
    if (dhcp_supplied_address(netif))
    {
        if (displayed == 0)
        {
            printf("DHCP分配成功!\n");
            printf("IP位址: %s\n", ip4addr_ntoa(&dhcp->offered_ip_addr));
            printf("子網掩碼: %s\n", ip4addr_ntoa(&dhcp->offered_sn_mask));
            printf("網關: %s\n", ip4addr_ntoa(&dhcp->offered_gw_addr));
            printf("DNS伺服器: %s\n", ip4addr_ntoa(dns_getserver(0)));
            displayed = 1;
            test_dns(netif);
            test(); // UDP測試
        }
    }
    else
        displayed = 0;
}
5樓 巨大八爪鱼 2017-4-6 20:57
【發送局部變量的方法】
void test(void)
{
    char str[30];
    ip_addr_t ipaddr;
    struct pbuf *p;
    struct udp_pcb *upcb = udp_new();
    sprintf(str, "upcb=%p", upcb);
    p = pbuf_alloc(PBUF_TRANSPORT, strlen(str), PBUF_REF); // 發送RAM數據時應該採用PBUF_REF類型
    p->payload = str;
    // 之後的代碼省略
6樓 巨大八爪鱼 2017-4-6 21:02
如果設為PBUF_RAM,lwip則會自動分配內存。分配了多大的內存就發送多少字節,UDP里一般不採用這種方式。
p = pbuf_alloc(PBUF_TRANSPORT, 30, PBUF_RAM); // 發送30個字符
sprintf(p->payload, "upcb=%p", upcb); // 不夠30個字符

PC端收到的內容:

內容轉換:

回覆帖子
內容:
用戶名: 您目前是匿名發表。
驗證碼:
看不清?換一張
©2010-2025 Purasbar Ver3.0 [手機版] [桌面版]
除非另有聲明,本站採用知識共享署名-相同方式共享 3.0 Unported許可協議進行許可。