【通过STM32CubeMx配置LWIP+FreeRTOS并通过Socket实现TCP_Client/Sever】

这篇具有很好参考价值的文章主要介绍了【通过STM32CubeMx配置LWIP+FreeRTOS并通过Socket实现TCP_Client/Sever】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

通过STM32CubeMx配置LWIP+FreeRTOS并通过Socket实现TCP_Client/Sever

  • 测试平台 → Nucleo_F429ZI
  • 软件工具 → STM32CubeMx 6.6.1 MDK 5.3.0 网络调试助手V1.2

实现Ping通

  1. 在CubeMx上面选择NUCLEO-F429ZI开发板,并采用默认配置
    stm32socket编程,stm32,tcp/ip,嵌入式硬件

  2. 使能FreeRTOS
    stm32socket编程,stm32,tcp/ip,嵌入式硬件

  3. 修改defaultTask的栈大小
    stm32socket编程,stm32,tcp/ip,嵌入式硬件

  4. 由于使用了FreeRTOS,因此系统的TimeBase Source修改成TIM1
    stm32socket编程,stm32,tcp/ip,嵌入式硬件

  5. 使能LWIP,并且先禁用DHCP,设置好静态IP
    stm32socket编程,stm32,tcp/ip,嵌入式硬件

  6. Platform选择LAN8742
    stm32socket编程,stm32,tcp/ip,嵌入式硬件

  7. 修改堆栈大小,生成工程
    stm32socket编程,stm32,tcp/ip,嵌入式硬件

  8. 生成KEIL工程之后,勾选上use MicroLIB,代码上暂时无需做其他修改,编译下载
    stm32socket编程,stm32,tcp/ip,嵌入式硬件

  9. 打开电脑命令行,去ping这设置好的IP,能够实现Ping通
    stm32socket编程,stm32,tcp/ip,嵌入式硬件文章来源地址https://www.toymoban.com/news/detail-716537.html

使用Socket接口实现TCP Client

  1. 在实现ping通之后,新建一个C文件,将如下代码拷贝
#include "lwip/opt.h"
#include "lwip/api.h"
#include "lwip/inet.h"
#include "lwip/sockets.h"
#include "string.h"
#include "client_socket.h"
#include "cmsis_os.h"

#include <stdio.h>

#define IP_ADDR        "192.168.0.120"
#define PORT           8088
static void client_socket_thread(void *arg)
{
  int sock;
  struct sockaddr_in address;
  uint8_t send_buf[]= "This is a TCP Client test...\r\n";
  /* create a TCP socket */
  if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) 
  {
      printf("Socket error\n");
    return;
  }
  
  address.sin_family = AF_INET;
  address.sin_port = htons(PORT);
  address.sin_addr.s_addr = inet_addr(IP_ADDR);
  memset(&(address.sin_zero), 0, sizeof(address.sin_zero));

  if (connect(sock,(struct sockaddr *)&address,sizeof(struct sockaddr)) == -1)
  {
      printf("Connect failed!\n");
      closesocket(sock);
   }
  else
  {
      printf("Connect to iperf server successful!\n");
  }
  while (1) 
  {
      if (write(sock,send_buf,sizeof(send_buf)) < 0)
          break;
      vTaskDelay(1000);
  }
  closesocket(sock);
}

void client_socket_init()
{
  sys_thread_new("HTTP", client_socket_thread, NULL, DEFAULT_THREAD_STACKSIZE * 4, osPriorityAboveNormal);
}
  1. 新建一个头文件,将如下代码拷贝
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __CLIENT_SOCKET_H__
#define __CLIENT_SOCKET_H__

/* Includes ------------------------------------------------------------------*/
/* Exported types ------------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
void client_socket_init(void);

#endif /* __CLIENT_SOCKET_H__ */
  1. 在freertos.c中添加client_socket.h头文件,并且在StartDefaultTask任务中调用client_socket_init
    stm32socket编程,stm32,tcp/ip,嵌入式硬件
  2. 编译下载完成后 ,打开网络调试助手V1.2,配置成TCP Server模式,本机IP配置成192.168.0.120,端口号配置为8088,再打开连接
    stm32socket编程,stm32,tcp/ip,嵌入式硬件
  3. 复位开发板,开发板能够成功和网络调试助手连接,并且数据传输正常,网络调试助手每1s会接收到一包数据
    stm32socket编程,stm32,tcp/ip,嵌入式硬件

使用Socket接口实现TCP Server

  1. 新建一个server_socket.c文件,将如下代码拷贝
#include "lwip/opt.h"
#include "lwip/api.h"
#include "lwip/inet.h"
#include "lwip/sockets.h"
#include "string.h"
#include "server_socket.h"
#include "cmsis_os.h"

#include <stdio.h>

#define PORT          (8088)
#define RECV_DATA     (1024)
 
static void server_socket_thread(void *arg)
{
  int sock,connected;
  struct sockaddr_in address,client_addr;
  char *recv_data;
  socklen_t sin_size;
  int recv_data_len;
   
  recv_data = (char *)pvPortMalloc(RECV_DATA);
  if (recv_data == NULL)
  {
      printf("No memory\n");
      return;
  }
  if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) 
  {
      printf("Socket error\n");
      if (recv_data) free(recv_data);
      return;
  }
  
  /* bind to port 80 at any interface */
  address.sin_family = AF_INET;
  address.sin_port = htons(PORT);
  address.sin_addr.s_addr = INADDR_ANY;
  memset(&(address.sin_zero), 0, sizeof(address.sin_zero));
  if (bind(sock, (struct sockaddr *)&address, sizeof (address)) < 0)
  {
      printf("unable to bind\r\n");
      if (recv_data) free(recv_data);
      return;
  }
  
  /* listen for incoming connections (TCP listen backlog = 5) */
  if(listen(sock, 5) == -1)
  {
      printf("listen error\r\n");
      if (recv_data) free(recv_data);
      return;
  }

  while (1) 
  {
      sin_size = sizeof(struct sockaddr_in);
      connected = accept(sock, (struct sockaddr *)&client_addr, &sin_size);
      printf("new client connected from (%s, %d)\n",inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
      {
          int flag = 1;
          setsockopt(connected,IPPROTO_TCP,     /* set option at TCP level */
                     TCP_NODELAY,     /* name of option */
                     (void *) &flag, /* the cast is historical cruft */
                     sizeof(int));    /* length of option value */
      }
      while (1)
      {
          recv_data_len = recv(connected, recv_data, RECV_DATA, 0);
          if(recv_data_len <= 0)
              break;
          printf("recv %d len data\n",recv_data_len);
          write(connected,recv_data,recv_data_len);
      }
      if(connected >= 0)
          closesocket(connected);
       connected = -1;
  }
  if(recv_data) free(recv_data);
}

void server_socket_init()
{
  sys_thread_new("HTTP", server_socket_thread, NULL, DEFAULT_THREAD_STACKSIZE * 4, osPriorityAboveNormal);
}
  1. 新建server_socket.h头文件,将如下代码拷贝
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __SERVER_SOCKET_H__
#define __SERVER_SOCKET_H__

/* Includes ------------------------------------------------------------------*/
/* Exported types ------------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
void server_socket_init(void);

#endif /* __SERVER_SOCKET_H__ */
  1. 在StartDefaultTask任务中调用server_socket_init
    stm32socket编程,stm32,tcp/ip,嵌入式硬件
  2. 编译下载后复位开发板,在网络调试助手上配置成TCP Client,远程IP设置为192.168.0.10,端口号设置为8088,点击连接,可以从开发板串口打印中看到和Client连接成功。
    stm32socket编程,stm32,tcp/ip,嵌入式硬件
    stm32socket编程,stm32,tcp/ip,嵌入式硬件
  3. 通过网络调试助手向开发板发送数据,可以看到开发板串口打印接收到的数据长度,并且网络调试助手看到数据回传正常。
    stm32socket编程,stm32,tcp/ip,嵌入式硬件
    stm32socket编程,stm32,tcp/ip,嵌入式硬件

到了这里,关于【通过STM32CubeMx配置LWIP+FreeRTOS并通过Socket实现TCP_Client/Sever】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【LWIP】stm32用CubeMX(6.4版)配置LwIP+Ping+TCPclient+TCPserver发送信息到PC(操作部分)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 这是我写的第一篇博客,欢迎大家给点鼓励和提出建议! 本人由于理想和爱好,辞去土木工作,于不到一个月前入职某科技公司开始从事嵌入式,专业能力和刚毕业的大学生一样都是很薄弱的。然后被

    2024年02月03日
    浏览(25)
  • STM32cubemx对FreeRTOS的适配(工程模板配置)

    本篇文章将带大家使用STM32cubemx对FreeRTOS进行工程模板的配置。 1.开始工程的创建: 2.芯片型号选择: 3.修改时钟为TIM8: 在FreeRTOS中SYSTICK需要为FreeRTOS提供心跳,故这里选择TIM8替换SYNTICK。 4.配置RCC: 5.配置FreeRTOS: 6.开启串口方便调试和观察: 7.工程路径及编译器选择等:

    2024年02月07日
    浏览(42)
  • 【物联网学习笔记】CubeMx+STM32F407ZGT6+LWIP最最最基础配置

    使用正点原子探索者开发板 板载芯片:STM32F407ZGT6 PHY芯片:LAN8720 LWIP版本:2.1.2 本次目标:先ping通开发板再说! 修订: · 2024.4.23经评论区反馈又重新下载6.10版本CubeMX,发现确实没有Advanced Parameters,目前使用6.6.1存在,如有需要可以改成这个版本。 更改引脚 在ethernetif.c中找

    2024年04月27日
    浏览(65)
  • 基于STM32CubeMx配置FreeRtos以及USB虚拟串口步骤详解

       Debug:推荐选择 Serial Wire (方便使用STLink打断点在线调试) 中间两项默认Disable就好 TimeBase Source:若需要配置FreeRtos则不能选择SysTick,随机选择一个TIM定时器即可,这里我选择TIM1定时器。 (解释:裸机的时钟源默认是SysTick,但是开启FreeRtos后,FreeRtos会占用SysTick,用于任

    2024年02月05日
    浏览(65)
  • CubeMX配置ETH+LWIP+FreeRTOS+AC6编译新手详细教程

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 最近在做的项目需要用到TCP通信,在使用cubemx配置lwip这一块也踩了不少坑,折腾了不少的时间才ping通并通信上了,故写下这篇新手教程,希望对各位嵌入式的同学们有所帮助!! 我是用的cubemx版本 6

    2024年02月12日
    浏览(32)
  • STM32使用STM32CUBEMX配置FreeRTOS+SDIO4bit+FATFS注意事项

    以STM32F429为例: 1、SDIO配置 配置为4bit模式,此配置不是最终配置,后面会在代码进行修改。 2、Fatfs配置 Set Defines 选项中的配置可以默认,最重要注意Advanced Setting 选择中的配置,如下 该界面配置默认Use dma template是默认使能的 ,并且不可以选择,只能选择使能,所以需要使

    2024年02月11日
    浏览(52)
  • STM32CubeMX+STM32F407+FreeRTos+LAN8720 以太网通信实现数据收发功能

    目录 前言 一、STM32CubeMX配置 二、修改代码 三、硬件测试 总结 该工程应用的以太网芯片是LAN8720,代码是基于STM32CUbeMx6.2.1配置生成的,在CubeMx中配置了ETH和LWIP,还有串口1和FREERTOS,最后通过创建任务函数实现udp的以太网数据收发功能。在测试中,可以在电脑的DOS窗口ping通在

    2024年02月08日
    浏览(51)
  • STM32F407+FreeRTOS+LWIP UDP组播

    MCU:STM32F407ZET6 网卡:LAN8720A LWIP版本:V1.1.0 FreeRTOS 版本:V10.2.1 MII_RX_CLK/RMII_REF_CLK ------PA1                   MII_TXD0 ------PB12 MII_MDIO  ------PA2                                                 MII_TXD1 ------PB13 MII_RESET ------PA3                

    2024年04月26日
    浏览(77)
  • stm32 freeRTOS lwip TCP快速发送,内存泄露问题

    现象1: 发送缓慢,tcp_write之后要等200多ms才能过发送出去,而且粘包严重。 解决办法 tcp_write之后,立马调用tcp_output ,tcp就会立马发送。 现象2: 持续快速发送和接受TCP数据出现断言 而且出现TCP断连,死机情况。 其实就是一句话 主程序和以太网中断程序中对PCB-unsent 之类的

    2024年02月08日
    浏览(30)
  • STM32H743+LWIP+LAN8720+STM32cubeMX6.8.0

    最详细 一步到位 带程序 无偿分享   经历一个星期的痛苦,程序终于调试ping通了 网上的H743的博客我一个一个试一个一个试,到最后没有一个正常ping通,写本篇博客的目的就是为了后续再进行调试的人不在踩坑,听懂掌声,哈哈哈。 废话就不多说了,正文开始: 1、打开S

    2024年02月07日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包