打印
[STM32F1]

stm32f107调用lwip的udp程序接收发送数据出问题。

[复制链接]
7648|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kevinleez|  楼主 | 2014-6-21 10:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
当把udp接收到的数据立刻发送回PC,正常。程序如下:
void recv_callback_tftp(void *arg, struct udp_pcb *upcb, struct pbuf *pkt_buf,
                        struct ip_addr *addr, u16_t port)
{
        struct ip_addr devaddr;
        struct ip_addr destAddr = *addr;   /*  获取远程主机 IP 地址          */  
    if(pkt_buf != NULL)                      /*   如果收到的数据不为空        */
    {
                udp_sendto(upcb,pkt_buf,&destAddr,port);
        }
        pbuf_free(pkt_buf);                  /*   释放缓冲区数据               */
}

但是把接收到的数据稍微处理一下,放到其他一个buf中进行发送,每次都直接进入void HardFault_Handler(void){}里了呢。 程序如下:
void recv_callback_tftp(void *arg, struct udp_pcb *upcb, struct pbuf *pkt_buf,
                        struct ip_addr *addr, u16_t port)
{
    unsigned char n;
    unsigned char tmp8[20];
    struct ip_addr devaddr;
    struct ip_addr destAddr = *addr;                        /*  获取远程主机 IP 地址          */  
    struct pbuf *buf;
       
    buf = pbuf_alloc(PBUF_RAW,sizeof(tmp8),PBUF_POOL);
    buf->payload=(void *)tmp8;
    if(pkt_buf != NULL)                                           /*   如果收到的数据不为空        */
    {
        for(n=0;n<20;n++){
        tmp8[n] = *(((char*)(pkt_buf->payload))+n);
        }
        switch(tmp8[0]){
            case 0xC0:
                    tmp8[0] = 0xC0;
                     tmp8[1] = 0x02;
                     tmp8[2] = 72;
                     tmp8[3] = 4;
                     tmp8[4] = 0;
                     tmp8[5] = 0x13;
                     tmp8[6] = 0x05;
                     udp_sendto(upcb,(void *)(tmp8),&destAddr,port);
                     break;
        }
    }
   pbuf_free(pkt_buf);  
}

为什么。。。。


沙发
kevinleez|  楼主 | 2014-6-23 08:51 | 只看该作者
没人知道?

使用特权

评论回复
板凳
_Hanking| | 2014-7-15 16:46 | 只看该作者
楼主问题解决没?

使用特权

评论回复
地板
tgwfcc| | 2014-7-28 20:21 | 只看该作者

你好,楼主,有个问题请教下:
关于MAC的GPIO配置的,代码中有如下:
/**************************************************************/
  /*               For Remapped Ethernet pins                   */
  /*************************************************************/
  /* Input (Reset Value):
  - ETH_MII_CRS CRS: PA0
  - ETH_MII_RX_CLK / ETH_RMII_REF_CLK: PA1
  - ETH_MII_COL: PA3
  - ETH_MII_RX_DV / ETH_RMII_CRS_DV: PD8
  - ETH_MII_TX_CLK: PC3
  - ETH_MII_RXD0 / ETH_RMII_RXD0: PD9
  - ETH_MII_RXD1 / ETH_RMII_RXD1: PD10
  - ETH_MII_RXD2: PD11
  - ETH_MII_RXD3: PD12
  - ETH_MII_RX_ER: PB10 */

其中有些管脚是复用的,不是重映射,比如PA0,PA1,PD8这样的,代码中都把这些管脚放到” GPIO_PinRemapConfig(GPIO_Remap_ETH, ENABLE);“这一句代码的后边了,没有什么影响吗?
如果PD9\PD10\PD11\PD12这5个管脚的信号,我不是重映射的,是用的PC4\PC5\PB0\PB1复用管脚,我是不是要放到GPIO_PinRemapConfig(GPIO_Remap_ETH, ENABLE)它前边呢?谢谢!

使用特权

评论回复
5
ygrssm| | 2015-4-14 15:00 | 只看该作者
注意udp_sendto(upcb,(void *)(tmp8),&destAddr,port);其中第二个参数类型是struct pbuf *,而你仅在程序中使用 buf->payload=(void *)tmp8; 但这样不能改变tmp8为struct pbuf *类型,即使你很聪明的认为加上void *就行了。

使用特权

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

本版积分规则

46

主题

137

帖子

2

粉丝