首页 > 其他分享 >使用STM32实现简单的网络通信

使用STM32实现简单的网络通信

时间:2024-07-24 12:53:48浏览次数:12  
标签:网络通信 addr MAX 代码 printf server STM32 简单

概述 在本文中,我们将介绍如何使用STM32微控制器实现简单的网络通信。我们将使用STM32Cube软件来配置和编程STM32微控制器。我们将使用TCP/IP协议栈,以便在STM32微控制器与计算机之间进行通信。我们将通过创建一个简单的服务器端和一个客户端来演示网络通信的实现。

准备工作 在开始之前,我们需要准备以下材料:

  • 一个STM32微控制器板,例如STM32F4-Discovery板。
  • 一个计算机,其中安装了STM32Cube软件和一个串口终端程序,例如TeraTerm。

步骤1:配置STM32微控制器 首先,我们需要使用STM32Cube软件来配置STM32微控制器。以下是配置步骤:

  1. 打开STM32Cube软件,并选择相应的STM32微控制器型号。
  2. 在"Pinout & Configuration"选项卡中,配置串口,以便与计算机通信。配置一个串口作为调试输出,另一个串口作为网络通信。
  3. 在"Middlwares"选项卡中,启用TCP/IP协议栈。
  4. 在"Project Settings"选项卡中,配置项目名称和路径。
  5. 点击"Project"菜单,选择"Generate Code"来生成代码。

步骤2:编写服务器端代码 在STM32Cube软件生成的代码中,我们可以找到一些模板文件,这些文件将帮助我们编写服务器端代码。以下是编写服务器端代码的步骤:

  1. 打开Middlewares/Third_Party/LwIP/src/apps/httpd/httpd.c文件,该文件包含了一个简单的HTTP服务器的实现。
  2. httpd_init()函数中,找到以下代码行:
http_set_ssi_handler(ssi_handler, (char const **)(g_pcSSITags), NUM_CONFIG_SSI_TAGS);

将其替换为以下代码行:

http_set_ssi_handler(SSI_Handler, (const char **)(g_pcSSITags), NUM_CONFIG_SSI_TAGS);

  1. 创建一个名为network.c的新文件,并在其中编写服务器端代码。
#include "lwip/sockets.h"

#define SERVER_PORT 80
#define MAX_CONNECTIONS 10
#define MAX_BUFFER_SIZE 1024

void server_init(void)
{
  int sockfd, newsockfd;
  struct sockaddr_in serv_addr, cli_addr;
  socklen_t clilen;
  char buffer[MAX_BUFFER_SIZE];

  // 创建套接字
  sockfd = socket(AF_INET, SOCK_STREAM, 0);
  if (sockfd < 0)
  {
    // 套接字创建失败
    // 可以在此处添加错误处理代码
    return;
  }

  // 设置服务器地址
  memset((char *)&serv_addr, 0, sizeof(serv_addr));
  serv_addr.sin_family = AF_INET;
  serv_addr.sin_port = htons(SERVER_PORT);
  serv_addr.sin_addr.s_addr = INADDR_ANY;

  // 将套接字绑定到服务器地址
  if (bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
  {
    // 套接字绑定失败
    // 可以在此处添加错误处理代码
    return;
  }

  // 监听连接请求
  listen(sockfd, MAX_CONNECTIONS);

  while (1)
  {
    clilen = sizeof(cli_addr);

    // 接受连接请求
    newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen);
    if (newsockfd < 0)
    {
      // 连接请求接受失败
      // 可以在此处添加错误处理代码
      continue;
    }

    memset(buffer, 0, MAX_BUFFER_SIZE);

    // 接收数据
    int n = read(newsockfd, buffer, MAX_BUFFER_SIZE - 1);
    if (n < 0)
    {
      // 数据接收失败
      // 可以在此处添加错误处理代码
      close(newsockfd);
      continue;
    }

    // 打印接收到的数据
    printf("Received data: %s\n", buffer);

    // 发送响应数据
    char response[] = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<h1>Hello, STM32!</h1>";
    n = write(newsockfd, response, strlen(response));
    if (n < 0)
    {
      // 数据发送失败
      // 可以在此处添加错误处理代码
    }

    close(newsockfd);
  }

  close(sockfd);
}

  1. main.c文件中,调用server_init()函数来启动服务器。
#include "network.h"

int main(void)
{
  // STM32初始化代码
  
  // 启动服务器
  server_init();

  while (1)
  {
    // 主循环
  }
}

步骤3:编写客户端代码 除了服务器端代码,我们还需要编写一个客户端来与服务器进行通信。以下是编写客户端代码的步骤:

  1. 在计算机上创建一个新的C文件,并编写以下客户端代码。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>

#define SERVER_IP "192.168.1.10"
#define SERVER_PORT 80
#define MAX_BUFFER_SIZE 1024

int main(void)
{
  WSADATA wsa;
  SOCKET s;
  struct sockaddr_in server;
  char *message;
  char server_reply[MAX_BUFFER_SIZE];

  // 初始化Windows Socket API
  if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
  {
    printf("Failed. Error Code : %d", WSAGetLastError());
    return 1;
  }

  // 创建套接字
  if ((s = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
  {
    printf("Could not create socket : %d", WSAGetLastError());
  }

  // 设置服务器地址
  server.sin_addr.s_addr = inet_addr(SERVER_IP);
  server.sin_family = AF_INET;
  server.sin_port = htons(SERVER_PORT);

  // 连接服务器
  if (connect(s, (struct sockaddr *)&server, sizeof(server)) < 0)
  {
    printf("connect error");
    return 1;
  }

  printf("Connected to server\n");

  // 发送HTTP请求
  message = "GET / HTTP/1.1\r\n\r\n";
  if (send(s, message, strlen(message), 0) < 0)
  {
    printf("Send failed");
    return 1;
  }
  printf("Request sent\n");

  // 接收服务器响应
  if (recv(s, server_reply, MAX_BUFFER_SIZE, 0) < 0)
  {
    printf("recv failed");
  }
  printf("Response received\n");

  // 打印服务器响应
  printf("%s\n", server_reply);

  closesocket(s);
  WSACleanup();

  return 0;
}

  1. 在计算机上编译和运行客户端代码。确保客户端能够连接到服务器并接收到响应。

总结 在本文中,我们已经介绍了如何使用STM32微控制器实现简单的网络通信。我们编写了一个服务器端代码和一个客户端代码,来演示网络通信的实现。通过使用STM32Cube软件来配置和编程STM32微控制器,我们可以轻松地实现网络通信功能。希望本文对您有所帮助!

标签:网络通信,addr,MAX,代码,printf,server,STM32,简单
From: https://blog.csdn.net/qq_34910341/article/details/140599173

相关文章

  • STM32入门教程:智能健康监测
    STM32是一种嵌入式微控制器,是STMicroelectronics公司开发的一款产品。它具有高性能、低功耗、丰富的外设接口等特点,非常适合用于智能健康监测等应用领域。本教程将以智能健康监测为例,详细介绍如何使用STM32进行开发。主要包括以下内容:硬件准备开发环境搭建传感器使用......
  • STM32F103C8T6与LD3320进行串口通讯控制LED灯的亮灭
    目录概要整体架构流程技术名词解释技术细节LD3320部分LD3320串口测试32单片机代码部分main.c(要与LD3320保持一致)串口部分概要STM32微控制器与LD3320语言模块通过串口进行数据交互,实现语音识别和控制功能。整体架构流程通过STC-ISP将LD3320部分的代码烧录进LD......
  • 【简单易懂,复制可运行】C++通讯录管理系统实现增删改查
    自己写的300行c++通讯录管理系统,可以实现如下功能: 具体代码如下:#include<iostream>usingnamespacestd;#defineMax1000//不要分号//设计联系人结构体structPerson{ stringm_Name; intm_Sex; intm_Age; stringm_Phone; stringm_Addr; };//设计......
  • 微信小游戏0基础学习记录:1.起步-制作简单游戏的新手引导(完成)
     前情提要: 微信小游戏0基础学习记录:0.一些准备知识&起步 上一篇博客介绍到了官方教程“制作简单游戏的新手引导”的第一阶段,“创建并编译3D场景”。这一篇将继续完成新手引导的剩余内容,包括2D场景的创建与编辑、游戏项目的播放与构建等等。官方文档:快速上手|微信开放......
  • 为什么我的 RNN 无法收敛到简单任务?
    我想创建一个递归模型来解决我所知道的最简单的序列,即算术级数。以a作为基础,d作为步长,序列如下:a,a+d,a+2d,a+3d,a+4d,...为了解决这个问题,将隐藏状态表示为h,模型必须学习一个简单的2*2矩阵。这其实就是设置h1=t0.......
  • Python实现简单学生登陆系统
     代码:importhashlibclassStudent:def__init__(self,username,password):#初始化学生对象,存储用户名和加密后的密码self.username=usernameself.password=hashlib.sha256(password.encode()).hexdigest()defcheck_passwo......
  • 零基础STM32单片机编程入门(十九) 4位数码管显示模块实战含源码
    文章目录一.概要二.4位数码管主要参数三.数码管显示器的工作原理四.74HC595芯片介绍1.74HC595芯片内部框图2.74HC595通讯时序五.4位数码管原理图六.4位数码管显示实验七.CubeMX工程源代码下载八.小结一.概要数码管显示器是一类价格便宜、使用简单,通过对其不同的管......
  • 简单理解【指针数组】与【数组指针】
    2024-07-22笔记-42024-07-23补充笔记【指针数组】顾名思义,就是用来存储地址的数组,所有的元素全中存储的全部都是地址,每一个元素都可以理解为是一个指针变量。char*arr[10];int*arr2[10];char**arr3[5];①举例,多种访问方式intarr[5]={1,2,3,4,5},ar......
  • STM32驱动NRF24L01模块
    STM32驱动NRF24L01模块模块简介:NRF24L01模块是一款2.4GHZ无线通信模块。其参数如下:2.4GHzISM频段250Kbps,1Mbps,2Mbps三种空中传输速率输出功率为0dBm时发射功耗为11.3mA空中传输速率为2Mbps时接收功耗为13.5mAPowerdown模式功耗低至900nA,Standby-I模式功耗低至2......
  • Verilog HDL 的简单组合逻辑设计代码学习记录
    1.比较数据a和b,若两个数据相同则输出1,否则输出0(a、b均为单比特)看需求就简单设置输入a,b,输出o。modulecompare(a,b,o);inputa;inputb;outputo;//先来第一种写法,使用?:,这里是默认全是wire类型assigno=(a==b)?1'b1:1'b0;//第二种写法,使用ifelserego;alwa......