首页 文章

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

提问于
浏览
0

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

有谁知道如何实现它?

Edit:

感谢PeterJ的评论,我发现了类 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");     
}

1 回答

  • 2

    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中运行 - 因此不会在中断上下文中运行 - 但我认为您实际上并不希望这样做) .

    Edit: 我创建了mbed-udp-ping-pong,它显示了如何在单独的线程上侦听UDP消息 .

相关问题