Fix udp receive

This commit is contained in:
Vasily Markov 2024-06-06 14:12:37 +03:00
parent f34adc5973
commit 9586aed728
96 changed files with 97 additions and 77 deletions

View File

@ -7,7 +7,7 @@ project(stm32)
add_subdirectory(app) #application
add_subdirectory(bsp) #board support package, lwip
add_subdirectory(lib) #stm32f4xx library
add_subdirectory(libs/stm32f4xx) #stm32f4xx library

View File

@ -1,9 +1,18 @@
set(elf_file stm32.elf)
set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/nanopb/extra)
find_package(Nanopb REQUIRED)
# include(FetchContent)
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}
main.c
@ -12,15 +21,13 @@ add_executable(${elf_file}
target_link_libraries(${elf_file} PUBLIC
bsp
proto
# proto
)
target_include_directories(${elf_file} PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
)
set(EXECUTABLE ${PROJECT_NAME}.elf)
add_custom_command(TARGET ${EXECUTABLE}

View File

@ -1,36 +1,37 @@
#include "../bsp/bsp.h"
#include <pb_encode.h>
#include <pb_decode.h>
#include "simple.pb.h"
// #include <pb_encode.h>
// #include <pb_decode.h>
// #include "simple.pb.h"
void serialzie() {
/* This is the buffer where we will store our message. */
uint8_t buffer[128];
size_t message_length;
bool status;
// void serialzie() {
// /* This is the buffer where we will store our message. */
// uint8_t buffer[128];
// size_t message_length;
// bool status;
/* Encode our message */
{
SimpleMessage message = SimpleMessage_init_zero;
// /* Encode our message */
// {
// SimpleMessage message = SimpleMessage_init_zero;
/* Create a stream that will write to our buffer. */
pb_ostream_t stream = pb_ostream_from_buffer(buffer, sizeof(buffer));
// /* Create a stream that will write to our buffer. */
// pb_ostream_t stream = pb_ostream_from_buffer(buffer, sizeof(buffer));
/* Fill in the lucky number */
message.number = 42;
/* Now we are ready to encode the message! */
status = pb_encode(&stream, SimpleMessage_fields, &message);
message_length = stream.bytes_written;
udp_send_data(buffer, message_length);
/* Then just check for any errors.. */
if (!status)
{
printf("Encoding failed: %s\n", PB_GET_ERROR(&stream));
return 1;
}
}
return 0;
}
// /* Fill in the lucky number */
// message.number = 42;
// /* Now we are ready to encode the message! */
// status = pb_encode(&stream, SimpleMessage_fields, &message);
// message_length = stream.bytes_written;
// printf('%d\r\n', buffer);
// // udp_send_data(buffer, message_length);
// /* Then just check for any errors.. */
// if (!status)
// {
// printf("Encoding failed: %s\n", PB_GET_ERROR(&stream));
// return 1;
// }
// }
// return 0;
// }
int main(void)
{
@ -41,14 +42,14 @@ int main(void)
while (1)
{
lwipProcess(); // poll for ethernet rx and timer operations.
lwipProcess();
const char *data = "Hello, world!";
sprintf(numStr, "%d", cnt++);
char* strCat = strcat(data, numStr);
udp_send_data(numStr, strlen(numStr));
// udp_send_data(numStr, strlen(numStr));
// serialzie();
GPIO_ToggleBits(GPIOB, GPIO_Pin_14);
delay(500);
delay(100);
}
}

View File

@ -1,10 +1,7 @@
// A very simple protocol definition, consisting of only
// one message.
syntax = "proto2";
message SimpleMessage {
optional string project = 1 [default = "controls"];
required int32 number = 2;
required int32 number = 2;
}

View File

@ -60,9 +60,6 @@ void uartInit(void)
GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_USART2);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource6, GPIO_AF_USART2);
// NVIC_SetPriority(USART2_IRQn, 0);
// NVIC_EnableIRQ(USART2_IRQn);
USART_InitTypeDef usart;
usart.USART_BaudRate = 115200;
usart.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
@ -139,6 +136,6 @@ void boardInit() {
uartInit();
ethInit();
tim_init();
printf("Starting main loop..\r\n");
lwipInit();
printf("Starting app..\r\n");
}

View File

@ -8,6 +8,7 @@
#include "stm32f4xx_dma.h"
#include "stm32f4xx_tim.h"
#include "stm32f4xx_flash.h"
#include "stm32f4xx_hal_eth.h"
#include "lwip/lwip.h"
typedef enum {

View File

@ -4,11 +4,9 @@
#include "lwip/err.h"
#include "lwip/netif.h"
#include "stm32f4xx_hal_eth.h"
#include "../bsp/bsp.h"
#include "bsp.h"
err_t ethernetif_init(struct netif *netif);
void ethernetif_input(struct netif *netif);
void ethernetif_update_config(struct netif *netif);
void ethernetif_notify_conn_changed(struct netif *netif);

View File

@ -8,11 +8,13 @@
#include "lwip/timeouts.h"
#include "netif/etharp.h"
#define UDP_RX_BUFFER_SIZE 128
void Error_Handler(void);
struct udp_pcb *upcb;
ip_addr_t remote_ip;
u16_t remote_port;
const uint16_t remote_port = 5678;
struct netif gnetif;
ip4_addr_t ipaddr;
@ -22,32 +24,45 @@ uint8_t IP_ADDRESS[4];
uint8_t NETMASK_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)
{
// UDP Control Block structure
err_t err;
ip_addr_t local_ip;
uint16_t local_port = 1234;
uint16_t remote_port = 5678;
err_t err;
/* 1. Create a new UDP control block */
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);
upcb = udp_new();
err = udp_bind(upcb, &local_ip, local_port);
/* 3. Set a receive callback for the upcb */
if(err == ERR_OK)
{
IP4_ADDR(&remote_ip, 192, 168, 1, 111);
remote_port = 5678;
}
else
{
udp_remove(upcb);
}
if(upcb != NULL) {
IP_ADDR4(&local_ip, 192, 168, 1, 66);
err = udp_bind(upcb, &local_ip, local_port);
if (err == ERR_OK) {
// printf("UDP bind\r\n");
}
// IP4_ADDR(&remote_ip, 192, 168, 1, 111);
// err= udp_connect(upcb, &remote_ip, remote_port);
if (err == ERR_OK) {
// printf("UDP connect\r\n");
udp_recv(upcb, udp_receive_callback, NULL);
}
}
else
{
udp_remove(upcb);
}
}
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)
{
IP_ADDRESS[0] = 192;

View File

@ -147,8 +147,11 @@
#define LWIP_DEBUG 1
#define LWIP_TCP 0
#define LWIP_UDP 1
#define MEMP_NUM_UDP_PCB 6
#define LWIP_NETIF_LINK_CALLBACK 1
#define PBUF_POOL_SIZE 16
#define PBUF_POOL_BUFSIZE 1200
/* USER CODE END 1 */
#ifdef __cplusplus

View File

@ -388,7 +388,7 @@ udp_input(struct pbuf *p, struct netif *inp)
}
#endif /* SO_REUSE && SO_REUSE_RXTOALL */
/* callback */
if (pcb->recv != NULL) {
if (pcb->recv != NULL) {
/* now the recv function is responsible for freeing p */
pcb->recv(pcb->recv_arg, pcb, p, ip_current_src_addr(), src);
} else {
@ -396,7 +396,8 @@ udp_input(struct pbuf *p, struct netif *inp)
pbuf_free(p);
goto end;
}
} else {
}
else {
LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_input: not for us.\n"));
#if LWIP_ICMP || LWIP_ICMP6

1
nanopb

@ -1 +0,0 @@
Subproject commit 7f88274070afa5edfaf608f4d8e32f3d3c1de139

View File

@ -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_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 "${CMAKE_EXE_LINKER_FLAGS_INIT}, -T ${CMAKE_SOURCE_DIR}/lib/src/stm32f439zi_flash.ld")