打印
[STM32F4]

STM32F407的以太网接口,有人做过这吗?

[复制链接]
10822|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1255875047|  楼主 | 2014-11-13 15:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我是用的ST的官方例程。UDP客户端的那个。
ETH_CheckFrameReceived()检测到有数据包的时候,就会调用这个函数LwIP_Pkt_Handle()。然后进入到ethernetif_input(&netif);这个函数里面,进行处理,
在ethernetif_input(&netif);这个函数里面,看到有low_level_input(netif);把网卡的帧拷贝出来,然后再ethernet_input(struct pbuf *p, struct netif *netif)这个函数里面进行了处理。
但是在处理完了之后,我怎么去获取到处理出来的数据呢?这个有人教我吗?
沙发
mmuuss586| | 2014-11-13 18:24 | 只看该作者

应该有吧,不过我没做过;
这方面不熟悉,帮不了你;

使用特权

评论回复
板凳
YDMCP| | 2014-11-13 19:01 | 只看该作者
参考原子的吧

使用特权

评论回复
地板
song19881218| | 2014-11-14 09:18 | 只看该作者
数据会一层层向上递交,你要TCP数据,会递交到TCP层,UDP递交到UDP,不是让你处理底层的以太网帧

使用特权

评论回复
5
1255875047|  楼主 | 2014-11-18 17:30 | 只看该作者
YDMCP 发表于 2014-11-13 19:01
参考原子的吧

你好,有源代码吗?能不能提供一个给我,具体的操作收发的

使用特权

评论回复
6
1255875047|  楼主 | 2014-11-18 17:31 | 只看该作者
song19881218 发表于 2014-11-14 09:18
数据会一层层向上递交,你要TCP数据,会递交到TCP层,UDP递交到UDP,不是让你处理底层的以太网帧
...

你好,能提供一个示例吗?比如一个可用的函数来实现这个,怎么去获取数据。

使用特权

评论回复
7
song19881218| | 2014-11-21 17:26 | 只看该作者
static err_t telnet_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
{
//  char *rq;

  /* We perform here any necessary processing on the pbuf */
  if (p != NULL)
  {  
         u16_t len;
         u8_t *datab;
         u16_t strlen;      
        /* We call this function to tell the LwIp that we have processed the data */
        /* This lets the stack advertise a larger window, so more data can be received*/
        tcp_recved(pcb, p->tot_len);
        //do
        {
                //data=p->payload;
                len=p->len;
                datab = (unsigned char *)p->payload;
                if((len == 2) && (*datab == 0x0d) && (*(datab+1) == 0x0a))
                {       
                        if(cmd_flag > 0)
                        {
                          cmdbuf[cmd_flag] = 0x00;
                          if(strcmp(cmdbuf,"date")==0)
                          {
                                strlen = sprintf(sndbuf, "Now, It is 2011-xx-xx!\r\n");
                                tcp_write(pcb,sndbuf,strlen, 1);
                          }
                          else if(strcmp(cmdbuf, "hello")==0)
                          {
                                strlen = sprintf(sndbuf, "Hello, Nice to see you!\r\n");
                                tcp_write(pcb,sndbuf,strlen, 1);
                          }
                          else if(strcmp(cmdbuf, "more")==0)
                          {
                                strlen = sprintf(sndbuf, "Add whatever you need in this way!\r\n");
                                tcp_write(pcb,sndbuf,strlen, 1);
                          }
                          else if(strcmp(cmdbuf, "help")==0)
                          {
                                strlen = sprintf(sndbuf, "Suppprted Command£ºdate  hello  more  help  quit\r\n");
                                tcp_write(pcb,sndbuf,strlen, 1);
                          }
                          else if(strcmp(cmdbuf, "quit")==0)
                          {
                                cmd_flag=0;
                                pbuf_free(p);
                                return tcp_close(pcb);
                          }
                         else
                          {
                           strlen = sprintf(sndbuf, "Unkonwn Command: %s.\r\n", cmdbuf);
                           tcp_write(pcb,sndbuf,strlen, 1);
                         }
                          cmd_flag = 0;
                        }
                        strlen = sprintf(sndbuf,"\r\nForrest_Shell>>");
                        tcp_write(pcb,sndbuf,strlen, 1);
                 }
                 else if((len == 1) && (*datab >= 0x20) && (*datab <= 0x7e) && (cmd_flag < 19))
                 {
                        cmdbuf[cmd_flag] = *datab;
                        cmd_flag++;
                 }
                else if((len == 1) && (*datab == 0x08) && (cmd_flag >0))
                {
                        cmd_flag--;
                        strlen = sprintf(sndbuf," \b \b");
                        tcp_write(pcb,sndbuf,strlen, 1);
                }
                else if((len == 1) && (*datab == 0x08))
                {
                        cmd_flag=0;
                        strlen = sprintf(sndbuf,">");
                        tcp_write(pcb,sndbuf,strlen, 1);
                }
                else
                {
                                       
                }
        }
//        while(netbuf_next(buf) >= 0);
     pbuf_free(p);
    }
  else if (err == ERR_OK)
  {
    /* When the pbuf is NULL and the err is ERR_OK, the remote end is closing the connection. */
    /* We free the allocated memory and we close the connection */
    return tcp_close(pcb);
  }
  return ERR_OK;
}
这个是收到数据后的回调函数,你可以看看数据怎么提取以及处理的,这是个talent的例子

使用特权

评论回复
8
一般首席| | 2015-6-20 16:51 | 只看该作者
学习中

使用特权

评论回复
9
chenci2013| | 2015-6-21 10:38 | 只看该作者
进来学习一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

45

帖子

0

粉丝