OpenEdv-开源电子网

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

如何像串口那样处理LAN8720A的接受和发送?

[复制链接]

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2106
金钱
2106
注册时间
2017-2-11
在线时间
307 小时
发表于 2018-9-29 15:54:10 | 显示全部楼层 |阅读模式
20金钱
  各位大神和原子哥:
  下午好!
  关于LAN8720A这章知识,因为涉及的内容比较多,好多地方有些不太懂。因为有很多上层应用和底层应用,看起来很复杂。我遇到的一个问题就是不知道接受数据的长度多少?具体长度在哪个全局变量还是在哪个函数里面?因为我急需寻找这个接受数据长度是多少,这样我就可以通过长度来处理我网络串口助手发过来的数据。因为在串口那章知识里面,都会用到串口接收数据的长度。跪求大仙们指点迷津~@@~

最佳答案

查看完整内容[请看2#楼]

我找到了接受数据的长度在哪里了。具体在这个地方,如下: 在//lwIP tcp_recv()函数的回调函数 err_t tcp_client_recv(void *arg,struct tcp_pcb *tpcb,struct pbuf *p,err_t err) { ............. .............. for(q=p;q!=NULL;q=q->next) { if(q->len > (TCP_CLIENT_RX_BUFSIZE-data_len)) memcpy(tcp_client_recvbuf+data_len,q->payload,(TCP_CLIENT_RX_BUFSIZE-data_len)); else memcpy(tc ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2106
金钱
2106
注册时间
2017-2-11
在线时间
307 小时
 楼主| 发表于 2018-9-29 15:54:11 | 显示全部楼层
本帖最后由 jiangyy 于 2018-9-30 14:47 编辑

我找到了接受数据的长度在哪里了。具体在这个地方,如下:
在//lwIP tcp_recv()函数的回调函数
err_t tcp_client_recv(void *arg,struct tcp_pcb *tpcb,struct pbuf *p,err_t err)
{
   .............
  ..............
    for(q=p;q!=NULL;q=q->next)  
   {
    if(q->len > (TCP_CLIENT_RX_BUFSIZE-data_len)) memcpy(tcp_client_recvbuf+data_len,q->payload,(TCP_CLIENT_RX_BUFSIZE-data_len));
    else memcpy(tcp_client_recvbuf+data_len,q->payload,q->len);
    data_len += q->len; //  data_len就是接收有效数据的长度  
    if(data_len > TCP_CLIENT_RX_BUFSIZE) break;
   }
}


我不知道大家对数据长度重不重视,反正对于我来说,接收一个数据包,你知道了它的长度是多少,那就意味着你想取数据包的哪个字节,你可以根据数据长度定位到数组的某个字节。因为后期你用到通信协议的话,就知道重要性了。

回复

使用道具 举报

14

主题

204

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2443
金钱
2443
注册时间
2017-9-13
在线时间
559 小时
发表于 2018-9-29 16:52:20 | 显示全部楼层
//中断服务函数
void ETH_IRQHandler(void)
{
    while(ETH_GetRxPktSize(ETH_Handler.RxDesc))   
    {
        lwip_pkt_handle();//处理以太网数据,即将数据提交给LWIP
    }
    //清除中断标志位
    __HAL_ETH_DMA_CLEAR_IT(&ETH_Handler,ETH_DMA_IT_NIS);
    __HAL_ETH_DMA_CLEAR_IT(&ETH_Handler,ETH_DMA_IT_R);
}

//当接收到数据后调用
void lwip_pkt_handle(void)
{
    //从网络缓冲区中读取接收到的数据包并将其发送给LWIP进行处理
    ethernetif_input(&lwip_netif);
}

err_t ethernetif_input(struct netif *netif)
{
        err_t err;
        struct pbuf *p;
        p=low_level_input(netif);   //调用low_level_input函数接收数据
        if(p==NULL) return ERR_MEM;
        err=netif->input(p, netif);
        if(err!=ERR_OK)
        {
                LWIP_DEBUGF(NETIF_DEBUG,("ethernetif_input: IP input error\n"));
                pbuf_free(p);
                p = NULL;
        }
        return err;
}
回复

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2106
金钱
2106
注册时间
2017-2-11
在线时间
307 小时
 楼主| 发表于 2018-9-29 17:03:32 | 显示全部楼层
HCHDaLeiGe 发表于 2018-9-29 16:52
//中断服务函数
void ETH_IRQHandler(void)
{

大神,可以加个QQ或者微信吗?做个朋友
回复

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2106
金钱
2106
注册时间
2017-2-11
在线时间
307 小时
 楼主| 发表于 2018-9-29 17:04:10 | 显示全部楼层
HCHDaLeiGe 发表于 2018-9-29 16:52
//中断服务函数
void ETH_IRQHandler(void)
{

我的微信是  16675320936
回复

使用道具 举报

14

主题

204

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2443
金钱
2443
注册时间
2017-9-13
在线时间
559 小时
发表于 2018-9-29 17:06:18 | 显示全部楼层
jiangyy 发表于 2018-9-29 17:03
大神,可以加个QQ或者微信吗?做个朋友

我也只是刚好前段时间做过这一块,大神还谈不上
回复

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2106
金钱
2106
注册时间
2017-2-11
在线时间
307 小时
 楼主| 发表于 2018-9-29 17:16:45 | 显示全部楼层
HCHDaLeiGe 发表于 2018-9-29 17:06
我也只是刚好前段时间做过这一块,大神还谈不上

可我具体还不知道哪个变量是接受收据的实际长度,一起探讨一下
回复

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2106
金钱
2106
注册时间
2017-2-11
在线时间
307 小时
 楼主| 发表于 2018-9-29 17:17:48 | 显示全部楼层
HCHDaLeiGe 发表于 2018-9-29 17:06
我也只是刚好前段时间做过这一块,大神还谈不上

QQ2223210985
回复

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2106
金钱
2106
注册时间
2017-2-11
在线时间
307 小时
 楼主| 发表于 2018-9-29 17:38:54 | 显示全部楼层
没人回复我了。我急需接收数据的长度大小,我找到的只是数据包大小,但是实际的接收数据长度是多少(也就是接收了几个数据)
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 06:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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