偷得浮生半桶水(半日闲), 好记性不如抄下来(烂笔头). 信息爆炸的时代, 学习是一项持续的工作.
全部博文(1750)
分类: Android平台
2014-09-22 11:55:10
FreeRTOS中LWIP的UDP使用例子与注意事项
这段时间忙着FreeRTOS与LWIP协议的使用,一个项目要用到这个,要代替别人的产品使用,所以通信数据部分协议是一样的.
整个的代码包括LWIP的进程里面包括监听80端口的web服务端 NTP的对时服务 还有UDP的数据发送。
这里主要把我的UDP部分列出了,这个是LWIP中提供的标准函数
添加的UDP进程,同样在这添加NTP与web进程
sys_thread_new("UDP", UDPThread, (void *)NULL, UDP_THREAD_STACK_SIZE, UDP_THREAD_PRIORITY);
接下来就是在这个进程进行添加子程序,我这里是发送UDPData_Open这个数组
的值。
UINT8 UDPData_Open[6]
void UDPThread(void *pvParameters)
{
while(1)
{
UDPSever();
}
}
接下来就是UDPServer()添加相应的程序
void UDPSever(void)
{
pUdpPcb = udp_new(); //建立UDP控制块(pcb)
udp_bind(pUdpPcb,IP_ADDR_ANY, 1025);//绑定本地IP地址,端口
pPbuf = pbuf_alloc(PBUF_RAW,sizeof(UDPData_Open),PBUF_ROM); //问题可能出在这*****************************
pPbuf -> payload = (void *)UDPData_Open;
//把发送的数据首地址赋值给pbuf缓存中的payload
IP4_ADDR(&Ipaddr,192.168.1.190 ); //给ip地址结构体赋值
udp_sendto(pUdpPcb,pPbuf,&Ipaddr,5004); //向对应IP,端口发送字符信息
udp_disconnect(pUdpPcb); //断掉对应的链接
pbuf_free(pPbuf); //释放对应的pPbuf的空间
}
这个整个的工程中需要注意的有以下几点
Num1:UDP_THREAD_STACK_SIZE这个的堆栈空间问题,如果堆栈空间太少,会出现发送的数据是乱码,如果只是测试阶段可以设置大些,之后再进行优化。
Num2:pbuf_alloc(PBUF_RAW,sizeof(UDPData_Open),PBUF_ROM)这个的pPbuf的设置问题可以直接从网上找的到这几个数据的定义是什么意思。
Num3:UDP协议是面向无连接的,所以一般发送的IP是比较多的,这里需要在opt.h的IP缓冲对数量,ARP_TABLE_SIZE的这个参数,修改为你要发送的IP个数。
NUM4:我在整个过程中碰到一个很坑的问题,就是说我做的板子和电脑直连,ping的话一两天都不掉线,但是一接入路由,给板子定义的是固定IP,掩码,网关。连接路由之后,系统很快ping不通,这个好像是网络中的别的电脑的广播包的影响,需要过滤,要不然就是会慢慢的就ping不通了。
过滤用的是spf广播过滤(IP_SOF_BROADCAST_RECV)。这个地方我还得好好再研究一下。。。。。
你们如果使用的话,可以直接用我上面的过程。至于过滤需要该其他的驱动,和这里的UDP没有多大关系