OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2105|回复: 1

关于uip里面移植的UDP操作

[复制链接]

5

主题

27

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2020-5-30
在线时间
19 小时
发表于 2017-2-3 10:09:13 | 显示全部楼层 |阅读模式
本帖最后由 小哈哈狼 于 2017-2-3 10:09 编辑

这两天勉强实现了粗糙的UDP功能,我是用的MINI STM32开发板,好多东西没有弄明白,先自己总结着说说吧。

利用串口进行UDP通话

利用串口进行UDP通话

上图是 我用串口给开发板发送数据,然后开发板会把数据通过UDP发送给PC机,显示在网络配置软件上
                PC机通过UDP把数据发送给开发板,开发板会把数据通过串口显示在串口调试软件上


好下面说下本人怎么移植的吧
第一步是参考了论坛大神发布的UDP_DEMO.H 完全就是参考他的文件来做的
[mw_shl_code=c,true]#ifndef __UDP_DEMO_H__
#define __UDP_DEMO_H__

#include "uipopt.h"
#include "psock.h"
#include "sys.h"

extern u8 udp_data_buf[];
extern u8 udp_sta;
extern u16 udp_len;


//类似于TCP的发送结构体,要指向UIP_CONN
struct udp_demo_appstate
{
    u8 state;
        u8 *textptr;
        int textlen;
};

typedef struct udp_demo_appstate uip_udp_appstate_t;         
//上面那个是目前没有的结构体


#ifndef UIP_UDP_APPCALL
#define UIP_UDP_APPCALL udp_demo_appcall
#endif

#ifndef UIP_UDP_CONNS
#define UIP_UDP_CONNS 10
#endif

#ifndef UIP_CONF_BROADCAST
#define UIP_CONF_BROADCAST 1
#endif


void udp_init(void);                                 //udp初始化
void udp_demo_appcall(void);                         //udp 的APPCALL
//void udp_appcall(void);                                                    //UDP 的appcall
void udp_senddata(void);                             //udp发送数据

#endif
[/mw_shl_code]

这是.h文件 可以看到UDP所需要的函数实际上非常少,因为UDP连接是面向无连接的吗,所以不存在连接,断开连接这样的操作
只有 初始化、发送数据 简单粗暴
[mw_shl_code=c,true]#include "udp_demo.h"
#include "sys.h"
#include "uip.h"
#include <string.h>
#include <stdio.h>

/******************************/
/*****小白狼自己添加 UDP操作****/
/******************************/

struct uip_udp_conn *myudp_conn;                //udp端口连接

u8 udp_data_buf[200];       //发送数据缓存     不区分客户机还是服务器
u8 udp_sta;                 //客户端状态
//UDP不建立连接,只是把数据单纯的发送


//这是一个UDP客户端的APPCALL
//端口没有定
//参考tcp_client
void udp_demo_appcall(void)
{
   struct udp_demo_appstate *s = (struct udp_demo_appstate *)&uip_udp_conn->appstate;          //创建UDP数据包结构体
   if(uip_newdata())                                        //有新的UIP数据包到达
   {
      //暂时不考虑什么数据太长这样的情况
           strcpy((char*)udp_data_buf,uip_appdata);              //数据放入udp发送数据区域中
           printf("%s",udp_data_buf);
   }
   if(udp_sta&(1<<5))                                        //如果有数据需要发送
   {
   udp_senddata();
   udp_sta&=~(1<<5);                                          //清除标志位
   }
}




//udp初始化函数
void udp_init()
{
   uip_ipaddr_t ipaddr;
   uip_ipaddr(&ipaddr,192,168,1,17);                           //设置远程端口为192.168.1.17
   if(myudp_conn!=NULL)
    {
           uip_udp_remove(myudp_conn);                             //如果当前已经有连接,就删除当前连接
        }
        myudp_conn = uip_udp_new(&ipaddr,HTONS(1500));             //建立远程连接,端口是1500
        if(myudp_conn!=NULL)                                    
    {
           uip_udp_bind(myudp_conn,HTONS(2000));                   //绑定2000本地端口,完成2000->1500端口发送数据
        }       
}


//udp发送数据函数  这里对数据进行赋值到uipdata中的操作以及获取数据长度的操作,最后发送
void udp_senddata()
{
       
    struct udp_demo_appstate *s = (struct udp_demo_appstate *)&uip_udp_conn->appstate;          //创建UDP数据包结构体
        s->textptr = udp_data_buf;
        strcpy((char*)uip_appdata,(char *)s->textptr);              //将数据给UIP_APPDATA准备发送
        s->textlen = strlen((char *)s->textptr);                    //获取数据长度  
        //s->textptr:发送的数据包缓冲区指针
        //s->textlen:数据包的大小(单位字节)                  
        uip_udp_send(s->textlen);//发送一个UDP数据包         
}
[/mw_shl_code]

以上是 主要内容 UDP的状态标识只有 UDP_POLL  (8)   还有 UDP_NEWDATA    (2)  不用考虑到TCP那样的 很多状态
值得一提的部分就是
[mw_shl_code=applescript,true]uip_udp_send(s->textlen);//发送一个UDP数据包         [/mw_shl_code]

这里和uip_send不太一样 参数只有数据长度,实际上里面发送的数据就是UIP_APPDATA 所以发送数据操作只需要把数据放到UIP_APPDATA中就可以了
最后编译的时候要把UDP允许打开,位置在uip—conf.h里面设置为1
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
199
金钱
199
注册时间
2016-9-21
在线时间
50 小时
发表于 2017-7-18 17:42:19 | 显示全部楼层
照这样写一个文件,然然后放进工程,再吧udp打开就可以了吗?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-12-19 00:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表