历史上的今天
返回首页

历史上的今天

今天是:2025年04月28日(星期一)

正在发生

2018年04月28日 | 调试STM32 UDP功能的一些心得

2018-04-28 来源:eefocus

最近在研究STM32F107VC,由于某个任务需要用到UDP,就准备利用开发板结合LWip来实现该功能,但是在调试UDP的过程中,遇到了一些问题,在网上查找了半天,终于将基本的功能调通了。准备将过程记录一下,以免日后忘记了。 

硬件连接和Lwip的移植就不说了,请参照开发板给的例程。(我的原则是,能直接用的东西坚决不再去研究)微雪的板子给的例程是从官方的程序改的,看起来十分复杂,而且UDP功能介绍的十分模糊,参考性不强。于是网上找例程自己写代码。开始的时候,参考了网上的一些文章,第一次调试中关于UDP的初始化和发送部分是这样的:


unsigned char const UDPArr[6] = {"hello!"}; 

int main(void)

  struct udp_pcb *Udppcb1;

  struct ip_addr ipaddr1;  

  struct pbuf *p ;

  /* Setup STM32 system (clocks, Ethernet, GPIO, NVIC) and STM3210C-EVAL resources */   

  System_Setup();               

  /* Initilaize the LwIP satck */   LwIP_Init(); 


  //测试UDP客户端发送数据

  p = pbuf_alloc( PBUF_RAW , sizeof(UDPArr) , PBUF_RAM );

  p->payload = ( void *)(UDPArr);

  IP4_ADDR(&ipaddr1 , 192,168,1,11); 

  udppcb1 = udp_new( );  

  udp_bind( Udppcb1 , IP_ADDR_ANY , 161 );

  udp_connect( Udppcb1 , &ipaddr1 , 161 ) ;

  udp_send( Udppcb1 , p );        

  /* Infinite loop */       

  while (1)

  {     

    /* Periodic tasks */ 

    System_Periodic_Handle(); 

  }

}


编译通过,但是利用网络调试工具却怎么也抓不到发送的数据,这函数的返回值也没有发现问题。 

网上找的Udp代码无法实现发送的功能,我后来又参考了一些别的文章,将代码改成了这样的形式,终于将UDP的发送与接收实现了。


int main(void)

{

  const u8 UDPArr[6] = {"Hello!"};

  struct udp_pcb *Udppcb1;

  struct ip_addr ipaddr1;

  struct pbuf *p;


  /* Setup STM32 system (clocks, Ethernet, GPIO, NVIC) and STM3210C-EVAL resources */

    System_Setup();


  /* Initilaize the LwIP satck */

    LwIP_Init();


    //HelloWorld_init();

    //httpd_init();

    //tftpd_init();


    p = pbuf_alloc(PBUF_TRANSPORT,sizeof(UDPArr),PBUF_ROM);

    p->payload = (void*)(UDPArr);

    IP4_ADDR(&ipaddr1,192,168,0,28);

    Udppcb1 = udp_new();

    udp_bind(Udppcb1,IP_ADDR_ANY,161);

    udp_recv(Udppcb1,UDP_Receive,NULL);

    udp_connect(Udppcb1,&ipaddr1,161);

    udp_send(Udppcb1,p);

    udp_disconnect(Udppcb1);

    pbuf_free(p);

    while (1)

    {    

    /* Periodic tasks */

      System_Periodic_Handle();


    }

}


最开始没调通的时候,pbuf_alloc的第一个参数是PBUF_RAW,通信无法实现,改成PBUF_TRANSORT就可以了。 

接收的函数如下:


void UDP_Receive(void *arg,struct udp_pcb *upcb,struct pbuf* p,struct ip_addr *addr,u16_t port)

{

    struct ip_addr dAddr = *addr;

    u16 length;

    u8 buf[255];


    if(p!=NULL)

    {

        //udp_sendto(upcb,p,&dAddr,port);

        //pbuf_free(p);

        Length =p->len;  //这里取到的Length即为收到的数据长度

        memcpy(buf,p->payload,length);      //将收到的报文拷贝至buf

        .....

        pbuf_free(p);


    }

}


推荐阅读

史海拾趣

Captive Fastener公司的发展小趣事

随着环保意识的日益增强,Captive Fastener公司积极响应国家环保政策,推动生产方式的绿色转型。公司引进先进的环保生产设备和技术,减少生产过程中的污染排放。同时,公司还研发出可回收再利用的紧固件产品,为电子行业的可持续发展做出了贡献。

南晶电子(DGNJDZ)公司的发展小趣事

随着人工智能、物联网等技术的快速发展,南晶电子意识到传统半导体器件已无法满足市场需求。公司决定进行转型升级,向智能穿戴设备、智能家居、汽车电子等领域拓展。通过引进先进技术和设备,加强研发团队建设,南晶电子成功推出了一系列智能化产品,实现了从传统制造业向智能制造的转型。

Altus Technology Inc公司的发展小趣事

Altus Technology Inc自成立以来,始终将技术创新作为公司发展的核心驱动力。在早期,公司研发团队通过不懈努力,成功开发出了一款具有革命性的芯片,这款芯片在性能和功耗上均优于当时的同类产品。凭借这一技术突破,Altus在市场上迅速获得了一席之地,并吸引了大量合作伙伴和投资人的关注。随着技术的不断迭代和升级,Altus逐渐在电子行业中树立了技术领先的形象,并持续推出了一系列创新产品,巩固了市场地位。

DB Lectro Inc公司的发展小趣事

随着公司业务的不断拓展和市场竞争的加剧,DB Lectro Inc意识到知识产权保护的重要性。公司加强了知识产权的申请和保护工作,成功申请了一系列技术专利。同时,公司还积极参与知识产权维权行动,维护了自身的合法权益和公平竞争的市场环境。

Dfx公司的发展小趣事

某半导体企业在生产过程中面临着生产效率低下、成本过高的问题。为了提高生产效率并降低成本,该企业引入了DFX的设计理念,对生产线进行了全面优化。通过改进设备布局、优化工艺流程和采用自动化生产技术等手段,该企业成功提高了生产效率并降低了成本,增强了市场竞争力。

Achronix Semiconductor Corporation公司的发展小趣事

某半导体企业在生产过程中面临着生产效率低下、成本过高的问题。为了提高生产效率并降低成本,该企业引入了DFX的设计理念,对生产线进行了全面优化。通过改进设备布局、优化工艺流程和采用自动化生产技术等手段,该企业成功提高了生产效率并降低了成本,增强了市场竞争力。

问答坊 | AI 解惑

如何去鉴别mobile不同手机及型号?

如何去鉴别mobile不同手机及型号? 要现实功能: 我做了一个软件,想让该软件只能运行在一款手机上(比如:多普达s600),其他手机上安装使用时会提示,\"该软件只能在多普达S600上运行\".请问怎么实现这个功能? 也就是如何驱分不同型号的手机?…

查看全部问答>

STM32的DMA有没有这个功能?

用在ADC上,一个通道即可,我是想这样,stm32在干别的事,DMA接收AD的数据,接收到一定的数量比如1K,stm32读回来做处理,然后dma继续接收,如有这个功能求个程序,谢谢 感觉应该有这个功能,好像不少ARM都有,折腾一下午没成功,adc用9M的时 ...…

查看全部问答>

如何将一个结构体放到(u8)数组中

我在程序中定义了很多的结构体,现在我需要将这些结构体的成员放到一个u8 TxBuffer[]中,而且,根据不同的需要,放不同的结构体,然后通过串口发送出去。可是我遇到一个问题,如何将定义各不相同的结构体,放到这个发送缓存数组中去!!!! ...…

查看全部问答>

PIC单片机仿真时遇上的怪问题

我用汇骗学编PIC的程序,能通过编译,也能正常仿真,可就是在File Registers窗口中观察如(PROTD)的值时,发现PROTD的值不会随程序( MOVLW 0FFH,     MOVWF   PORTD )的运行而变化,是我的程序有问题还是我哪没设置 ...…

查看全部问答>

PIC单片机写24LC16的问题

各位大侠好:我现在用PIC单片机通过IIC总线读写一个EEPROM (24LC16), 读写程序如下: void Iic_EepromRd(BYTE chip,BYTE address,BYTE *p,BYTE num) {               StartI2C();//启动总线   & ...…

查看全部问答>

msp430g2553的I/O口问题

msp430g2553的I/O口设为高电平输出,有时实测出来只有1.3V,有时有3.5V…

查看全部问答>

【SensorTag】熟悉SensorTag硬件

本帖最后由 southwolf1813 于 2013-12-30 17:33 编辑 必须承认 TI的WIKI是个无穷的宝库…… 要熟悉SensorTag硬件 首先得找到它的原理图。可以用 SensorTag Schematic 作为关键词搜索, 在TI WIKI里可以找到。 http://processors.wiki.ti.com/in ...…

查看全部问答>

华为资料网上收集集合共享

replyreload += \',\' + 1781499;相信大家多多少少在网上看到或下载到各式各样华为的资料,现在经收集,有一系列华为资料现在与大家分享,希望大家能喜欢。这些资料在网上是都能收集到的,现在做一个集合,方便大家学习。希望大家回帖,故做了回复 ...…

查看全部问答>

手机硬件测试这个岗位怎么样?

本帖最后由 xiongpb 于 2015-10-10 18:42 编辑 这个岗位主要是干什么的?发展空间怎么样? 看到这么多好心人的回复,我先感谢了。现在正打算出去找工作,但是对于找工作我还是有点迷茫,不知道我能找到什么样的工作,或者说什么样适合我,我再说 ...…

查看全部问答>