4307|3

4

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

使用MFC编写的上位机利用以太网接收UDP报文,为什么不能读取缓冲区中数据? [复制链接]

本人使用LM3S8962编写了使用以太网发送UDP报文的程序。可以正确接收来自上位机的UDP报文,也可以发送UDP报文。使用LM3S8962发出的报文,能够在上位机上被捕包软件iptool成功捕获,从数据上看,是正确的(看图)。但是使用MFC编写的UDP接收程序却接收不到,使用ezUDP也接收不到。请问这是哪里出了问题?



最新回复

抓包软件能看到数据,说明下位机没问题. 应该是 MFC Winsock 的问题吧. 对上位机多做几次测试看看. 后续上位机,我打算用 QT .  详情 回复 发表于 2013-7-11 17:27

点评

抓包软件能看到数据,说明下位机没问题. 应该是 MFC Winsock 的问题吧. 对上位机多做几次测试看看. 后续上位机,我打算用 QT .  详情 回复 发表于 2013-7-11 17:27
 
点赞 关注

回复
举报

4

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
帖一下代码:IP层
unsigned char
IPv4DatagramSend(unsigned char* pucDestIP,
                                unsigned char        ucUpperProtocol,
                                 unsigned short usDatagramLen)
{
        ARPTableEntry* DestAddrPTR;
        EthFrameHead*        EthSendFrameHeadPTR;
        /*Search the ARP Table for the MAC address*/
        DestAddrPTR=pucARPEntry(pucDestIP);
       
        if (DestAddrPTR==NULL)
        {
                /* If no IP address is found, send a ARP request and return 0*/
                ARPPacketOut(pucDestIP,
                                                                 pucBroadcastMACAddr,
                                                                 ARP_REQUEST);
                               
                return 0;
        }
        else/* Find the IP address in the ARP Table and send the datagram*/
        {
        /* Ethernet Frame Header Set*/
                EthSendFrameHeadPTR=(EthFrameHead *)(&(pucSendBuffer[0]));
                memcpy(EthSendFrameHeadPTR->pucDestMACAddr,
                                        DestAddrPTR->pucMACAddr,6);
                /* Source MAC is in the Frame.*/
               
                /* Upper protocol is IPv4 protocol*/
                EthSendFrameHeadPTR->usUpperProtocol=RFC894_IPv4;
               
                /* IP Datagram header Set*/
                /* 1 version and header length*/
                SENDIPv4HeaderPTR->ucVerHL=IPv4_nOP;
               
                /* 2 Type of Service */
                SENDIPv4HeaderPTR->ucTOS=DEFAULT_TOS_SETTING;
               
                /* Datagram Length (IPv4 datagram Header included)*/
                if (usDatagramLen+IPV4_HEADER_LEN<46)
                {
                        usDatagramLen=46-IPV4_HEADER_LEN;
                }
#ifdef Little_Endian               
                SENDIPv4HeaderPTR->usDataLen=usDatagramLen+IPV4_HEADER_LEN;
#endif
#ifdef Big_Endian
                SENDIPv4HeaderPTR->usDataLen=ByteReverseShort(usDatagramLen+IPV4_HEADER_LEN);
#endif
                // Identification
                usIPID++;
                SENDIPv4HeaderPTR->usId=usIPID;
               
                /* Flag Fragment offset
                 fragment when necessary
                 Fragment offset is zero*/
                SENDIPv4HeaderPTR->usFlagFragment=0x00;
               
                /* TTL hops=128 in this system */
                SENDIPv4HeaderPTR->ucTTL=128;
               
                /* Upper Protocol*/
                SENDIPv4HeaderPTR->ucUpperProtocol=ucUpperProtocol;
               
                /* Source IP address set:pucSourceIPAddr*/
                memcpy(SENDIPv4HeaderPTR->pucSourceIPAddr,pucHostIPAddr,4);
               
                /* Destination IP address set:pucDestIPAddr*/
                memcpy(SENDIPv4HeaderPTR->pucDestIPAddr,pucDestIP,4);
               
                /* Header checksum*/
                IPv4HeaderChecksumWrite(SENDIPv4HeaderPTR);
               
                /* Compute the length of the data to be transmitted*/
                ulTxLen=(unsigned long)usDatagramLen
                                                +(unsigned long)IPV4_HEADER_LEN
                                                +(unsigned long)ETH_HEADER_LEN;
                EthernetPacketPut(ETH_BASE,pucSendBuffer,(long)ulTxLen);
                ulTxLen=0;
                return 1;                                                                                                                                       
        }
}
 
 

回复

4

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
下面是初始化以太网控制器的代码:
void Ethernet_Init()
{
        // The variables to read the MAC address from the flash
        unsigned long ulUser0, ulUser1;               
        unsigned long i;
        // #ulIntStatus and ulEthernetStatus# are variables to record the Ethernet
        // information when ethernet control is starting.
        unsigned long ulIntStatus,ulEthernetStatus;

        // Reset Ethernet
        SysCtlPeripheralReset(SYSCTL_PERIPH_ETH);                              

        // Enable relative peripherals.
        SysCtlPeripheralEnable(SYSCTL_PERIPH_ETH);          // Enable NIC
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);        // Enable Ethernet LED(GPIO F)
        SysCtlPeripheralReset(SYSCTL_PERIPH_ETH);                        // Reset NIC
       
        // Enable Port F for Ethernet LEDs.
        //  LED0        Bit 3   Output
        //  LED1        Bit 2   Output
        GPIODirModeSet(        GPIO_PORTF_BASE,                                                         //
                                        (GPIO_PIN_2 | GPIO_PIN_3),                                                //
                                        GPIO_DIR_MODE_HW);                                                                                //

        // Port F Set
        GPIOPadConfigSet(GPIO_PORTF_BASE,
                                        (GPIO_PIN_2 | GPIO_PIN_3),
                                        GPIO_STRENGTH_2MA,
                                        GPIO_PIN_TYPE_STD);

        // Disable Ethernet. Ethernet interrupt should be disabled
        // when being configured.
        EthernetIntDisable(ETH_BASE, ETH_INT_ALL);                // Disable Interrupt
        ulIntStatus = EthernetIntStatus(ETH_BASE, false);
        EthernetIntClear(ETH_BASE, ulIntStatus);
        EthernetDisable(ETH_BASE);                                                                           // Disable Ethernet

        // The Function be called FIRST, BEFORE any other Eth-API
        EthernetInitExpClk(ETH_BASE,                               
                                        SysCtlClockGet());                                                                                // Ethernet clk = processor clk
        // Delay                               
  for(i=0;i<255;i++)
        {;}
       
        // After the EthernetInitExpClk is called, call this function
        // to configure the Ethernet peripheral.
        EthernetConfigSet(ETH_BASE,
                                        (ETH_CFG_TX_DPLXEN |                                                                   // Full duplex transmit mode
                                        ETH_CFG_TX_PADEN |                                                                                // Padding of transmit data to
                                                                                                                                                                                                // minimum size
                                        ETH_CFG_TX_CRCEN));                                                                        // Auto CRC generation

               
               
        /* Wait for the link to become active.*/
        ulEthernetStatus = EthernetPHYRead(ETH_BASE, PHY_MR1);
        while((ulEthernetStatus & 0x0004) == 0)
        {
                ulEthernetStatus = EthernetPHYRead(ETH_BASE, PHY_MR1);
        }

        /* Enable Ethernet peripheral after configurations are done.*/
        EthernetEnable(ETH_BASE);
       


        /* Set MAC Address
         The MAC address is stored in the Flash of the ARM.
         Read the flash and set the MAC address byte by byte.
        */
        /* Read the Flash        */
        FlashUserGet(&ulUser0, &ulUser1);
       
        /* Set where the MAC is stored in the buffer*/
        pucLocalMACAddr=(unsigned char*)pucSendBuffer+6;
        *(pucLocalMACAddr        +        0) = ((ulUser0 >>  0) & 0xff);
        *(pucLocalMACAddr        +        1) = ((ulUser0 >>  8) & 0xff);
        *(pucLocalMACAddr        +        2) = ((ulUser0 >> 16) & 0xff);
        *(pucLocalMACAddr        +        3) = ((ulUser1 >>  0) & 0xff);
        *(pucLocalMACAddr        +        4) = ((ulUser1 >>  8) & 0xff);
        *(pucLocalMACAddr        +        5) = ((ulUser1 >> 16) & 0xff);
       
        /* Destination MAC address is in the head of send buffer*/
        pucDestMACAddr=pucSendBuffer+0;

        /* Set MAC address*/
        EthernetMACAddrSet(ETH_BASE, pucLocalMACAddr);       
       
        /* Enable interrupt of Ethernet controller*/
        IntEnable(INT_ETH);

        /* The Ethernet IntPriority is low*/
        IntPrioritySet(INT_ETH, 0xFF);                                

        /* Enable Ethernet receiving interrupt*/
        EthernetIntEnable(ETH_BASE, ETH_INT_RX);
       
        /* Initialize the Receive Buffer*/
        pucReceiveBuffer[0]=0;
}
 
 
 

回复

1803

帖子

0

TA的资源

五彩晶圆(高级)

4
 

回复 楼主huangzhechen 的帖子

抓包软件能看到数据,说明下位机没问题.
应该是 MFC Winsock 的问题吧.
对上位机多做几次测试看看.
后续上位机,我打算用 QT .
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表