新手上路
- 积分
- 48
- 金钱
- 48
- 注册时间
- 2020-5-30
- 在线时间
- 19 小时
|
本帖最后由 小哈哈狼 于 2017-2-3 10:09 编辑
这两天勉强实现了粗糙的UDP功能,我是用的MINI STM32开发板,好多东西没有弄明白,先自己总结着说说吧。
利用串口进行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
|
|