STM32CubeMX 下载和安装 详细教程
【HAL库】STM32CubeMX开发----STM32F407----目录
前言
本次实验主要实现:
STM32F407开发板 为 TCPclient客户端,PC端 为 TCPserver服务端,相互之间的发送和接收实验。
前期准备----完美Ping通环境
本次实验需要在STM32F407开发板与PC端,完美Ping通 的前提下,进行 TCPclient 客户端程序设计。
关于如何实现STM32F407开发板和PC端的以太网通信,如何完美Ping通。
相关文章链接:【HAL库】STM32CubeMX开发----STM32F407----ETH+LAN8720A+LWIP----ping通
一、TCPclient客户端----相关函数
TCPclient客户端开发,使用到的相关LWIP API函数,具体如下:
函数 | 描述 |
---|
tcp_new(); | 创建一个新的TCP协议控制块 |
tcp_connect(); | 建立远端服务器连接 |
tcp_err(); | 错误回调函数 |
tcp_poll(); | 周期性回调函数—最快1s调用两次 |
tcp_sent(); | 发送回调函数 |
tcp_recv(); | 接收回调函数 |
tcp_recved(); | 应用程序在处理数据后应调用此函数,通知内核更新接收窗口 |
tcp_write(); | 将要发送的数据写入发送缓存队列中 |
tcp_output(); | 将发送缓冲队列中的数据发送出去 |
tcp_close(); | 关闭TCP连接 |
tcp_abort(); | 中断TCP连接 |
二、TCPclient客户端----开发流程
创建 两个文件 TCPclient.c 和 TCPclient.h,用来存储功能程序。
步骤1:创建 TCPclient 初始化函数
void TCP_Client_Init(void)
{ struct tcp_pcb *client_pcb = NULL;ip4_addr_t server_ip; client_pcb = tcp_new(); IP4_ADDR(&server_ip, 192,168,1,20); if(client_pcb != NULL){tcp_connect(client_pcb, &server_ip, 18099, client_connected);tcp_err(client_pcb, client_error);}
}
步骤2:创建 注册回调函数
static err_t client_connected(void *arg, struct tcp_pcb *pcb, err_t err)
{tcp_poll(pcb,client_poll,1);tcp_sent(pcb, client_send);tcp_recv(pcb,client_recv);return ERR_OK;
}
步骤3:编写 数据处理函数
1. 周期轮询处理函数
周期轮询处理,最快500ms一次
static err_t client_poll(void *arg, struct tcp_pcb *tpcb)
{return ERR_OK;
}
2. 发送处理函数
这里编写发送数据,然后通过tcp_write();
加载到发送缓冲中。
static err_t client_send(void *arg, struct tcp_pcb *tpcb, u16_t len)
{return ERR_OK;
}
3. 接收处理函数
接收数据,然后处理数据
static err_t client_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
{if (p != NULL) { tcp_recved(tpcb, p->tot_len);memset(p->payload, 0 , p->tot_len);pbuf_free(p);} return ERR_OK;
}
4. 异常处理函数
在调用异常处理函数时,说明TCP通信连接已经断开,相关TCP控制块已经删除。所以在这里我们可以重现初始化,重新启动连接。
static void client_error(void *arg,err_t err)
{ TCP_Client_Init();
}
步骤5:在main主函数中调用TCP_Client_Init();
需要在主函数中调用 #include "TCPclient.h"
TCP_Client_Init();
加入到初始化就行,不用加到主循环中。
#include "TCPclient.h"int main(void)
{TCP_Client_Init();while (1){MX_LWIP_Process();}
}
三、TCPclient客户端----具体程序
TCPclient.c
#include
#include
#include "lwip/netif.h"
#include "lwip/ip.h"
#include "lwip/tcp.h"
#include "lwip/init.h"
#include "netif/etharp.h"
#include "lwip/udp.h"
#include "lwip/pbuf.h"
#include "lwip/priv/tcp_priv.h"
#include "TCPclient.h"static err_t client_connected(void *arg, struct tcp_pcb *pcb, err_t err);
static err_t client_send(void *arg, struct tcp_pcb *tpcb, u16_t len);
static err_t client_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err);
static err_t client_poll(void *arg, struct tcp_pcb *tpcb);
static void client_error(void *arg,err_t err);void TCP_Client_Init(void)
{ struct tcp_pcb *client_pcb = NULL;ip4_addr_t server_ip; client_pcb = tcp_new(); IP4_ADDR(&server_ip, DEST_IP_ADDR0,DEST_IP_ADDR1,DEST_IP_ADDR2,DEST_IP_ADDR3); if(client_pcb != NULL){tcp_connect(client_pcb, &server_ip, TCP_CLIENT_PORT, client_connected);tcp_err(client_pcb, client_error);}}
static err_t client_connected(void *arg, struct tcp_pcb *pcb, err_t err)
{tcp_poll(pcb,client_poll,1);tcp_sent(pcb, client_send);tcp_recv(pcb,client_recv);tcp_write(pcb,"这里是客户端\n",strlen("这里是客户端\n"), 1);return ERR_OK;
}
static err_t client_poll(void *arg, struct tcp_pcb *tpcb)
{return ERR_OK;
}
static err_t client_send(void *arg, struct tcp_pcb *tpcb, u16_t len)
{char send_buf[] = "工欲善其事,必先利其器。";tcp_write(tpcb, send_buf,strlen(send_buf), 1);return ERR_OK;
}
static err_t client_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
{if (p != NULL) { tcp_recved(tpcb, p->tot_len); tcp_write(tpcb, p->payload, p->tot_len, 1);memset(p->payload, 0 , p->tot_len);pbuf_free(p);} return ERR_OK;
}
static void client_error(void *arg,err_t err)
{ TCP_Client_Init();
}
TCPclient.h
#ifndef _TCPclient_H_
#define _TCPclient_H_#include "main.h"
#define TCP_CLIENT_PORT 18099
#define DEST_IP_ADDR0 192
#define DEST_IP_ADDR1 168
#define DEST_IP_ADDR2 1
#define DEST_IP_ADDR3 20void TCP_Client_Init(void);#endif
四、TCPclient客户端----调试程序
在确保STM32F407开发板与PC端,完美Ping通,然后打开网络调试助手。
网络调试助手下载链接:网络调试助手 点击下载
TCPclient客户端—发送
循环发送:工欲善其事,必先利其器。
TCPclient客户端—接收
将接收到的数据发送回去。