STM32
直播中

王超

8年用户 1396经验值
私信 关注
[问答]

stm32f107调用lwip的udp接收数据和打印出来的长度和数据都不对,为什么?

static void udp_server_receive_callback(void *arg, struct udp_PCB *upcb,
    struct pbuf *p, const ip_addr_t *addr, u16_t port)
{
    uint32_t i;

    /* 数据回传 */
    udp_sendto(upcb, p, addr, port);

    /* 打印接收到的数据 */
    printf("get msg from %d:%d:%d:%d port:%d:rn",
        *((uint8_t *) addr->addr), *((uint8_t *) addr->addr + 1),
        *((uint8_t *) addr->addr + 2), *((uint8_t *) addr->addr + 3), port);

    if (p != NULL) {
        struct pbuf *q = p;
        while(q != NULL) {
            //此处接收长度由问题
            printf("len=%urn", q->len);
            for (i = 0; i < q->len; i++) {
                printf("%X ", *((char *)q->payload + i));
            }
            q = q->next;
        }
        printf("rn");
    }

    /* 释放缓冲区数据 */
    pbuf_free(p);
}
这个接收回调函数数据回传是对的,但是打印出来的长度和数据都不对
发送:1234567890
接收打印信息:
get msg from 192:168:68:100 port:777:
len=52
3C 52 82 51 3A 6C 0 80 E1 0 0 0 8 0 45 0 0 26 0 35 0 0 FF 11 B1 98 C0 A8 44 44 C0 A8 44 64 22 B0 3 9 0 12 C6 12 31 32 33 34 35 36 37 38 39 30

请教一下是哪里出了问题?



回帖(1)

kmno4

2024-4-9 15:03:55
根据你提供的代码片段,有几个问题需要注意:

1. 打印接收到的数据时,使用了`printf`函数。在嵌入式系统中,通常没有标准输出设备,因此无法使用printf函数来打印信息。你应该使用调试工具或者串口输出来查看打印的信息。

2. 接收到的数据长度和数据内容不正确。这可能是由于使用了错误的数据类型导致的。在你的代码中,你使用了`ip_addr_t`类型来表示IP地址,但实际上它是一个结构体,不是一个整数。你需要使用相应的函数来获取IP地址的每个字节,并将其转换为对应的类型。

下面是一个示例代码,展示了如何正确获取IP地址和打印接收到的数据长度和内容(使用串口输出):

```cpp
static void udp_server_receive_callback(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port) {
    uint32_t i;
    // 数据回传
    udp_sendto(upcb, p, addr, port);
   
    // 打印接收到的数据长度
    printf("Received data length: %drn", p->len);
   
    // 打印接收到的数据内容
    for (i = 0; i < p->len; i++) {
        printf("%c", ((char *)p->payload)[i]);
    }
    printf("rn");
   
    // 释放pbuf内存
    pbuf_free(p);
}
```

请注意,为了正确使用printf函数,你需要在编译时配置合适的库和设置。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分