OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5933|回复: 3

LWIP TCP_SERVER 现在可以ping通,数据有回显,客户端发送什么就接收什么。我想对客户端发送的数据进行分析,这个程序改怎么改

[复制链接]

4

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2019-4-9
在线时间
79 小时
发表于 2021-5-14 13:56:05 | 显示全部楼层 |阅读模式
5金钱
程序是服务端,用的RAW的



#include "lwip_tcp_demo.h"
#include "lwip_comm.h"
#include "lwip/tcp.h"
#include "delay.h"
#include "mysys.h"
#include "LED.h"
#include <string.h>

/u8 tcp_sta = 0;                        //0表示 tcp 未连接   1: 表示tcp已成功连接
//u8 tcp_tx_sta = 0;        //0表示 没有数据要发送  1: 表示有数据要发送

u8 tcp_server_recvbuf[TCP_SERVER_RX_BUFSIZE];

//u8 tcp_server_sendbuf[] = "ENC28J60 TCP Client send data.\r\n";

err_t tcp_server_connected(void *arg, struct tcp_pcb *tpcb, err_t err);
err_t tcp_server_recv(void *arg, struct tcp_pcb *tpcb,struct pbuf *p, err_t err);
err_t tcp_server_accept(void *arg,struct tcp_pcb *newpcb,err_t err);
void tcp_server_err(void *arg, err_t err);
void tcp_send_pbuf_data_out(struct tcp_pcb *pcb, struct pbuf *p);

err_t tcp_server_sent(void *arg, struct tcp_pcb *tpcb,u16_t len);
err_t tcp_server_poll(void *arg, struct tcp_pcb *tpcb);
//void tcp_server_connection_close(struct tcp_pcb *tpcb, struct tcp_client_struct * es);

void tcp_server_test(void)
{
        struct tcp_pcb *tcppcb;
        //struct ip_addr localipaddr;       
       
        err_t err;
//        u32 t = 0;
       
        tcppcb = (struct tcp_pcb *)tcp_new();                //创建一个新的TCP PCB
        if(tcppcb != NULL)       
        {
                //IP4_ADDR(&localipaddr,lwipidev.ip[0],lwipidev.ip[1],lwipidev.ip[2],lwipidev.ip[3]);
                err = tcp_bind(tcppcb, IP_ADDR_ANY, TCP_SERVER_PORT);                        //绑定一个本地IP地址和端口号
       
                if(err == ERR_OK)                        //绑定成功
                {
                        tcppcb = tcp_listen(tcppcb);        //进入监听状态
                        tcp_accept(tcppcb, tcp_server_accept);//指定监听状态的连接联通之后将要调用的回调函数
                }
                       
        }
        while(1)                //tcp 连接成功
        {
                INTX_DISABLE();
                lwip_periodic_handle();
                INTX_ENABLE();
               
                if(tcp_server_recvbuf[0] == '!')
                        LED0 =1;
                else if(tcp_server_recvbuf[0] == '#')
                        LED0 = 0;
        }

}


//lwip TCP连接建立后调用回调函数
err_t tcp_server_accept(void *arg,struct tcp_pcb *newpcb,err_t err)
{
        printf("New Client connect\r\n");
        tcp_recv(newpcb,tcp_server_recv);
       
        return ERR_OK;
}

//lwip tcp_recv()接收回调函数
err_t tcp_server_recv(void *arg, struct tcp_pcb *tpcb,struct pbuf *p, err_t err)
{
        struct pbuf *q;
        u32 data_len = 0;                //记录接收buff已使用空间大小
       
        if(p != NULL)
        {
                memset(tcp_server_recvbuf,0,TCP_SERVER_RX_BUFSIZE);        //将接收的buff清0
                for(q = p; q != NULL; q=q->next)                        //存储接收到的数据
                {
                        if(q->len > (TCP_SERVER_RX_BUFSIZE - data_len))                //若该“pbuf中的数据” 大于 “接收缓存剩余可用空间”
                                memcpy(tcp_server_recvbuf+data_len,q->payload,(TCP_SERVER_RX_BUFSIZE-data_len));        //则只拷贝可用空间大小的数据
                        else
                                memcpy(tcp_server_recvbuf+data_len,q->payload,q->len);                //可用空间大小 大于该pbuf中的payload段数据,则全部拷贝
                        data_len += q->len;                //更新接收buff已使用空间
                        if(data_len > TCP_SERVER_RX_BUFSIZE)        break;
                }
                tcp_recved(tpcb,p->tot_len);

                tcp_write(tpcb,p->payload,p->len,1);        //回显操作
                printf("%s",&tcp_server_recvbuf[0]);        //并向串口打印接收的信息
                pbuf_free(p);
        }
        else if(err == ERR_OK)        //客户端断开连接
        {
                printf("Client closed Connection\r\n");
               
                return tcp_close(tpcb);
        }
        return ERR_OK;
}
/*
void tcp_send_pbuf_data_out(struct tcp_pcb *pcb, struct pbuf *p)
{
        if(NULL == pcb || NULL == p)
        {
                return;
        }
        while(p != NULL)
        {
                tcp_write(pcb,p->payload,p->len,1);
                p = p->next;
        }
}
*/
//lwip tcp进程出现错误时回调函数
void tcp_server_err(void *arg, err_t err)
{
        printf("fatal error has occurred.\r\n");
        if(ERR_RST != err)
                tcp_server_test();
}



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

778

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6741
金钱
6741
注册时间
2017-4-12
在线时间
1258 小时
发表于 2021-5-14 14:06:11 | 显示全部楼层
接收到以数据包后,根据你的通信协议进行解析
回复

使用道具 举报

4

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2019-4-9
在线时间
79 小时
 楼主| 发表于 2021-5-14 14:14:46 | 显示全部楼层
245925587 发表于 2021-5-14 14:06
接收到以数据包后,根据你的通信协议进行解析

我知道啊,但是上面的程序不知道怎么改
回复

使用道具 举报

10

主题

778

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6741
金钱
6741
注册时间
2017-4-12
在线时间
1258 小时
发表于 2021-5-14 14:57:49 | 显示全部楼层
虫儿飞Zr86i 发表于 2021-5-14 14:14
我知道啊,但是上面的程序不知道怎么改

那你没理解源程序接收处理,你去找原子的视频看下这部分内容,就知道怎么改了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-23 23:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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