Fix udp receive
This commit is contained in:
parent
f34adc5973
commit
9586aed728
@ -7,7 +7,7 @@ project(stm32)
|
|||||||
|
|
||||||
add_subdirectory(app) #application
|
add_subdirectory(app) #application
|
||||||
add_subdirectory(bsp) #board support package, lwip
|
add_subdirectory(bsp) #board support package, lwip
|
||||||
add_subdirectory(lib) #stm32f4xx library
|
add_subdirectory(libs/stm32f4xx) #stm32f4xx library
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,9 +1,18 @@
|
|||||||
set(elf_file stm32.elf)
|
set(elf_file stm32.elf)
|
||||||
|
|
||||||
set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/nanopb/extra)
|
# include(FetchContent)
|
||||||
find_package(Nanopb REQUIRED)
|
|
||||||
|
|
||||||
nanopb_generate_cpp(TARGET proto simple.proto)
|
# FetchContent_Declare(nanopb
|
||||||
|
# GIT_REPOSITORY https://github.com/nanopb/nanopb
|
||||||
|
# GIT_TAG master
|
||||||
|
# )
|
||||||
|
|
||||||
|
# FetchContent_MakeAvailable(nanopb)
|
||||||
|
|
||||||
|
# set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/nanopb/extra)
|
||||||
|
# find_package(Nanopb REQUIRED)
|
||||||
|
|
||||||
|
# nanopb_generate_cpp(TARGET proto simple.proto)
|
||||||
|
|
||||||
add_executable(${elf_file}
|
add_executable(${elf_file}
|
||||||
main.c
|
main.c
|
||||||
@ -12,15 +21,13 @@ add_executable(${elf_file}
|
|||||||
|
|
||||||
target_link_libraries(${elf_file} PUBLIC
|
target_link_libraries(${elf_file} PUBLIC
|
||||||
bsp
|
bsp
|
||||||
proto
|
# proto
|
||||||
)
|
)
|
||||||
|
|
||||||
target_include_directories(${elf_file} PRIVATE
|
target_include_directories(${elf_file} PRIVATE
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}
|
${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
set(EXECUTABLE ${PROJECT_NAME}.elf)
|
set(EXECUTABLE ${PROJECT_NAME}.elf)
|
||||||
|
|
||||||
add_custom_command(TARGET ${EXECUTABLE}
|
add_custom_command(TARGET ${EXECUTABLE}
|
||||||
|
63
app/main.c
63
app/main.c
@ -1,36 +1,37 @@
|
|||||||
#include "../bsp/bsp.h"
|
#include "../bsp/bsp.h"
|
||||||
#include <pb_encode.h>
|
// #include <pb_encode.h>
|
||||||
#include <pb_decode.h>
|
// #include <pb_decode.h>
|
||||||
#include "simple.pb.h"
|
// #include "simple.pb.h"
|
||||||
|
|
||||||
void serialzie() {
|
// void serialzie() {
|
||||||
/* This is the buffer where we will store our message. */
|
// /* This is the buffer where we will store our message. */
|
||||||
uint8_t buffer[128];
|
// uint8_t buffer[128];
|
||||||
size_t message_length;
|
// size_t message_length;
|
||||||
bool status;
|
// bool status;
|
||||||
|
|
||||||
/* Encode our message */
|
// /* Encode our message */
|
||||||
{
|
// {
|
||||||
SimpleMessage message = SimpleMessage_init_zero;
|
// SimpleMessage message = SimpleMessage_init_zero;
|
||||||
|
|
||||||
/* Create a stream that will write to our buffer. */
|
// /* Create a stream that will write to our buffer. */
|
||||||
pb_ostream_t stream = pb_ostream_from_buffer(buffer, sizeof(buffer));
|
// pb_ostream_t stream = pb_ostream_from_buffer(buffer, sizeof(buffer));
|
||||||
|
|
||||||
/* Fill in the lucky number */
|
// /* Fill in the lucky number */
|
||||||
message.number = 42;
|
// message.number = 42;
|
||||||
/* Now we are ready to encode the message! */
|
// /* Now we are ready to encode the message! */
|
||||||
status = pb_encode(&stream, SimpleMessage_fields, &message);
|
// status = pb_encode(&stream, SimpleMessage_fields, &message);
|
||||||
message_length = stream.bytes_written;
|
// message_length = stream.bytes_written;
|
||||||
udp_send_data(buffer, message_length);
|
// printf('%d\r\n', buffer);
|
||||||
/* Then just check for any errors.. */
|
// // udp_send_data(buffer, message_length);
|
||||||
if (!status)
|
// /* Then just check for any errors.. */
|
||||||
{
|
// if (!status)
|
||||||
printf("Encoding failed: %s\n", PB_GET_ERROR(&stream));
|
// {
|
||||||
return 1;
|
// printf("Encoding failed: %s\n", PB_GET_ERROR(&stream));
|
||||||
}
|
// return 1;
|
||||||
}
|
// }
|
||||||
return 0;
|
// }
|
||||||
}
|
// return 0;
|
||||||
|
// }
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
@ -41,14 +42,14 @@ int main(void)
|
|||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
lwipProcess(); // poll for ethernet rx and timer operations.
|
lwipProcess();
|
||||||
const char *data = "Hello, world!";
|
const char *data = "Hello, world!";
|
||||||
sprintf(numStr, "%d", cnt++);
|
sprintf(numStr, "%d", cnt++);
|
||||||
char* strCat = strcat(data, numStr);
|
char* strCat = strcat(data, numStr);
|
||||||
udp_send_data(numStr, strlen(numStr));
|
// udp_send_data(numStr, strlen(numStr));
|
||||||
// serialzie();
|
// serialzie();
|
||||||
GPIO_ToggleBits(GPIOB, GPIO_Pin_14);
|
GPIO_ToggleBits(GPIOB, GPIO_Pin_14);
|
||||||
delay(500);
|
delay(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,7 @@
|
|||||||
// A very simple protocol definition, consisting of only
|
|
||||||
// one message.
|
|
||||||
|
|
||||||
syntax = "proto2";
|
syntax = "proto2";
|
||||||
|
|
||||||
message SimpleMessage {
|
message SimpleMessage {
|
||||||
optional string project = 1 [default = "controls"];
|
optional string project = 1 [default = "controls"];
|
||||||
required int32 number = 2;
|
required int32 number = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,9 +60,6 @@ void uartInit(void)
|
|||||||
GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_USART2);
|
GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_USART2);
|
||||||
GPIO_PinAFConfig(GPIOD, GPIO_PinSource6, GPIO_AF_USART2);
|
GPIO_PinAFConfig(GPIOD, GPIO_PinSource6, GPIO_AF_USART2);
|
||||||
|
|
||||||
// NVIC_SetPriority(USART2_IRQn, 0);
|
|
||||||
// NVIC_EnableIRQ(USART2_IRQn);
|
|
||||||
|
|
||||||
USART_InitTypeDef usart;
|
USART_InitTypeDef usart;
|
||||||
usart.USART_BaudRate = 115200;
|
usart.USART_BaudRate = 115200;
|
||||||
usart.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
|
usart.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
|
||||||
@ -139,6 +136,6 @@ void boardInit() {
|
|||||||
uartInit();
|
uartInit();
|
||||||
ethInit();
|
ethInit();
|
||||||
tim_init();
|
tim_init();
|
||||||
printf("Starting main loop..\r\n");
|
|
||||||
lwipInit();
|
lwipInit();
|
||||||
|
printf("Starting app..\r\n");
|
||||||
}
|
}
|
@ -8,6 +8,7 @@
|
|||||||
#include "stm32f4xx_dma.h"
|
#include "stm32f4xx_dma.h"
|
||||||
#include "stm32f4xx_tim.h"
|
#include "stm32f4xx_tim.h"
|
||||||
#include "stm32f4xx_flash.h"
|
#include "stm32f4xx_flash.h"
|
||||||
|
#include "stm32f4xx_hal_eth.h"
|
||||||
#include "lwip/lwip.h"
|
#include "lwip/lwip.h"
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
@ -4,11 +4,9 @@
|
|||||||
|
|
||||||
#include "lwip/err.h"
|
#include "lwip/err.h"
|
||||||
#include "lwip/netif.h"
|
#include "lwip/netif.h"
|
||||||
#include "stm32f4xx_hal_eth.h"
|
#include "bsp.h"
|
||||||
#include "../bsp/bsp.h"
|
|
||||||
|
|
||||||
err_t ethernetif_init(struct netif *netif);
|
err_t ethernetif_init(struct netif *netif);
|
||||||
|
|
||||||
void ethernetif_input(struct netif *netif);
|
void ethernetif_input(struct netif *netif);
|
||||||
void ethernetif_update_config(struct netif *netif);
|
void ethernetif_update_config(struct netif *netif);
|
||||||
void ethernetif_notify_conn_changed(struct netif *netif);
|
void ethernetif_notify_conn_changed(struct netif *netif);
|
||||||
|
@ -8,11 +8,13 @@
|
|||||||
#include "lwip/timeouts.h"
|
#include "lwip/timeouts.h"
|
||||||
#include "netif/etharp.h"
|
#include "netif/etharp.h"
|
||||||
|
|
||||||
|
#define UDP_RX_BUFFER_SIZE 128
|
||||||
|
|
||||||
void Error_Handler(void);
|
void Error_Handler(void);
|
||||||
|
|
||||||
struct udp_pcb *upcb;
|
struct udp_pcb *upcb;
|
||||||
ip_addr_t remote_ip;
|
ip_addr_t remote_ip;
|
||||||
u16_t remote_port;
|
const uint16_t remote_port = 5678;
|
||||||
|
|
||||||
struct netif gnetif;
|
struct netif gnetif;
|
||||||
ip4_addr_t ipaddr;
|
ip4_addr_t ipaddr;
|
||||||
@ -22,32 +24,45 @@ uint8_t IP_ADDRESS[4];
|
|||||||
uint8_t NETMASK_ADDRESS[4];
|
uint8_t NETMASK_ADDRESS[4];
|
||||||
uint8_t GATEWAY_ADDRESS[4];
|
uint8_t GATEWAY_ADDRESS[4];
|
||||||
|
|
||||||
|
static char udp_receive_buffer[UDP_RX_BUFFER_SIZE];
|
||||||
|
|
||||||
|
void udp_receive_callback(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port);
|
||||||
|
|
||||||
|
void udp_receive_callback(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port) {
|
||||||
|
strncpy(udp_receive_buffer,p->payload,p->len);
|
||||||
|
udp_receive_buffer[p->len]=0;
|
||||||
|
// printf("Test\r\n");
|
||||||
|
printf("%s\r\n", udp_receive_buffer);
|
||||||
|
pbuf_free(p);
|
||||||
|
GPIO_ToggleBits(GPIOD, GPIO_Pin_0);
|
||||||
|
}
|
||||||
|
|
||||||
void udpServer_init(void)
|
void udpServer_init(void)
|
||||||
{
|
{
|
||||||
// UDP Control Block structure
|
ip_addr_t local_ip;
|
||||||
err_t err;
|
uint16_t local_port = 1234;
|
||||||
|
uint16_t remote_port = 5678;
|
||||||
|
err_t err;
|
||||||
|
|
||||||
/* 1. Create a new UDP control block */
|
upcb = udp_new();
|
||||||
upcb = udp_new();
|
|
||||||
ip_addr_t local_ip;
|
|
||||||
u16_t local_port;
|
|
||||||
local_port = 1234;
|
|
||||||
/* 2. Bind the upcb to the local port */
|
|
||||||
IP_ADDR4(&local_ip, 192, 168, 1, 66);
|
|
||||||
|
|
||||||
err = udp_bind(upcb, &local_ip, local_port);
|
if(upcb != NULL) {
|
||||||
|
IP_ADDR4(&local_ip, 192, 168, 1, 66);
|
||||||
/* 3. Set a receive callback for the upcb */
|
err = udp_bind(upcb, &local_ip, local_port);
|
||||||
if(err == ERR_OK)
|
if (err == ERR_OK) {
|
||||||
{
|
// printf("UDP bind\r\n");
|
||||||
IP4_ADDR(&remote_ip, 192, 168, 1, 111);
|
}
|
||||||
remote_port = 5678;
|
// IP4_ADDR(&remote_ip, 192, 168, 1, 111);
|
||||||
|
// err= udp_connect(upcb, &remote_ip, remote_port);
|
||||||
}
|
if (err == ERR_OK) {
|
||||||
else
|
// printf("UDP connect\r\n");
|
||||||
{
|
udp_recv(upcb, udp_receive_callback, NULL);
|
||||||
udp_remove(upcb);
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
udp_remove(upcb);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void udp_send_data(const char *data, u16_t len)
|
void udp_send_data(const char *data, u16_t len)
|
||||||
@ -68,6 +83,8 @@ void udp_send_data(const char *data, u16_t len)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void lwipInit(void)
|
void lwipInit(void)
|
||||||
{
|
{
|
||||||
IP_ADDRESS[0] = 192;
|
IP_ADDRESS[0] = 192;
|
||||||
|
@ -147,8 +147,11 @@
|
|||||||
#define LWIP_DEBUG 1
|
#define LWIP_DEBUG 1
|
||||||
|
|
||||||
#define LWIP_TCP 0
|
#define LWIP_TCP 0
|
||||||
|
#define LWIP_UDP 1
|
||||||
|
#define MEMP_NUM_UDP_PCB 6
|
||||||
#define LWIP_NETIF_LINK_CALLBACK 1
|
#define LWIP_NETIF_LINK_CALLBACK 1
|
||||||
|
#define PBUF_POOL_SIZE 16
|
||||||
|
#define PBUF_POOL_BUFSIZE 1200
|
||||||
/* USER CODE END 1 */
|
/* USER CODE END 1 */
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -388,7 +388,7 @@ udp_input(struct pbuf *p, struct netif *inp)
|
|||||||
}
|
}
|
||||||
#endif /* SO_REUSE && SO_REUSE_RXTOALL */
|
#endif /* SO_REUSE && SO_REUSE_RXTOALL */
|
||||||
/* callback */
|
/* callback */
|
||||||
if (pcb->recv != NULL) {
|
if (pcb->recv != NULL) {
|
||||||
/* now the recv function is responsible for freeing p */
|
/* now the recv function is responsible for freeing p */
|
||||||
pcb->recv(pcb->recv_arg, pcb, p, ip_current_src_addr(), src);
|
pcb->recv(pcb->recv_arg, pcb, p, ip_current_src_addr(), src);
|
||||||
} else {
|
} else {
|
||||||
@ -396,7 +396,8 @@ udp_input(struct pbuf *p, struct netif *inp)
|
|||||||
pbuf_free(p);
|
pbuf_free(p);
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_input: not for us.\n"));
|
LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_input: not for us.\n"));
|
||||||
|
|
||||||
#if LWIP_ICMP || LWIP_ICMP6
|
#if LWIP_ICMP || LWIP_ICMP6
|
||||||
|
1
nanopb
1
nanopb
@ -1 +0,0 @@
|
|||||||
Subproject commit 7f88274070afa5edfaf608f4d8e32f3d3c1de139
|
|
@ -20,6 +20,5 @@ set(shared_options "-Wall -Wextra -O2 -mlittle-endian -mthumb -mcpu=cortex-m4 -m
|
|||||||
set(CMAKE_C_FLAGS_INIT "${shared_options}" CACHE INTERNAL "Initial options for C compiler.")
|
set(CMAKE_C_FLAGS_INIT "${shared_options}" CACHE INTERNAL "Initial options for C compiler.")
|
||||||
set(CMAKE_CXX_FLAGS_INIT "${shared_options}" CACHE INTERNAL "Initial options for C++ compiler.")
|
set(CMAKE_CXX_FLAGS_INIT "${shared_options}" CACHE INTERNAL "Initial options for C++ compiler.")
|
||||||
set(CMAKE_EXE_LINKER_FLAGS_INIT "-Wl,--gc-sections,--print-memory-usage,-Map=${PROJECT_BINARY_DIR}/${PROJECT_NAME}.map" CACHE INTERNAL "Initial options for executable linker.")
|
set(CMAKE_EXE_LINKER_FLAGS_INIT "-Wl,--gc-sections,--print-memory-usage,-Map=${PROJECT_BINARY_DIR}/${PROJECT_NAME}.map" CACHE INTERNAL "Initial options for executable linker.")
|
||||||
# set(CMAKE_EXE_LINKER_FLAGS_INIT "${CMAKE_EXE_LINKER_FLAGS_INIT}, -T ${CMAKE_SOURCE_DIR}/lib/src/stm32f439zi_flash.ld")
|
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user