使用?CH579單獨(dú)實(shí)現(xiàn)TCP服務(wù)器通信? 或 UDP服務(wù)器通信都正常
在CH579上同時(shí)使用TCP服務(wù)器和UDP服務(wù)器的時(shí)候,TCP服務(wù)器能正常工作,UDP服務(wù)器收發(fā)成功1次后,就再也無法通信了? CH579的網(wǎng)絡(luò)協(xié)議棧不能同時(shí)支持 TCP和UDP服務(wù)器嗎?
void CH57xNET_CreatTcpSocket(void)
{
? ?UINT8 i;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ?SOCK_INF TmpSocketInf;? ?
? ?/* 創(chuàng)建臨時(shí)socket變量 */
? ?printf("Tcp port:%d\r\n", CARD_CFG_TCP_PORT);
? ?memset((void *)&TmpSocketInf,0,sizeof(SOCK_INF));? ? ? ? ? ? ? ? ? ? ? ? ? ? /* 庫內(nèi)部會(huì)將此變量復(fù)制,所以最好將臨時(shí)變量先全部清零 */
? ?TmpSocketInf.SourPort = CARD_CFG_TCP_PORT;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* 設(shè)置源端口 */
? ?TmpSocketInf.ProtoType = PROTO_TYPE_TCP;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* 設(shè)置socekt類型 */
? ?TmpSocketInf.RecvStartPoint = (UINT32)SocketRecvBuf;? ? ? ? ? ? ? ? ? ? ? ? ?/* 設(shè)置接收緩沖區(qū)的接收緩沖區(qū) */
? ?TmpSocketInf.RecvBufLen = RECE_BUF_LEN ;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* 設(shè)置接收緩沖區(qū)的接收長度 */
? ?i = CH57xNET_SocketCreat(&gSerSocketId,&TmpSocketInf);? ? ? ? ? ? ? ? ? ? ? ? ? ?/* 創(chuàng)建socket,將返回的socket索引保存在SocketId中 */
? ?mStopIfError(i);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* 檢查錯(cuò)誤 */
#ifdef? KEEPLIVE_ENABLE
? ?CH57xNET_SocketSetKeepLive(gSerSocketId, 1 );? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* 開啟socket的KEEPLIVE功能(V06版本支持) */
#endif
? ?i = CH57xNET_SocketListen(gSerSocketId);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* TCP連接 */
? ?mStopIfError(i);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* 檢查錯(cuò)誤 */
? ?i = CH57xNET_SetSocketTTL(gSerSocketId,128 );
? ?mStopIfError(i);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* 檢查錯(cuò)誤 */
}
void CH57xNET_CreatUdpSocket(void)
{
? ?UINT8 i;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ?SOCK_INF TmpSocketInf;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* 創(chuàng)建臨時(shí)socket變量 */
? ?
? ?//創(chuàng)建UDP socket目的IP和端口號任意設(shè)定
? ?UINT8 DESIP[4]? ?= {255,255,255,255};??
? ?memset((void *)&TmpSocketInf,0,sizeof(SOCK_INF));? ? ? ? ? ? ? ? ? ? ? ? ? ? /* 庫內(nèi)部會(huì)將此變量復(fù)制,所以最好將臨時(shí)變量先全部清零 */
? ?memcpy((void *)TmpSocketInf.IPAddr,DESIP,4);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* 設(shè)置目的IP地址 */
? ?TmpSocketInf.DesPort = 2000;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* 設(shè)置目的端口 */
? ?TmpSocketInf.SourPort = UDP_LOCAL_DEFAULT_PORT;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* 設(shè)置源端口 */
? ?TmpSocketInf.ProtoType = PROTO_TYPE_UDP;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* 設(shè)置socekt類型 */
? ?TmpSocketInf.AppCallBack = CH57xNET_UdpServerRecv;? ? ? ? ? ? ? ? ? ? ? ? ? ?/* 接收回調(diào)函數(shù) */
? ?TmpSocketInf.RecvStartPoint = (UINT32)SocketRecvBuf[0];? ? ? ? ? ? ? ? ? ? ? ? ?/* 設(shè)置接收緩沖區(qū)的接收緩沖區(qū) */
? ?TmpSocketInf.RecvBufLen = RECE_BUF_LEN ;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* 設(shè)置接收緩沖區(qū)的接收長度 */
? ?i = CH57xNET_SocketCreat(&gUdpSocketId,&TmpSocketInf);? ? ? ? ? ? ? ? ? ? ? ? ? ?/* 創(chuàng)建socket,將返回的socket索引保存在SocketId中 */
? ?mStopIfError(i);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* 檢查錯(cuò)誤 */
}
void Ch579EthInit(void)
{
UINT8 iret = 0;
UINT8 myIpAddr[4]={0};
UINT8 myGwIpAddr[4]={0};
UINT8 myGwIpMask[4]={0};
printf("IP_ADDR:%x\r\n", CARD_CFG_ETH_IP);
//printf("MASK:%x\r\n", CARD_CFG_ETH_MASK);
myIpAddr[0] = (CARD_CFG_ETH_IP>>24)&0xff;
myIpAddr[1] = (CARD_CFG_ETH_IP>>16)&0xff;
myIpAddr[2] = (CARD_CFG_ETH_IP>>8)&0xff;
myIpAddr[3] = (CARD_CFG_ETH_IP>>0)&0xff;
myGwIpAddr[0] = (CARD_CFG_ETH_GATE>>24)&0xff;
myGwIpAddr[1] = (CARD_CFG_ETH_GATE>>16)&0xff;
myGwIpAddr[2] = (CARD_CFG_ETH_GATE>>8)&0xff;
myGwIpAddr[3] = (CARD_CFG_ETH_GATE>>0)&0xff;
myGwIpMask[0] = (CARD_CFG_ETH_MASK>>24)&0xff;
myGwIpMask[1] = (CARD_CFG_ETH_MASK>>16)&0xff;
myGwIpMask[2] = (CARD_CFG_ETH_MASK>>8)&0xff;
myGwIpMask[3] = (CARD_CFG_ETH_MASK>>0)&0xff;
GetMacAddr(MACAddr);
GetMacAddr(CARD_CFG_ETH_MAC);
? ?
//ShowDataHex((u8 *)&myIpAddr, 4);
iret = CH57xNET_LibInit((u8 *)myIpAddr,(u8 *)&myGwIpAddr,(u8 *)&myGwIpMask,CARD_CFG_ETH_MAC);?
mStopIfError(iret);??
NVIC_EnableIRQ(ETH_IRQn);
iret = 0;
while ( CH57xInf.PHYStat < 2 )?
{
DelayMs(50);
iret++;
if(iret > 200)? //等待10秒鐘超時(shí)
{
break;
}
}
? ? ? //同時(shí)創(chuàng)建TCP服務(wù)器和UDP服務(wù)器時(shí),UDP接收發(fā)送1次后,再也無法接收數(shù)據(jù)???????
//創(chuàng)建工作端口TCP SOCKET
? ? ? ?//CH57xNET_CreatTcpSocket();??
//創(chuàng)建 30000 固定端口TCP SOCKET
//CH57xNET_CreatTcpSocket3W();
//創(chuàng)建UDP socket
CH57xNET_CreatUdpSocket();
}