tcp - 如何将 lwIP tcp/ip 堆栈与微 Controller stm32f4(客户端)一起使用

标签 tcp stack microcontroller lwip stm32f4

核心:Cortex-M4

微 Controller :stm32f407(stm32f4探索板)

IP 堆栈:lwIP 1.4.1

我正在使用这个微 Controller 来控制自动化设备,我想通过以下形式的 HTTP 请求将一些信息发送到单独的 Web 服务器:

http://192.168.1.3/api/xdevices.json?SetR=01

lwIP 有一个用于微处理器的 http 服务器,但我追求的是相反的(微 Controller 是客户端)。

我不确定我做错了什么,但在 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;
    }

我的标题:

    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 循环外部而不是在 while 循环内调用 tcp_setup 一次,仅建立一个 TCP 连接,而不是无限制
  • while循环中,定期处理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();
    }
}

关于tcp - 如何将 lwIP tcp/ip 堆栈与微 Controller stm32f4(客户端)一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43065302/

相关文章:

使用 ulimit 命令更改堆栈上的软限制

java - 如何在 Java 中从 Stack 接收前一行文本

c - 硬币堆,推送功能(C)

linux - 使用 UART 进行流量控制

c# - 用于二进制数据的类似 FileHelpers 的数据导入/导出实用程序?

Spring Integration TCP 客户端的多个套接字到一个服务器地址

sql-server - Windows 和 SQL Server keepalive tcp/ip 设置

sockets - 关闭套接字和关闭网络流之间的区别(System.Net.Sockets)

sockets - Wireshark TCP Dup ACK - 奇怪

c - 如何在微 Controller 上使用外部存储器