mbed:在接收到 UDP 广播消息时触发中断

mbed: Triggering interrupt at reception of an UDP broadcast message

每当我在 STM32 板 (Nucleo f429zi) 的给定端口上收到广播消息时,我都会尝试触发中断功能。我使用的通信协议是 UDP,mbed 库是 UDPSocket 继承自 Socket.

有人知道如何实现吗?

编辑:

感谢 PeterJ 的评论,我发现了 class Socket 的一个有趣(但已弃用)的成员函数,称为 attach()。此方法在套接字 (recv/send/accept) 的状态更改时注册回调。

因为我在套接字上有传入广播,所以我的情况没有状态变化(只接收数据,从不发送)。有什么方法可以使用这种 attach() 方法来检测收到的每条消息?

// Open Ethernet connection
EthernetInterface eth;                          
eth.connect();

// Create an UDP socket for listening to the broadcast
UDPSocket broadcastSocket;
broadcastSocket.open(&eth);
broadcastSocket.bind(BROADCAST_PORT);

// Function to call when a broadcast message is received
broadcastSocket.attach(&onUDPSocketEvent);

void onUDPSocketEvent(){
    printf("UDP event detected\n");     
}

attach 已被 sigio 取代,但我认为它不会如您所愿。一个很好的方法是启动一个新线程,并使用这个线程来处理套接字。

void onUDPSocketEvent(void* buffer, size_t size) {
    printf("UDP event detected\n");     
}

void udp_main() {
    // Open Ethernet connection
    EthernetInterface eth;                          
    eth.connect();

    // Create an UDP socket for listening to the broadcast
    UDPSocket broadcastSocket;
    broadcastSocket.open(&eth);
    broadcastSocket.bind(BROADCAST_PORT);

    void* recvBuffer = malloc(1024);

    while (1) {
        // this blocks until next packet comes in
        nsapi_size_or_error_t size = broadcastSocket.recvfrom(NULL, recvBuffer, 1024);
        if (size < 0) {
            printf("recvfrom failed with error code %d\n", size);
        }
        onUDPSocketEvent(recvBuffer, size);
    }
}

int main() {
    Thread t; // can pass in the stack size here if you run out of memory
    t.start(&udp_main);

    while (1) {
        wait(osWaitForever);
    }
}

(请注意,回调函数不会 运行 在 ISR 中 - 所以不会在中断上下文中 - 但我假设你实际上并不想要它)。

编辑: 我创建了 mbed-udp-ping-pong,它展示了如何在单独的线程上侦听 UDP 消息。