如何用STM32F407的UDP发送特定数据

发布时间:2024-05-14  

探究WaveShare的F407的板子好几天了,这两天一直止步于网卡模块的udp发包,因为截包工具总是收不到我代码里面发出去的数据包,我的要求是只发特定数据,不管收到的数据包。


记录下整个测试过程,以便以后翻阅


使用开发板自带的例程,udp_echo_server的例子,在此基础上修改,main函数是

int main(void)

{

/*!《 At this stage the microcontroller clock setting is already configured to

168 MHz, this is done through SystemInit() function which is called from

startup file (startup_stm32f4xx.s) before to branch to application main.

To reconfigure the default setting of SystemInit() function, refer to

system_stm32f4xx.c file

*/

#ifdef SERIAL_DEBUG

DebugComPort_Init();

#endif

/*Initialize LCD and Leds */

LCD_LED_Init();

/* configure ethernet */

ETH_BSP_Config();

/* Initilaize the LwIP stack */

LwIP_Init();

/* UDP echoserver */

udp_echoserver_init();

/* Infinite loop */

while (1)

{

/* check if any packet received */

if (ETH_CheckFrameReceived())

{

/* process received ethernet packet */

LwIP_Pkt_Handle();

}

/* handle periodic timers for LwIP */

LwIP_Periodic_Handle(LocalTime);

}

}

我发现串口不能用,可能是其初始化方式有些问题,我做了些修改

将DebugComPort_Init函数改成下面两个函数

USART_Configuration();

USART_NVIC_Config();

串口1就可以正常使用了

void USART_Configuration(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

RCC_AHB1PeriphClockCmd(Open_USART_TX_GPIO_CLK,ENABLE);

RCC_AHB1PeriphClockCmd(Open_USART_RX_GPIO_CLK,ENABLE);

#ifdef USART1_OPEN

RCC_APB2PeriphClockCmd(Open_USART_CLK,ENABLE);

#else

RCC_APB1PeriphClockCmd(Open_USART_CLK,ENABLE);

#endif

GPIO_PinAFConfig(Open_USART_TX_GPIO_PORT, Open_USART_TX_SOURCE, Open_USART_TX_AF);

GPIO_PinAFConfig(Open_USART_RX_GPIO_PORT, Open_USART_RX_SOURCE, Open_USART_RX_AF);

/*

* Open_USART_TX -》 PA9 , Open_USART_RX -PA10

*/

GPIO_InitStructure.GPIO_Pin = Open_USART_TX_PIN;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

GPIO_Init(Open_USART_TX_GPIO_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = Open_USART_RX_PIN;

GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

GPIO_Init(Open_USART_RX_GPIO_PORT, &GPIO_InitStructure);

/*

USARTx configured as follow:

- BaudRate = 115200 baud

- Word Length = 8 Bits

- One Stop Bit

- No parity

- Hardware flow control disabled (RTS and CTS signals)

- Receive and transmit

*/

USART_InitStructure.USART_BaudRate = 115200;

USART_InitStructure.USART_WordLength = USART_WordLength_8b;

USART_InitStructure.USART_StopBits = USART_StopBits_1;

USART_InitStructure.USART_Parity = USART_Parity_No;

USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

USART_Init(Open_USART, &USART_InitStructure);

/* Enable the Open_USART Transmit interrupt: this interrupt is generated when the

Open_USART transmit data register is empty */

USART_ITConfig(Open_USART,USART_IT_RXNE,ENABLE);

USART_Cmd(Open_USART, ENABLE);

}

void USART_NVIC_Config(void)

{

NVIC_InitTypeDef NVIC_InitStructure;

/* Enable the USARTx Interrupt */

NVIC_InitStructure.NVIC_IRQChannel = Open_USART_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

}

然后将udp_echoserver_init();注释掉

在while(1)里面添加一下函数

udp_send_data(udp_data, sizeof(udp_data));

代码是

unsigned char udp_data[]= “hello world!”;

void udp_send_data(uint8_t* pData, uint16_t len)

{

struct udp_pcb *upcb;

struct pbuf* buff;

struct ip_addr ipaddr;

err_t err;

buff = pbuf_alloc(PBUF_TRANSPORT, 1024, PBUF_ROM);

buff-》payload = pData;

buff-》len = len;

buff-》tot_len = len;

upcb = udp_new();//建立一个新的UDP包

udp_bind(upcb, IP_ADDR_ANY, 7);

IP4_ADDR(&ipaddr, 192, 168, 1, 11); //切记,此处的IP是PC的IP,因为使用PC的截包软件接收

err = udp_connect(upcb, &ipaddr, 7);

if(err == ERR_OK)

{

err = udp_send(upcb, buff);

if(ERR_IS_FATAL(err))

printf(“udp_send.。.%drn”,err);

}

udp_disconnect(upcb);

pbuf_free(buff);

udp_remove(upcb);

}

最终main函数是

int main(void)

{

USART_Configuration();

USART_NVIC_Config();

/*Initialize LCD and Leds */

LCD_LED_Init();

/* configure ethernet */

ETH_BSP_Config();

/* Initilaize the LwIP stack */

LwIP_Init();

/* UDP echoserver */

//udp_echoserver_init();

/* Infinite loop */

while (1)

{

udp_send_data(udp_data, sizeof(udp_data));

//Delay(100);

/* check if any packet received */

if (ETH_CheckFrameReceived())

{

/* process received ethernet packet */

LwIP_Pkt_Handle();

}

/* handle periodic timers for LwIP */

LwIP_Periodic_Handle(LocalTime);

}

}

注意

udp_send_data函数里面的ip,一开始我就是因为把此处的IP设置成开发板的IP了,后来就没想到是这出了问题,所以截包工具一直截不到数据,后来单步调试,发现udp_recv的回调函数udp_echoserver_receive_callback的结构体udp_pcb的upcb的remote_ip一直是PC端的IP才想起来是这个问题。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>