Fix udp receive
This commit is contained in:
parent
f34adc5973
commit
9586aed728
@ -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
|
||||
|
||||
|
||||
|
||||
|
@ -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}
|
||||
|
63
app/main.c
63
app/main.c
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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");
|
||||
}
|
@ -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 {
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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
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_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")
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user