如何将 lwIP tcp/ip 堆栈与微控制器 stm32f4(客户端)一起使用
How can I use lwIP tcp/ip stack with microcontroller stm32f4 (client)
核心:Cortex-M4
微控制器:stm32f407(stm32f4发现板)
IP 堆栈:lwIP 1.4.1
我正在使用这个微控制器来控制自动化,我想通过以下形式的 HTTP 请求将一些信息发送到单独的 Web 服务器:
http://192.168.1.3/api/xdevices.json?SetR=01
lwIP 有一个用于微处理器的 http 服务器,但我在相反的方向(微控制器是客户端)。
我不确定我做错了什么,但在 TCP_Connect 之后它总是转到 tcp_error 处理程序:
#include "stm32f4xx.h"
/* Include my libraries here */
#include "defines.h"
#include "tm_stm32f4_delay.h"
#include "tm_stm32f4_disco.h"
#include "tm_stm32f4_usart.h"
#include "tm_stm32f4_ethernet.h"
#include "tm_stm32f4_watchdog.h"
#include <stdio.h>
#include <stdlib.h>
#include <lwip/tcp.h>
#include <tcp.h>
uint32_t tcp_send_packet(void);
void tcpErrorHandler(void *arg, err_t err);
err_t tcpSendCallback(void *arg, struct tcp_pcb *tpcb,u16_t len);
err_t connectCallback(void *arg, struct tcp_pcb *tpcb, err_t err);
struct tcp_pcb *testpcb;
第一个函数是 tcp_new :
void tcp_setup(void)
{
uint32_t data = 0xdeadbeef;
/* create an ip */
struct ip_addr ip;
IP4_ADDR(&ip,192,168,1,4); //IP of my PHP server
/* create the control block */
testpcb = tcp_new(); //testpcb is a global struct tcp_pcb
// as defined by lwIP
/* dummy data to pass to callbacks*/
tcp_arg(testpcb, &data);
/* register callbacks with the pcb */
// tcp_recv(testpcb, tcpRecvCallback);
tcp_sent(testpcb, tcpSendCallback);
tcp_err(testpcb, tcpErrorHandler);
/* now connect */
tcp_connect(testpcb, &ip, 21, connectCallback);
TM_DISCO_LedOn(LED_ORANGE);
}
我的回调:
void tcpErrorHandler(void *arg, err_t err){
TM_DISCO_LedOn(LED_BLUE);
}
err_t tcpSendCallback(void *arg, struct tcp_pcb *tpcb,u16_t len)
{
TM_DISCO_LedOn(LED_RED);
}
err_t connectCallback(void *arg, struct tcp_pcb *tpcb, err_t err)
{
TM_DISCO_LedOn(LED_RED);
tcp_send_packet();
return 0;
}
我的 header :
uint32_t tcp_send_packet(void)
{
char *string = "SetR=01\r\n\r\n ";
uint32_t len = strlen(string);
/* push to buffer */
tcp_write(testpcb, string, strlen(string), TCP_WRITE_FLAG_COPY);
/* now send */
tcp_output(testpcb);
return 0;
}
void lwip_init();
主要功能:
int main(void) {
/* Initialize system */
SystemInit();
lwip_init();
/* Initialize delay */
TM_DELAY_Init();
/* Initialize leds on board */
TM_DISCO_LedInit();
/* Initialize button */
TM_DISCO_ButtonInit();
while(1) {
tcp_setup();
} }
显然我忘记了一些我只是不知道它是什么的东西。(我正在使用 Keil arm)
谢谢
- 使用
lwip_init
初始化 LwIP
- 仅在
while loop
外部调用 tcp_setup
一次,而不是在 while 循环中只设置一个 TCP 连接,而不是无限制的
在while loop
中,定期处理LwIP传入数据。由于您使用的是我的(TM Tilen Majerle)STM32F4 以太网包装器,因此您应该在 while 循环中添加这些行
/* Check if any packet received */
if (LwIP_CheckFrameReceived()) {
/* Process received ethernet packet */
LwIP_Pkt_Handle();
}
/* Handle periodic timers for LwIP */
LwIP_Periodic_Handle(EthernetLocalTime);
或从您的图书馆调用 TM_ETHERNET_Update
功能。你的选择,效果一样。
你的情况:
int main() {
....
lwip_init();
tcp_setup();
while (1) {
TM_ETHERNET_Update();
}
}
核心:Cortex-M4
微控制器:stm32f407(stm32f4发现板)
IP 堆栈:lwIP 1.4.1
我正在使用这个微控制器来控制自动化,我想通过以下形式的 HTTP 请求将一些信息发送到单独的 Web 服务器:
http://192.168.1.3/api/xdevices.json?SetR=01
lwIP 有一个用于微处理器的 http 服务器,但我在相反的方向(微控制器是客户端)。
我不确定我做错了什么,但在 TCP_Connect 之后它总是转到 tcp_error 处理程序:
#include "stm32f4xx.h"
/* Include my libraries here */
#include "defines.h"
#include "tm_stm32f4_delay.h"
#include "tm_stm32f4_disco.h"
#include "tm_stm32f4_usart.h"
#include "tm_stm32f4_ethernet.h"
#include "tm_stm32f4_watchdog.h"
#include <stdio.h>
#include <stdlib.h>
#include <lwip/tcp.h>
#include <tcp.h>
uint32_t tcp_send_packet(void);
void tcpErrorHandler(void *arg, err_t err);
err_t tcpSendCallback(void *arg, struct tcp_pcb *tpcb,u16_t len);
err_t connectCallback(void *arg, struct tcp_pcb *tpcb, err_t err);
struct tcp_pcb *testpcb;
第一个函数是 tcp_new :
void tcp_setup(void)
{
uint32_t data = 0xdeadbeef;
/* create an ip */
struct ip_addr ip;
IP4_ADDR(&ip,192,168,1,4); //IP of my PHP server
/* create the control block */
testpcb = tcp_new(); //testpcb is a global struct tcp_pcb
// as defined by lwIP
/* dummy data to pass to callbacks*/
tcp_arg(testpcb, &data);
/* register callbacks with the pcb */
// tcp_recv(testpcb, tcpRecvCallback);
tcp_sent(testpcb, tcpSendCallback);
tcp_err(testpcb, tcpErrorHandler);
/* now connect */
tcp_connect(testpcb, &ip, 21, connectCallback);
TM_DISCO_LedOn(LED_ORANGE);
}
我的回调:
void tcpErrorHandler(void *arg, err_t err){
TM_DISCO_LedOn(LED_BLUE);
}
err_t tcpSendCallback(void *arg, struct tcp_pcb *tpcb,u16_t len)
{
TM_DISCO_LedOn(LED_RED);
}
err_t connectCallback(void *arg, struct tcp_pcb *tpcb, err_t err)
{
TM_DISCO_LedOn(LED_RED);
tcp_send_packet();
return 0;
}
我的 header :
uint32_t tcp_send_packet(void)
{
char *string = "SetR=01\r\n\r\n ";
uint32_t len = strlen(string);
/* push to buffer */
tcp_write(testpcb, string, strlen(string), TCP_WRITE_FLAG_COPY);
/* now send */
tcp_output(testpcb);
return 0;
}
void lwip_init();
主要功能:
int main(void) {
/* Initialize system */
SystemInit();
lwip_init();
/* Initialize delay */
TM_DELAY_Init();
/* Initialize leds on board */
TM_DISCO_LedInit();
/* Initialize button */
TM_DISCO_ButtonInit();
while(1) {
tcp_setup();
} }
显然我忘记了一些我只是不知道它是什么的东西。(我正在使用 Keil arm)
谢谢
- 使用
lwip_init
初始化 LwIP
- 仅在
while loop
外部调用tcp_setup
一次,而不是在 while 循环中只设置一个 TCP 连接,而不是无限制的 在
while loop
中,定期处理LwIP传入数据。由于您使用的是我的(TM Tilen Majerle)STM32F4 以太网包装器,因此您应该在 while 循环中添加这些行/* Check if any packet received */ if (LwIP_CheckFrameReceived()) { /* Process received ethernet packet */ LwIP_Pkt_Handle(); } /* Handle periodic timers for LwIP */ LwIP_Periodic_Handle(EthernetLocalTime);
或从您的图书馆调用 TM_ETHERNET_Update
功能。你的选择,效果一样。
你的情况:
int main() {
....
lwip_init();
tcp_setup();
while (1) {
TM_ETHERNET_Update();
}
}