在线时间73 小时
UID3117353
注册时间2016-6-21
NXP金币263
TA的每日心情 | 奋斗 2021-6-30 17:11 |
---|
签到天数: 3 天 连续签到: 1 天 [LV.2]偶尔看看I
金牌会员
 
- 积分
- 1139
- 最后登录
- 2025-5-16
|
相信大家一拿到板子都是把板子的IO口,串口这些跑一跑,大家也应该是比较熟了,今天我就把LPC1768跑一下LWIP的客户端,也希望大家不吝赐教.#include "FileHeader.h"
#include "lwip/debug.h"
#include "lwip/stats.h"
#include "lwip/tcp.h"
#include "tcp_client.h"
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "emac.h"
#include "netconf.h"
#include "tcp.h"
/**********************************************************************************************************
* LOCAL TABLES
**********************************************************************************************************/
struct tcp_pcb *tcp_client_pcb;
// struct pbuf *tcp_send_pbuf;
uint8_t TCPmark = 0;
extern struct netif netif;
// static int link_status=0;
/**********************************************************************************************************
* LOCAL TABLES
**********************************************************************************************************/
static err_t tcp_client_connected(void *arg, struct tcp_pcb *pcb, err_t err);
static err_t tcp_client_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *tcp_recv_pbuf, err_t err);
void TCP_HotPlug_state(void)
{
if( EMAC_CheckPHYStatus(EMAC_PHY_STAT_LINK)==0 )
{
netif_set_down(&netif); //禁止该端口
// link_status=1;//掉线标志
}
else if( EMAC_CheckPHYStatus(EMAC_PHY_STAT_LINK)==1 )
{
netif_set_up(&netif); //使能该端口
// link_status=0;
}
}
/**********************************************************************************************************
* 函数名称 : Tcp_Client_sent();
*
* 函数描述 : TCP客户端发送;
*
* 传递值 : 无;
*
* 返回值 : 无;
**********************************************************************************************************/
void Tcp_Client_sent(struct tcp_pcb *pcb,uint8_t *temp,u16_t len )
{
tcp_write(pcb, temp, len, 1); //将数据放入缓存区
tcp_output(pcb); //发送
}
/**********************************************************************************************************
* 函数名称 : Tcp_Client_Init();
*
* 函数描述 : TCP服务器初始化;
*
* 传递值 : 无;
*
* 返回值 : 无;
**********************************************************************************************************/
void Tcp_Client_Init(void)
{
struct ip_addr ipaddr;
/* 将目标服务器的IP写入一个结构体,为pc机本地连接IP地址 */
IP4_ADDR(&ipaddr, 192, 168, 0, 112);
/* 为tcp客户端分配一个tcp_pcb结构体 */
tcp_client_pcb = tcp_new();
if (tcp_client_pcb != NULL)
{
/* 与目标服务器进行连接,参数包括了目标端口和目标IP */
tcp_connect(tcp_client_pcb, &ipaddr, 12345, tcp_client_connected);
}
}
/**********************************************************************************************************
* 函数名称 : tcp_client_connected();
*
* 函数描述 : lwip数据接收回调函数,包含对tcp连接的确认,接收回调函数的配置;
*
* 传递值 : *arg, *pcb, err ;
*
* 返回值 : ERR_OK 无错误;
**********************************************************************************************************/
static err_t tcp_client_connected(void *arg, struct tcp_pcb *pcb, err_t err)
{
static u8_t temp[]={1,2,3,4};
/* 确认监听与连接 */
tcp_arg(pcb, mem_calloc(sizeof(struct name), 1));
/* 发送一个建立连接的问候字符串*/
// tcp_write(pcb, "hello \n", strlen("hello \n"), 0);
tcp_write(pcb, temp, sizeof(temp), 1);
/* 配置接收回调函数 */
tcp_recv(pcb, tcp_client_recv);
return ERR_OK;
}
/**********************************************************************************************************
* * 函数名称 : tcp_client_recv();
* * 函数描述 : 接受到数据后,将数据拷贝转发出去;
* * 传递值 : *arg, *pcb, *tcp_recv_pbuf, err;
* * 返回值 : ERR_ARG 非法逻辑,ERR_OK无错误;
**********************************************************************************************************/
static err_t tcp_client_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *tcp_recv_pbuf, err_t err)
{
// struct pbuf *tcp_send_pbuf;
struct name *name = (struct name *)arg;
if (tcp_recv_pbuf != NULL)
{
/* 扩大收发数据的窗口 */
tcp_recved(pcb, tcp_recv_pbuf->tot_len);
if (!name)
{
pbuf_free(tcp_recv_pbuf);
return ERR_ARG;
}
/* 将接收的数据拷贝给发送结构体 */
tcp_send_pbuf = tcp_recv_pbuf;
/* 将接收到的数据再转发出去 */
tcp_write(pcb, tcp_send_pbuf->payload, tcp_send_pbuf->len, 1);
/* 换行 */
tcp_write(pcb, "\r\n", strlen("\r\n"), 1);
pbuf_free(tcp_recv_pbuf);
}
else if (err == ERR_OK)
{
/* 释放内存 */
mem_free(name);
return tcp_close(pcb);
}
TCPmark = 1; //TCP接收完成标志
return ERR_OK;
}
|
-
|