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(ð);
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(ð);
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 消息。
每当我在 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(ð);
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(ð);
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 消息。