TI中文支持网
TI专业的中文技术问题搜集分享网站

C6678 网口通信动态更改IP地址

C6678   SYSBIOS   NDK组件

1,我参照TI提供的网口通信例程更改的UDP网口通信。现在需要增加动态更改IP的功能。

   a:PC机通过网口下传要更改的本机IP地址A和目的IP地址B,即6678的IP地址更改为A,目的IP地址更改为B。

   b:更改完成即刻可用。

2,以下是我的代码,也请各位帮我看看是否有不对的地方,谢谢

Void NDKTask(UArg a0, UArg a1)
{
int rc;
HANDLE hCfg;
QMSS_CFG_T qmss_cfg;
CPPI_CFG_T cppi_cfg;

/* 初始化必要的组件:
* (1) QMSS
* (2) CPPI
* (3) Packet Accelerator
*/
// 初始化 QMSS
if (platform_get_coreid() == 0)
{
qmss_cfg.master_core = 1;
}
else
{
qmss_cfg.master_core = 0;
}
qmss_cfg.max_num_desc = MAX_NUM_DESC;
qmss_cfg.desc_size = MAX_DESC_SIZE;
qmss_cfg.mem_region = Qmss_MemRegion_MEMORY_REGION0;
if (res_mgr_init_qmss (&qmss_cfg) != 0)
{
platform_write ("Failed to initialize the QMSS subsystem \n");
goto main_exit;
}
else
{
platform_write ("QMSS successfully initialized \n");
}

// 初始化 CPPI
if (platform_get_coreid() == 0)
{
cppi_cfg.master_core = 1;
}
else
{
cppi_cfg.master_core = 0;
}
cppi_cfg.dma_num = Cppi_CpDma_PASS_CPDMA;
cppi_cfg.num_tx_queues = NUM_PA_TX_QUEUES;
cppi_cfg.num_rx_channels = NUM_PA_RX_CHANNELS;
if (res_mgr_init_cppi (&cppi_cfg) != 0)
{
platform_write ("Failed to initialize CPPI subsystem \n");
goto main_exit;
}
else
{
platform_write ("CPPI successfully initialized \n");
}

// 初始化 PA
if (res_mgr_init_pass()!= 0) {
platform_write ("Failed to initialize the Packet Accelerator \n");
goto main_exit;
}
else
{
platform_write ("PA successfully initialized \n");
}

rc = NC_SystemOpen( NC_PRIORITY_LOW, NC_OPMODE_INTERRUPT );
if( rc )
{
platform_write("NC_SystemOpen Failed (%d)\n",rc);
for(;;);
}

hCfg = CfgNew();
if( !hCfg )
{
platform_write("Unable to create configuration\n");
goto main_exit;
}

if( strlen( DomainName ) >= CFG_DOMAIN_MAX ||
strlen( HostName ) >= CFG_HOSTNAME_MAX )
{
printf("Names too long\n");
goto main_exit;
}

CfgAddEntry( hCfg, CFGTAG_SYSINFO, CFGITEM_DHCP_HOSTNAME, 0,
strlen(HostName), (UINT8 *)HostName, 0 );

// 如果指定 IP 地址,手动配置 IP 和 网关
if(1)
{
CI_IPNET NA;
CI_ROUTE RT;
IPN IPTmp;

// 设置IP 地址
bzero( &NA, sizeof(NA) );
NA.IPAddr = inet_addr(LocalIPAddr);
NA.IPMask = inet_addr(LocalIPMask);
strcpy( NA.Domain, DomainName );
NA.NetType = 0;

// 添加地址到接口
CfgAddEntry( hCfg, CFGTAG_IPNET, 1, 0,
sizeof(CI_IPNET), (UINT8 *)&NA, 0 );

// 添加默认网关
bzero( &RT, sizeof(RT) );
RT.IPDestAddr = 0;
RT.IPDestMask = 0;
RT.IPGateAddr = inet_addr(GatewayIP);

// 添加网关路由
CfgAddEntry( hCfg, CFGTAG_ROUTE, 0, 0,
sizeof(CI_ROUTE), (UINT8 *)&RT, 0 );

// 如果指定 DNS,则手动添加 DNS 服务
IPTmp = inet_addr(DNSServer);
if( IPTmp )
CfgAddEntry( hCfg, CFGTAG_SYSINFO, CFGITEM_DHCP_DOMAINNAMESERVER,
0, sizeof(IPTmp), (UINT8 *)&IPTmp, 0 );
}
// 通过 DHCP 自动分配 IP 和 网关
else
{
CI_SERVICE_DHCPC dhcpc;

// 开启 DHCP 服务
bzero( &dhcpc, sizeof(dhcpc) );
dhcpc.cisargs.Mode = CIS_FLG_IFIDXVALID;
dhcpc.cisargs.IfIdx = 1;
dhcpc.cisargs.pCbSrv = &ServiceReport;
CfgAddEntry( hCfg, CFGTAG_SERVICE, CFGITEM_SERVICE_DHCPCLIENT, 0,
sizeof(dhcpc), (UINT8 *)&dhcpc, 0 );
}

// 不查看低于警告级别的调试信息
rc = DBG_WARN;
CfgAddEntry( hCfg, CFGTAG_OS, CFGITEM_OS_DBGPRINTLEVEL,
CFG_ADDMODE_UNIQUE, sizeof(uint), (UINT8 *)&rc, 0 );

// UDP 接受限制
rc = 8192;
CfgAddEntry( hCfg, CFGTAG_IP, CFGITEM_IP_SOCKUDPRXLIMIT,
CFG_ADDMODE_UNIQUE, sizeof(uint), (UINT8 *)&rc, 0 );

// 使用这些配置启动系统
do
{
rc = NC_NetStart( hCfg, NetworkOpen, NetworkClose, NetworkIPAddr );
} while( rc > 0 );

// 释放配置句柄
CfgFree( hCfg );

main_exit:
NC_SystemClose();
}

void fdshareTest(void)
{
SOCKET UdpSocket;
fd_set xbits;
Uint32 rcvBufSize = 0x1000;
struct sockaddr_in sin1;

fdOpenSession( TaskSelf() );

UdpSocket = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
if(UdpSocket==INVALID_SOCKET)
{
printf("socket created failure!\n");
return;
}
//配置要绑定IP地址和端口号 bzero(&sin1,sizeof(struct sockaddr_in)); // 置字节字符串的前N个字符为0
sin1.sin_addr.s_addr = htonl(INADDR_ANY);// INADDR_ANY=0.0.0.0即任意地址
sin1.sin_family = AF_INET;// IPV4;
sin1.sin_len =sizeof(sin1);
sin1.sin_port = htons(3003);
sin1.sin_addr.s_addr=inet_addr(aaa);

setsockopt( UdpSocket, SOL_SOCKET, SO_RCVBUF, &rcvBufSize, sizeof(UINT32) );// 配置UdpSocket缓存大小

if ( bind( UdpSocket, (PSA) &sin1, sizeof(sin1) ) < 0 )//把socket绑定到本地网卡
{
printf("udp_recv bind failure!\n");
return;
}

if( !TaskCreate( udpShareRX, "Receiver", OS_TASKPRINORM, 0x1000,
(UINT32)TaskSelf(), (UINT32)UdpSocket, 0 ) )
goto leave;
System_printf("completed RX task initial\n");
System_flush();

TaskCreate( udpShareTX, "Sender", OS_TASKPRINORM, 0x14000,
(UINT32)TaskSelf(), (UINT32)UdpSocket, 0 );

System_printf("completed TX task initial\n");
System_flush();

FD_ZERO(&xbits);
FD_SET(UdpSocket, &xbits);
fdSelect( (int)UdpSocket, 0, 0, &xbits, 0 );

leave:
if( UdpSocket != INVALID_SOCKET )
{
System_printf("UdpSocket == INVALID_SOCKET\n");
fdClose( UdpSocket );
}
}

void udpShareRX(HANDLE hTaskParent, SOCKET s, int *pFlag)
{
int tmp;
Uint8 i;
int rcvDataLen = 0;
HANDLE hBuffer;
struct sockaddr_in sinDst; // 发送者的地址

Uint16 *Rx_Data;

fdOpenSession( TaskSelf() );
fdShare(s);
System_printf("RX Child task spawned successfully\n");

tmp = sizeof(sinDst);
for(;;)
{
rcvDataLen = (int)recvncfrom(s, (void **)&Rx_Data, 0, (PSA)&sinDst, &tmp, &hBuffer);// 接收到终端地址为sinDst的数据包pBuf

if(rcvDataLen > 0)
{
//处理接收到的数据
}
recvncfree(hBuffer);// 释放接收数据缓存的句柄
}
}

void udpShareTX( HANDLE hTaskParent, SOCKET s )
{
int i,cnt,cnt1,cnt2;
_sockaddr_in remoteAddr;

fdOpenSession( TaskSelf()); //打开任务
fdShare(s);

System_printf("TX Child task spawned successfully\n");

//设置目的地址端口属性 目的地址
bzero(&remoteAddr,sizeof(struct sockaddr_in));
remoteAddr.sin_addr.s_addr = htonl(INADDR_ANY);
remoteAddr.sin_family = AF_INET;
remoteAddr.sin_len =sizeof(remoteAddr);
remoteAddr.sin_port = htons(3004);//2000);
remoteAddr.sin_addr.s_addr=inet_addr(DesIPAddr);//

System_printf("udpTx entry cycle\n");
while(1)
{
Semaphore_pend(udpTxProcessSem,BIOS_WAIT_FOREVER);
//————————————————————————————–//

sendto(s, Tx_buffer, 1056, 0, (PSA)&remoteAddr, sizeof(remoteAddr));

//————————————————————————————–//
}
}

Shine:

请问代码执行下来具体碰到什么问题?

赞(0)
未经允许不得转载:TI中文支持网 » C6678 网口通信动态更改IP地址
分享到: 更多 (0)