查看: 4675|回复: 1

[原创] LPC1768 Dev kit 开发板跑裸机LWIP客户端

[复制链接]
  • TA的每日心情
    奋斗
    2021-6-30 17:11
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    5

    主题

    439

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1139
    最后登录
    2025-5-16
    发表于 2019-3-10 14:49:10 | 显示全部楼层 |阅读模式
    相信大家一拿到板子都是把板子的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;
    }




    QQ图片20190310144844.png
    加油
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2025-1-21 08:52
  • 签到天数: 861 天

    连续签到: 1 天

    [LV.10]以坛为家III

    75

    主题

    2523

    帖子

    24

    金牌会员

    Rank: 6Rank: 6

    积分
    5867
    最后登录
    2025-1-22
    发表于 2019-3-10 17:52:43 | 显示全部楼层
    谢谢分享,跟着学习
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-8-21 17:48 , Processed in 0.089021 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表