历史上的今天
今天是: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);
}
}
史海拾趣
|
如何去鉴别mobile不同手机及型号? 要现实功能: 我做了一个软件,想让该软件只能运行在一款手机上(比如:多普达s600),其他手机上安装使用时会提示,\"该软件只能在多普达S600上运行\".请问怎么实现这个功能? 也就是如何驱分不同型号的手机?… 查看全部问答> |
|
用在ADC上,一个通道即可,我是想这样,stm32在干别的事,DMA接收AD的数据,接收到一定的数量比如1K,stm32读回来做处理,然后dma继续接收,如有这个功能求个程序,谢谢 感觉应该有这个功能,好像不少ARM都有,折腾一下午没成功,adc用9M的时 ...… 查看全部问答> |
|
我在程序中定义了很多的结构体,现在我需要将这些结构体的成员放到一个u8 TxBuffer[]中,而且,根据不同的需要,放不同的结构体,然后通过串口发送出去。可是我遇到一个问题,如何将定义各不相同的结构体,放到这个发送缓存数组中去!!!! ...… 查看全部问答> |
|
我用汇骗学编PIC的程序,能通过编译,也能正常仿真,可就是在File Registers窗口中观察如(PROTD)的值时,发现PROTD的值不会随程序( MOVLW 0FFH, MOVWF PORTD )的运行而变化,是我的程序有问题还是我哪没设置 ...… 查看全部问答> |
|
各位大侠好:我现在用PIC单片机通过IIC总线读写一个EEPROM (24LC16), 读写程序如下: void Iic_EepromRd(BYTE chip,BYTE address,BYTE *p,BYTE num) { StartI2C();//启动总线 & ...… 查看全部问答> |
|
本帖最后由 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 编辑 这个岗位主要是干什么的?发展空间怎么样? 看到这么多好心人的回复,我先感谢了。现在正打算出去找工作,但是对于找工作我还是有点迷茫,不知道我能找到什么样的工作,或者说什么样适合我,我再说 ...… 查看全部问答> |




