#c #c #udp #stm32 #mbed
#c #c #udp #stm32 #mbed
Вопрос:
в настоящее время я работаю над скриптом UDP-клиента для проекта Mbed. Я работаю с платой разработки B-L475E-IOT01A и хочу получать данные с другого сетевого устройства.
Отправляющая сторона (на другом устройстве) работает. Я протестировал его с помощью скрипта python на своем компьютере.
У меня следующая проблема: я могу установить подключение к сети и я могу инициализировать сокет UDP с open()
помощью функции. Моя проблема в том, что если я пытаюсь bind()
подключить сокет либо к порту, либо к адресу сокета, я получаю nsapi_error_t
код -3002
, который означает «неподдерживаемая функциональность». Вот этот код:
#include "UDPSocket.h"
#include "mbed.h"
const char SSID[] = "";
const char password[] = "";
const uint16_t Port = 37020;
UDPSocket socket;
WiFiInterface *wifi;
BufferedSerial pc(USBTX, USBRX, 115200);
int main() {
pc.set_format(8, SerialBase::None, 1);
wifi = WiFiInterface::get_default_instance();
if (!wifi) {
printf("ERROR: No WiFiInterface found.n");
return -1;
}
printf("nConnecting to %s...n", SSID);
int ret = wifi->connect(SSID, password, NSAPI_SECURITY_WPA2);
if (ret != 0) {
printf("nConnection error: %dn", ret);
return -1;
}
SocketAddress a;
wifi->get_ip_address(amp;a);
printf("IP: %sn", a.get_ip_address());
int returnable = 1;
while (returnable != 0) {
returnable = socket.open(wifi);
printf("%drn", returnable);
wait_us(500000);
}
returnable = 1;
while (returnable != 0) {
returnable = socket.bind(Port);
printf("%drn", returnable);
wait_us(500000);
}
while (1) {
char message[500];
int n = socket.recv(amp;message, sizeof(message));
printf("%drn", n);
printf("%s", message);
wait_us(100000);
}
wifi->disconnect();
printf("nDonen");
}
Я удалил данные Wi-Fi по соображениям безопасности. Вот результат:
Connecting to ...
IP: 192.168.178.25
0
-3002
Мой вопрос в том, почему я не могу привязать свою плату к определенному порту. У вас есть какие-нибудь идеи?
Заранее благодарю вас.
Комментарии:
1. C или C ? Пожалуйста, отметьте язык, который вы на самом деле используете. C и C имеют некоторое совпадение, но это разные языки
2. mbed использует оба языка, но основным языком является C
3. вы компилируете опубликованный вами код как C или как C ?
4. Я компилирую его как код на C
Ответ №1:
MBED объявляется socket.bind
как bind (const Host amp;me)
. Аргументом является не номер порта, а Host
экземпляр. Измените его на
sock.bind(Host(IpAddr(), port));
Комментарии:
1. В устаревших версиях
bind()
объявлено, как вы упомянули, но в версии mbed 6 я получил эти две функции для работы:nsapi_error_t bind(const SocketAddress amp;address)
илиnsapi_error_t bind(uint16_t port)
. Последняя функция вызывает первую функцию с IP-адресом0.0.0.0
. Я пробовал оба, но ни один из них не работал так, как я думал.