RL-TCPnet功能测试
这里专门创建了一个app_tcpnet_lib.c文件用于RL-TCPnet功能的测试,这里是创建了一个UDP Socket。
#include "includes.h"
/*
*********************************************************************************************************
* 用于本文件的调试
*********************************************************************************************************
*/
#if 1
#define printf_debug printf
#else
#define printf_debug(...)
#endif
/*
*********************************************************************************************************
* 宏定义,远程服务器的IP和端口
*********************************************************************************************************
*/
/* 要访问的远程服务器IP和端口配置,也就是电脑端调试助手设置的IP和端口号 */
#define IP1 192
#define IP2 168
#define IP3 1
#define IP4 2
#define PORT_NUM 1001
/* 这个是本地端口 */
#define LocalPort_NUM 1024
/*
*********************************************************************************************************
* 变量
*********************************************************************************************************
*/
extern LOCALM localm[];
uint8_t udp_soc;
uint8_t DHCP_Status = __FALSE;
uint8_t CacheARP_Status = __FALSE;
uint8_t Rem_IP[4] = {IP1,IP2,IP3,IP4};
/*
*********************************************************************************************************
* 函 数 名: DCHP_ARP_Check
* 功能说明: 检测DHCP是否获取了IP地址以及UDP通信要访问的远程IP地址是否可以解析出对应的MAC。
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
void DCHP_ARP_Check(void)
{
if(DHCP_Status == __FALSE)
{
if(mem_test(localm[NETIF_ETH].IpAdr, 0, 4) == __FALSE)
{
DHCP_Status = __TRUE;
printf_debug("DHCP已经初始化成功,注意未使能DHCP也是返回成功的rn");
}
}
if(CacheARP_Status == __FALSE)
{
if(arp_cache_ip (Rem_IP, ARP_FIXED_IP) == __FALSE)
{
CacheARP_Status = __TRUE;
printf_debug("通过IP地址可以解析出MACrn");
}
}
}
/*
*********************************************************************************************************
* 函 数 名: tcp_callback
* 功能说明: TCP Socket的回调函数
* 形 参: socket UDP Socket类型
* remip 远程设备的IP地址
* remport 远程设备的端口号
* buf 远程设备发来的数据地址
* len 远程设备发来的数据长度,单位字节
* 返 回 值: 默认返回0即可,一般用不上
*********************************************************************************************************
*/
U16 udp_callback(U8 socket, U8 *remip, U16 remport, U8 *buf, U16 len)
{
char buffer[50];
U16 i;
/* 确保是udp_soc的回调 */
if (socket != udp_soc)
{
return (0);
}
/* 发消息的远程IP,打印IP和端口号 */
sprintf(buffer, "远程连接IP: %d.%d.%d.%d", remip[0], remip[1], remip[2], remip[3]);
printf_debug("%s port:%drn", buffer, remport);
/* 接收到的数据长度,单位字节 */
printf_debug("Data length = %drn", len);
/* 打印接收到的消息 */
for(i = 0; i < len; i++)
{
printf_debug("buf[%d] = %drn", i, buf[i]);
}
return (0);
}
/*
*********************************************************************************************************
* 函 数 名: TCPnetTest
* 功能说明: TCPnet应用
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
void TCPnetTest(void)
{
int32_t iCount;
uint8_t *sendbuf;
uint8_t res;
OS_RESULT xResult;
const uint16_t usMaxBlockTime = 2; /* 延迟周期 */
/* 获取一个UDP Socket */
udp_soc = udp_get_socket (0, UDP_OPT_SEND_CS | UDP_OPT_CHK_CS, udp_callback);
if (udp_soc != 0)
{
/* 打开UDP端口号 */
udp_open (udp_soc, LocalPort_NUM);
}
while (1)
{
/* RL-TCPnet处理函数 */
main_TcpNet();
/* 检测DHCP是否获取了IP地址以及UDP通信要访问的远程IP地址是否可以解析出对应的MAC */
DCHP_ARP_Check();
/* 按键消息的处理 */
if(os_evt_wait_or(0xFFFF, usMaxBlockTime) == OS_R_EVT)
{
xResult = os_evt_get ();
switch (xResult)
{
/* 接收到K1键按下消息,给远程UDP设备发送8字节数据 */
case KEY1_BIT0:
/* 用于设置发送次数 */
iCount = 1;
do
{
main_TcpNet();
/* 申请8字节的空间 */
sendbuf = udp_get_buf (8);
if(sendbuf != NULL)
{
/* 初始化8个字节变量 */
sendbuf[0] = '1';
sendbuf[1] = '2';
sendbuf[2] = '3';
sendbuf[3] = '4';
sendbuf[4] = '5';
sendbuf[5] = '6';
sendbuf[6] = '7';
sendbuf[7] = '8';
res = udp_send (udp_soc, Rem_IP, PORT_NUM, sendbuf, 8);
/* 保证发送成功了发送次数才可以减一,这里发送成功并不保证远程设备接受成功 */
if(res == __TRUE )
{
iCount--;
}
}
/*
由于UDP没有重发,应答,流控制等机制,这里简单的做个延迟,
保证远程设备可以接受到数据
*/
os_dly_wait(10);
}while(iCount > 0);
break;
/* 接收到K2键按下消息,给远程UDP设备发送10240字节数据 */
case KEY2_BIT1:
/* 用于设置发送次数,每次1024字节 */
iCount = 10;
do
{
main_TcpNet();
/* 申请1024字节的空间 */
sendbuf = udp_get_buf (1024);
if(sendbuf != NULL)
{
/* 将申请到的1024字节全部清零 */
memset(sendbuf, 0, 1024);
/* 这里仅初始化了每次所发送数据包的前8个字节 */
sendbuf[0] = 'a';
sendbuf[1] = 'b';
sendbuf[2] = 'c';
sendbuf[3] = 'd';
sendbuf[4] = 'e';
sendbuf[5] = 'f';
sendbuf[6] = 'g';
sendbuf[7] = 'h';
res = udp_send (udp_soc, Rem_IP, PORT_NUM, sendbuf, 1024);
/* 保证发送成功了发送次数才可以减一,这里发送成功并不保证远程设备接受成功 */
if(res == __TRUE )
{
iCount--;
}
}
/*
由于UDP没有重发,应答,流控制等机制,这里简单的做个延迟,
保证远程设备可以接受到数据
*/
os_dly_wait(10);
}while(iCount > 0);
break;
/* 接收到K3键按下消息,给远程UDP设备发送2MB数据 */
case KEY3_BIT2:
/* 用于设置发送次数,每次发送1024字节 */
iCount = 2048;
do
{
main_TcpNet();
/* 申请1024字节的空间 */
sendbuf = udp_get_buf (1024);
if(sendbuf != NULL)
{
/* 将申请到的1024字节全部清零 */
memset(sendbuf, 0, 1024);
/* 这里仅初始化了每次所发送数据包的前8个字节 */
sendbuf[0] = 'a';
sendbuf[1] = 'b';
sendbuf[2] = 'c';
sendbuf[3] = 'd';
sendbuf[4] = 'e';
sendbuf[5] = 'f';
sendbuf[6] = 'g';
sendbuf[7] = 'h';
res = udp_send (udp_soc, Rem_IP, PORT_NUM, sendbuf, 1024);
/* 保证发送成功了发送次数才可以减一,这里发送成功并不保证远程设备接受成功 */
if(res == __TRUE )
{
iCount--;
}
}
/*
由于UDP没有重发,应答,流控制等机制,这里简单的做个延迟,
保证远程设备可以接受到数据
*/
os_dly_wait(15);
}while(iCount > 0);
break;
/* 其他的键值不处理 */
default:
break;
}
}
}
} |